1.什么是SOA架构
SOA是Service-Oriented Architecture的首字母简称,它是一种支持面向服务的架构样式。从服务、基于服务开发和服务的结果来看,面向服务是一种思考方式。其实SOA架构更多应用于互联网项目开发。
为什么互联网项目会采用SOA架构呢?随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,迫切需一个治理系统确保架构有条不紊的演进。

2.Dubbox简介

Dubbo 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
Dubbox 致力于提供高性能和透明化的RPC[RPC是远程过程调用(Remote Procedure Call)的缩写形式]远程服务调用方案,以及SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。
Dubbo是一个基于RPC的分布式服务框架【只有在分布式】
Dubbo运行结构图

节点角色说明:
 Provider: 暴露服务的服务提供方。
 Consumer: 调用远程服务的服务消费方。
 Registry: 服务注册与发现的注册中心。
 Monitor: 统计服务的调用次调和调用时间的监控中心。
 Container: 服务运行容器。
调用关系说明:
 0. 服务容器负责启动,加载,运行服务提供者。
 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
3.Zookeeper 介绍
官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbox 服务的注册中心,工业强度较高,可用于生产环境。
4.Zookeeper 在Linux系统的安装
安装步骤:
第1步:安装 Linux(此步省略)[因为我们使用的windows系统,所以我们只能把linux安装在虚拟机中] 安装虚拟机和在虚拟机中安装linux系统请参考linux课件
【设置虚拟机网络连接方式为仅主机。】
第2步:下载zookeeper安装包
Apache Download Mirrors
第3步:通过SecureCRT工具将在windows系统中下载好的zookeeper安装包上传到 linux 系统。
第4步:解压缩zookeepe压缩包
tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz
第5步:进入 zookeeper的解压目录,创建 data文件夹。
第6步:修改conf目录中的zoo_sample.cfg文件的名称,修改成zoo.cfg
第7步:打开zoo.cfg , 修改 data 属性
修改 data 属性:dataDir=/home/wxrj/apache-zookeeper-3.6.2-bin/data
第8步:进入bin目录,启动zookeeper服务输入命令
进入apache-zookeeper-3.6.2-bin目录,启动服务输入命令
./zKServer.sh start
输出以下内容表示启动成功

第9步:进入bin目录,关闭zookeeper服务输入命令
./zKServer.sh stop
输出以下提示信息

5.Dubbo快速入门
实现步骤:
(1)创建服务提供者Provider模块
(2)创建服务消费者Consumer模块
(3)在服务提供者模块编写UserServiceImpl提供服务
(4)在服务消费者中的UserController远程调用UserServiceImpl提供的服务
(5)分别启动两个服务,测试
provide模块
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.weiwei.dubbodemo</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider</name>
    <description>dubbo-provider</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.8.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.4.3</version>
            </plugin>
        </plugins>
    </build>
</project>
UserService接口
public interface UserService {
String getString();
}
UserServiceImpl
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService{
@Override
public String getString() {
return "张三";
}
}
application.properties
spring.dubbo.application.name=dubboprovider
spring.dubbo.registry.address=zookeeper://192.168.25.128:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.weiwei.dubbodemo.dubboprovider.service
consumer模块

pom.xml同provide模块
controller控制类
package com.weiwei.dubbodemo.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.weiwei.dubbodemo.dubboprovider.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference
private UserService userService;
@RequestMapping("/user.do")
public String getStr(){
return userService.getString();
}
}
需要把provider模块的接口复制过来
application.properties
##避免和 server 工程端口冲突
server.port=8081
## Dubbo 服务消费者配置
spring.dubbo.application.name=dubboconsumer
#注册中心地址 ip查看虚拟机的ip
spring.dubbo.registry.address=zookeeper://192.168.25.128:2181
#声明需要暴露的服务接口
spring.dubbo.scan=com.weiwei.dubbodemo.dubboconsumer.controller

异常:java.net.ConnectException: Connection timed out: no further information
Zookeeper注册中心连接超时
原因:可能是注册中心所在的计算机【Linux ContOS7】的防火墙未关闭。
解决方法:关闭防火墙
centOS7 查看防火墙状态
一、防火墙的开启、关闭、禁用命令
(1)设置开机启用防火墙:systemctl enable firewalld.service
(2)设置开机禁用防火墙:systemctl disable firewalld.service
(3)启动防火墙:systemctl start firewalld
(4)关闭防火墙:systemctl stop firewalld
(5)检查防火墙状态:systemctl status firewalld











