Dubbo+SOA+RPC+Zookeeper

85 阅读5分钟

SOA思想

面向服务的架构(SOA) ,他讲应用程序的不同单元进拆分,并**通过服务之间的接口 和协议联系起来,**接口是独立的方式定义的,接口应该独立于实现服务的硬件平台.这使得构件在各种服务中以统一的方式交互
在这里插入图片描述

RPC思想

RPC是远程过程调用的缩写形式,由不同的服务器之间进行的通讯就叫RPC,RPC调用本质就是代理思想的应用.
总结: 服务A想要完成任务,但是手中没有资源,去通知B帮我完成,这种操作方式称为RPC

注册中心

  • 使用传统的架构设计,所有的请求都经过nginx中转,nginx负载很大,nginx出了问题,直接影响用户
  • 如果服务器数量改变了,则必须修改nginx的配置文件
    需求: 保证nginx负载压力不要太高,如果服务器数量发生变化可以自动更新配置,无需人为干预
    在这里插入图片描述

注册中心原理

  • 1)当服务器启动时,会将自己的服务名称IP:Port写入注册中心
  • 2)当注册中心接收提供者数据时,会动态维护服务列表数据
  • 3)消费者服务器启东时会连接到注册中心获取服务列表
  • 4)消费者服务器请求注册中心之后,会将服务列表保存到本地,方便以后使用
  • 5)消费者服务器根据服务列表,利用负载均衡机制挑选一个进行访问
  • 6)册中心利用心跳检查机制发现服务提供者宕机时,会"同步更新"注册列表,并且"同步所有消费者的服务列表

Zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
总结:Zookeeper负责服务的协调调度,当客户端发起请求时,返回正确的服务器地址
下载地址zookeeper.apache.org/releases.ht…

Zookeeper安装

1.上传Zookeeper后完成解压

tar -xvf zookeeper-3.4.8.tar.gz

2.修改配置文件
在zk的根目录下创建文件夹data/log
mkdir data log
3.跳入conf目录中修改配置文件
cp zoo_sample.cfg zoo.cfg
在这里插入图片描述
zk启动命令
sh zkServer.sh start 或 ./zkServer.sh start
sh zkServer.sh stop
sh zkServer.sh status

Zookeeper集群安装

1.在Zookeeper的根目录中创建新的文件夹zkCluster
在这里插入图片描述
2.创建zk1 zk2 zk3文件夹
在这里插入图片描述
3.在每个文件夹里创建data/log文件夹

mkdir {zk1,zk2,zk3}/{data,log}

在这里插入图片描述
4.添加myid文件夹
分别在zk1/zk2/zk3中的data文件夹中创建新的文件myid.其中的内容依次为1/2/3,与zk节点号对应
在这里插入图片描述
在这里插入图片描述
5.修改配置文件
将zoo_sample.cfg 复制为zoo1.cfg之后修改配置文件.
在这里插入图片描述
6.修改zoo1.cfg文件
在这里插入图片描述
配置完成后将zoo1.cfg复制2份.之后需要修改对应的文件夹目录.和不同的端口即可
zk集群测试:
sh zkServer.sh start zoo1.cfg
sh zkServer.sh stop zoo1.cfg
sh zkServer.sh status zoo1.cfg
在这里插入图片描述
Zookeeper集群中leader负责监控集群状态,follower主要负责客户端链接获取服务列表信息.同时参与投票

Dubbo框架

dubbo是一款高性能,轻量级的开源Java RPC框架提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo框架下其中一个提供者宕机,用户访问不受限,zk集群宕机,用户访问你也不受限,因为服务器注册列表已经到了web端

Dubbo负载均衡

Zookeeper数据存储结构
在这里插入图片描述

Dubbo通讯原理

不同服务器通讯之间需要通讯协议,dubbo使用的是dubbo协议(tcp-ip),dubbo将TCP-ip协议进行了封装
在这里插入图片描述
Dubbo框架中使用dubbo协议建立了连接,之后通过IP:20880等端口进行通讯,与LinuxIP地址无关,dubbo生成ip地址.
在这里插入图片描述

Dubbo负载均衡策略

根据IP:port进行hash运算,之后绑定固定的提供者进行访问.
效果: 以后消费者与服务提供者进行了绑定

1.挑选访问压力最小的

在这里插入图片描述

2.随机访问也是默认的配置

在这里插入图片描述

3.轮询策略

在这里插入图片描述

什么是客户端负载均衡/集中式负载均衡

集中式负载均衡(nginx)
1).用户访问服务器时,自己不清楚访问的真实的服务器到底是谁,由nginx服务器动态的反向代理实现.
2).统一由负载均衡服务器进行负载. 问题 负载均衡服务器访问压力高.
客户端负载均衡
1).消费者在访问服务提供者时清楚的了解 到底应该访问哪台服务器.
2).由于每个客户端都进行负载均衡.相当于将压力均匀的分配给客户端.访问压力低.
注意:
1).nginx一般只负责反向代理
2).在微服务框架中 几乎都是客户端负载均衡服务器.

京淘项目改造

导入dubbo的jar包

<!--引入dubbo配置 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>

添加公共接口在jt-common中
在这里插入图片描述

构建服务提供者

编辑提供者Service实现类
实现类注解要是用Dubbo的注解

@Service
public class DubboUserServiceImpl implements DubboUserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JedisCluster jedisCluster;

编辑YML配置文件

#关于Dubbo配置
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径
  application:              #应用名称
    name: provider-user     #一个接口对应一个服务名称
  registry:
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
  protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20880  #每一个服务都有自己特定的端口 不能重复.

构建服务消费者(JT-WEB)

编辑UserController

Controller
@RequestMapping("/user")
public class UserController {
    //false 程序启动时是否检查由该服务器提供者 否
    @Reference(check = false)
    private DubboUserService dubboUserService;

编辑YML配置文件

#配置dubbo
dubbo:
  scan:
    basePackages: com.jt
  application:
    name: consumer-web   #定义消费者名称
  registry:               #注册中心地址
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183