2020年9月21日10:56:46
一、前言1.什么是Dubbo?
Dubbo是阿里巴巴公司发布的一个高性能优秀的开源分布式服务框架,使得应用可通过高性能的 RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。
它提供了三大核心能力:①面向接口的远程方法调用;②智能容错和负载均衡;③服务自动注册和发现。
二、Dubbo介绍
1.Dubbo工作原理图
1.1 节点角色说明
Provider: 暴露服务的服务提供者。
Consumer: 调用远程服务的服务消费者。
Registry: 服务者服务注册与消费者注册、发现服务的注册中心。
Monitor: 统计服务的调用次数和调用时间的监控中心。
Container: Dubbo服务运行容器。
1.2 调用关系说明
1.2.1 整个Dubbo服务容器启动,加载,运行服务提供者provider;
1.2.2 服务提供者provider在启动时,(通过连接注册中心服务器的client)向注册中心注册自己可以提供的服务。(注册provider自己的ip、port、以及对自己提供的服务的描述等信息);
1.2.3 服务消费者consumer在启动时,向注册中心订阅自己所需的服务,如果没有订阅到自己想获得的服务,它会不断的尝试订阅。新的服务注册到注册中心以后,注册中心会将这些服务notify(通知)给消费者。同时消费者也会向注册自己的ip、port等信息;
1.2.4 注册中心返回服务提供者provider地址列表给消费者consumer,如果有变更,注册中心将基于长连接推送变更后数据给消费者consumer;
1.2.5 服务消费者consumer,从注册中心返回的提供者provider地址列表中(多数情况下提供者是集群形式),基于软负载均衡算法,选一台可用的提供者provider进行RPC调用,如果调用失败,再选另一台调用;
1.2.6 消费者consumer和提供者provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心monitor。Monitor在整个架构中是可选的,Monitor功能需要单独配置,不配置或者配置后Monitor挂掉,都不会影响服务的调用。
1.2.7 Dubbo 架构具有以下几个特点:连通性、健壮性、伸缩性、以及向未来架构的升级性。
2. Dubbo作用
2.1 Dubbo其实就是一个中间层管理工具,它是一个框架,里面可以装你想装的任何服务,Dubbo的注册中心大多用zookeeper,当然除了zookeeper,还有Redis等也可以做为Dubbo的注册中心。
三、Dubbo+Zookeeper介绍
1.Dubbo注册中心白话解释
可以把Dubbo的register注册中心理解成房产中介链家,provider是卖房的人,provider张三想卖掉自己在秦淮区的学区房,provider李四想卖掉自己在栖霞区的学区房,consumer王五是想在栖霞区买学区房给自己孩子上学,王五去链家咨询后,链家给王五的需求条件满足者是李四,王五从链家那拿到李四的电话,自己打电话找李四买房。(哈哈哈哈,说的比较白话通俗一点)
2.Zookeeper作为Dubbo的注册中心图示
PS:Zookeeper内部是树形结构。
2.1 图示说明介绍
2.1.1 这是Dubbo启动时在注册中心ZooKeeper上创建的默认根节点 “/dubbo”;
2.1.2 接口在Zookeeper上注册节点:假设接口名称是:com.bob.dubbo.service.CityDubboService,代表了Dubbo的一个服务,那么Dubbo会自动在Zookeeper中注册该结点: “/dubbo/com.bob.dubbo.service.CityDubboService”;
2.1.3 Dubbo启动时,其中的持久化结点,不管你provider和consumer断开后,持久化节点都不会消失;
2.1.4 Dubbo启动时,Consumer和Provider都会把自身的URL、端口等格式化为字符串,然后注册到zookeeper相应节点下,作为一个临时节点,当连断开时,节点被删除。
eg:
服务提供者的持久化节点“providers”,其子节点代表了每一个服务真正的提供者
服务消费者的持久化节点“consumers”,其子节点代表每一个服务真正的消费者
2.1.5 比如Providers持久化节点下注册的是:192.168.1.12*(描述121是吃饭,122睡觉,123打游戏,124健身,四种不同的服务),Consumer在启动时,不仅仅会注册自身ip、port等信息到 …/consumers/目录下,同时还会订阅…/providers目录下所有子节点,具体的看你订阅具体是哪一个节点(比如订阅.124健身服务),实时获取其在Providers持久化节点下的URL字符串信息。register返回给Consumer这个ip——192.168.1.124,Consumer拿着这个iP直接去找提供者Provider RPC调用这项服务——健身。
2.1.6 监控中心启动时订阅com.bob.dubbo.service.CityDubboService目录下的所有提供者provider和消费者consumer 的URL。
四、Dubbo+Zookeeper补充
1.图示介绍
1.1 Zookeeper作为Dubbo的注册中心支持以下功能:
1.1.1 当提供者出现断电等异常宕机时,注册中心能自动删除提供者节点信息;
1.1.2 当注册中心重启时,能自动恢复注册数据,以及订阅请求;
1.1.3 当会话过期时,注册中心能自动恢复注册数据,以及订阅请求;
1.1.4 当设置
1.1.5 可通过设置
1.1.6 可通过
1.1.7 支持 * 号通配符
1.2 注意点
1.2.1 消费者从ZK获取provider地址列表后,会在本地缓存一份。当ZK注册中心所有节点全部宕掉之后,消费者可以使用本地缓存的服务列表和provider进行通信。
ZK的意义在于为provider、consumer提供服务的发布和订阅,让消费者及时感知最新的服务列表,consumer真正调用provider是通过某种通信协议直接调用,并不依赖ZK。
所以当zookeeper宕机之后,不会影响消费者调用服务提供者,影响的是zookeeper宕机之后如果提供者provider信息有变动、provider宕机,zk无法把变更最新的provider列表数据通知推送给consumer,consumer会因为感知不到变更时间,不去拉取最新的服务列表,导致本地缓存的服务列表有可能是过时的,或者说consumer基于本地缓存的提供者服务列表,PRC其中一台provider1,但是provider1宕机了或者信息变动了,导致RPC失败!