Dubbo(二):Dubbo和ZooKeeper的协同工作原理
Dubbo和ZooKeeper是如何协同工作的?
文章目录
- Dubbo和ZooKeeper是如何协同工作的?
- Dubbo
- 1.服务提供者-配置
- 2.服务消费者-配置
- 负载均衡
- 1. 随机 + 权重(random)
- 2.轮询 + 权重(roundrobin)
- 3.最少连接(leastactive)
- 4.一致性Hash(ConsistentHash)
- ZooKeeper注册中心
Dubbo
通过RPC的方式实现服务调用
通过简单实现理解原理:
Client和Server共用一个接口,将接口打成一个jar包,在客户端和服务端引入这个jar包,Client端面向接口写调用,Server端面向接口写实现,中间的网络通信交给Dubbo框架去实现。
以下是黄字叙述内容:“点对点RPC”的实现细节
1.服务提供者-配置
<!--1.当前项目在整个分布式架构里面的唯一名称,用于计算依赖关系 -->
<dubbo:application name="dubbo-provider"/><!--2.定义协议端口-->
<dubbo:protocol port="28800"/><!--3.定义注册中心的地址-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/><!--4.服务发布的配置,需要暴露的服务接口-->
<bean id="userService" class="com.duan.service.impl.UserServiceImpl"/>
<dubbo:service interface="com.duan.service.IUserService" ref="userService"/>
加载Spring配置
public class Provider {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");context.start();System.in.read(); // 按任意键退出}
}
2.服务消费者-配置
<!--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="dubbo-consumer"/><!--定义注册中心的地址-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/><!--生成远程服务代理-->
<dubbo:reference interface="com.duan.service.IUserService" id="userService"/>
加载Spring配置,并调用远程服务
public class Consumer {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");context.start();// 获取远程服务代理DemoService userService = (DemoService)context.getBean("userService");// 执行远程方法String hello = userService.sayHello("world");// Hello worldSystem.out.println( hello );}
}
负载均衡
以上就是典型的点对点的服务调用,假如在未指定zookeeper注册中心时,Client和Server端的配置文件部分如下
<!--dubbo这个服务所要暴露的服务地址所对应的注册中心,N/A为不使用注册中心-->
<dubbo:registry address="N/A"/>
此时,若我们为了高可用,可以:
- 配置多个服务提供者;
- consumer.xml中配置多个服务调用者,在
<dubbo:reference>
标签的url属性中加入多个地址,中间用分号隔开即可配置负载均衡策略在consumer.xml的dubbo:reference标签中增加loadbalance属性即可,属性值可以为如下四种:
1. 随机 + 权重(random)
- 计算服务Provider的总权重,并维护一个前缀和数组;
- 基于第一步的结果,在0~总权重 之间生成一个随机数;
- 随机数得到一个权重,遍历前缀和数组,找到第一个比随机权重大的位置,即可确定选择的服务Provider;
- 如果所有服务提供者节点都没有分配权重,或者分配的权重都一样,那么就采用随机的选择一个服务提供者节点;
2.轮询 + 权重(roundrobin)
- 计算服务提供者的总权重。
- 每个服务提供者除了始终不变的固定权重以外,需要记录服务提供者当前权重。
- 每次请求,更新所有的服务提供者的当前权重,当前权重 = 当前权重 + 固定权重。
- 从上一步得到的结果中,选择一个当前权重最大的服务提供者用于处理请求,如果存在多个,那么就看遍历的过程中先遇到哪个服务提供者就是哪一个。并且,选中的权重最大的服务提供者更新其当前权重 = 当前权重 - 总权重
3.最少连接(leastactive)
- Client存在一个计数器,记录当前通过某个Server提供者的请求还未完成的总数;
- 选择计数最少的那个用于处理当前请求, 将计数器+1;
- 如果存在多个相同的计数,那么使用随机+权重的方式选取;
- 否则从多个最少的服务提供者当中随机的选择一个处理当前请求;
4.一致性Hash(ConsistentHash)
一致性Hash,相同参数的请求总是发到同一提供者;
consumer.xml中生成接口的远程代理如下:
<dubbo:reference id="demoService" interface="com.st.DemoService"url="dubbo://192.168.11.1:20880/com.st.DemoService;dubbo://192.168.11.2:20880/com.st.DemoService;dubbo://192.168.11.3:20880/com.st.DemoService"loadbalance="roundrobin"/>
现在整体架构如下图(假设consumer为订单服务,provider为用户服务)
此时会有什么问题?
- 当服务器增加服务节点时,需要修改配置文件;
- 当其中一个服务Provider宕机时,consumer不能及时感知到,还会往宕机的服务发送请求;
这是后就需要引入zookeeper注册中心了!
ZooKeeper注册中心
zookeeper注册中心实现注册的大致流程如下图:
对照上图来看Dubbo官网上的Dubbo框架图,是不是觉得和上图很类似?zookeeper是被选来作为Dubbo框架中的注册中心。
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Register | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
- Container负责启动(上面的容器为Spring容器),加载,运行服务提供者;
- 服务提供者在启动时,向注册中心注册自己提供的服务;
- 服务消费者在启动时,向注册中心订阅自己所需的服务;
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选择一台提供者进行调用,如果调用失败,再选另一个台调用;
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
回归之前的问题,如要使用注册中心,只需要将provider.xml和consumer.xml恢复为如下:
<!--<dubbo:registry address="N/A"/>-->
<dubbo:registry protocol="zookeeper" address="192.168.11.129:2181"/>
如果zookeeper是一个集群,则多个地址之间逗号分隔即可:
<dubbo:registry protocol="zookeeper" address="192.168.11.129:2181,192.168.11.137:2181,192.168.11.138:2181"/>
将consumer.xml中配置的直连的方式去掉
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<!--<dubbo:reference id="demoService" interface="com.st.DemoService"-->
<!--url="dubbo://localhost:20880/com.st.DemoService"/>-->
启动上述服务后,我们观察在zookeeper的根节点多了一个dubbo节点,如下图(树状存储)
最后一个节点中192.168.1.104是我的内网地址,绿色代表临时节点,而其他节点是持久节点,这样,当服务宕机时,这个节点就会自动消失,不在提供服务,服务消费者也不会载请求。若部署多个Service,则Provider下面会有好几个节点,一个节点保存一个Service的服务地址。
Dubbo(二):Dubbo和ZooKeeper的协同工作原理相关推荐
- Dubbo (二) ---------- Dubbo 框架
目录 一.Dubbo 概述 二.基本架构 三.Dubbo 支持的协议 四.第一个 Dubbo 项目 直连方式 1) 创建服务提供者 :订单服务 2) 创建服务消费者 :商品网站 五.dubbo 服务化 ...
- Dubbo(二) Dubbo管理控制台dubbo-admin搭建
dubbo-admin 是一款dubbo的服务治理以及服务查询的一个管理平台.界面如下: 1.下载dubbo-admin代码 下载地址:https://github.com/apache/dubbo- ...
- 【zookeeper+Dubbo】Dubbo与SpringBoot整合的三种方式
一.使用yml或者properties等配置文件 新建code-boot的项目 依赖为 <dependencies><dependency><groupId>org ...
- [Dubbo实战]dubbo + zookeeper + spring 实战 (转)
这里最熟悉的就是spring了,项目中应用很多.dubbo是一个实现分布式的框架,zookeeper是注册中心.给我的感觉就像多对多关系的两者表,zookeeper相当于第三张表维护关系.下面通过一个 ...
- dubbo源码解析-zookeeper创建节点
前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...
- 为什么要用dubbo,dubbo和zookeeper关系
为什么要用dubbo? 当网站规模达到了一定的量级的时候,普通的MVC框架已经不能满足我们的需求,于是分布式的服务框架 和流动式的架构就凸显出来了.单一应用架构 当网站流量很小时,只需一个应用,将所有 ...
- Dubbo面试 - dubbo的工作原理
Dubbo面试 - dubbo的工作原理 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来 ...
- 微服务 注册中心的作用_微服务架构Dubbo之注册中心(Zookeeper)
注册中心简介 在微服务架构中,注册中心是核心的基础服务之一.在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中.Dubbo是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用 ...
- spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo SpringBoot + Dubbo + zookeeper Spring Security
spring-boot重头再来 6 文章目录 spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo dubbo-admin安装 dubbo-admin ...
- Dubbo源码解析 —— Zookeeper 订阅
作者:肥朝 原文地址:https://www.jianshu.com/p/73224a6c07bb 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友 ...
最新文章
- 不上全站https的网站你们就等着被恶心死吧
- nokia 上的好玩应用(转载)
- 初次使用VS附加到进程功能
- 三种常见中文内码的转换方法
- java 检查pos机状态_POS机故障大全及排查方法
- GCC 关键字inline探究
- μC/OS-Ⅱ的移植
- 算法 - 赫夫曼编码(对字符串进行压缩 与 解压(解码)) - (对文件进行压缩解压)
- windows 2013 datacenter 安装sql server2008 r2兼容性
- 都说 VR 开发坑太多,结果华为云 5G Cloud VR 放了个大招儿!
- 无连续整数的子集数问题
- 【房价预测】基于matlab Elman神经网络开盘价预测【含Matlab源码 708期】
- 优秀的代码是如何分层的?
- VC2010 Tab控件使用
- 爬虫百度图片进入百度验证怎么办?
- 免费天气预报接口返回15天的天气JSON格式
- 国内顶尖网页游戏制作人和主策划名单(转)
- 每天自我提升的8个好习惯
- Windows Server 2012R2 启用网络发现失败
- linux 局域网 提高网速,提高Linux系统网速的方法