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)

  1. 计算服务Provider的总权重,并维护一个前缀和数组;
  2. 基于第一步的结果,在0~总权重 之间生成一个随机数;
  3. 随机数得到一个权重,遍历前缀和数组,找到第一个比随机权重大的位置,即可确定选择的服务Provider;
  4. 如果所有服务提供者节点都没有分配权重,或者分配的权重都一样,那么就采用随机的选择一个服务提供者节点;

2.轮询 + 权重(roundrobin)

  1. 计算服务提供者的总权重。
  2. 每个服务提供者除了始终不变的固定权重以外,需要记录服务提供者当前权重。
  3. 每次请求,更新所有的服务提供者的当前权重,当前权重 = 当前权重 + 固定权重。
  4. 从上一步得到的结果中,选择一个当前权重最大的服务提供者用于处理请求,如果存在多个,那么就看遍历的过程中先遇到哪个服务提供者就是哪一个。并且,选中的权重最大的服务提供者更新其当前权重 = 当前权重 - 总权重

3.最少连接(leastactive)

  1. Client存在一个计数器,记录当前通过某个Server提供者的请求还未完成的总数;
  2. 选择计数最少的那个用于处理当前请求, 将计数器+1;
  3. 如果存在多个相同的计数,那么使用随机+权重的方式选取;
  4. 否则从多个最少的服务提供者当中随机的选择一个处理当前请求;

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为用户服务)

此时会有什么问题?

  1. 当服务器增加服务节点时,需要修改配置文件;
  2. 当其中一个服务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的协同工作原理相关推荐

  1. Dubbo (二) ---------- Dubbo 框架

    目录 一.Dubbo 概述 二.基本架构 三.Dubbo 支持的协议 四.第一个 Dubbo 项目 直连方式 1) 创建服务提供者 :订单服务 2) 创建服务消费者 :商品网站 五.dubbo 服务化 ...

  2. Dubbo(二) Dubbo管理控制台dubbo-admin搭建

    dubbo-admin 是一款dubbo的服务治理以及服务查询的一个管理平台.界面如下: 1.下载dubbo-admin代码 下载地址:https://github.com/apache/dubbo- ...

  3. 【zookeeper+Dubbo】Dubbo与SpringBoot整合的三种方式

    一.使用yml或者properties等配置文件 新建code-boot的项目 依赖为 <dependencies><dependency><groupId>org ...

  4. [Dubbo实战]dubbo + zookeeper + spring 实战 (转)

    这里最熟悉的就是spring了,项目中应用很多.dubbo是一个实现分布式的框架,zookeeper是注册中心.给我的感觉就像多对多关系的两者表,zookeeper相当于第三张表维护关系.下面通过一个 ...

  5. dubbo源码解析-zookeeper创建节点

    前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...

  6. 为什么要用dubbo,dubbo和zookeeper关系

    为什么要用dubbo? 当网站规模达到了一定的量级的时候,普通的MVC框架已经不能满足我们的需求,于是分布式的服务框架 和流动式的架构就凸显出来了.单一应用架构 当网站流量很小时,只需一个应用,将所有 ...

  7. Dubbo面试 - dubbo的工作原理

    Dubbo面试 - dubbo的工作原理 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来 ...

  8. 微服务 注册中心的作用_微服务架构Dubbo之注册中心(Zookeeper)

    注册中心简介 在微服务架构中,注册中心是核心的基础服务之一.在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中.Dubbo是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用 ...

  9. spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo SpringBoot + Dubbo + zookeeper Spring Security

    spring-boot重头再来 6 文章目录 spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo dubbo-admin安装 dubbo-admin ...

  10. Dubbo源码解析 —— Zookeeper 订阅

    作者:肥朝 原文地址:https://www.jianshu.com/p/73224a6c07bb 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友 ...

最新文章

  1. 不上全站https的网站你们就等着被恶心死吧
  2. nokia 上的好玩应用(转载)
  3. 初次使用VS附加到进程功能
  4. 三种常见中文内码的转换方法
  5. java 检查pos机状态_POS机故障大全及排查方法
  6. GCC 关键字inline探究
  7. μC/OS-Ⅱ的移植
  8. 算法 - 赫夫曼编码(对字符串进行压缩 与 解压(解码)) - (对文件进行压缩解压)
  9. windows 2013 datacenter 安装sql server2008 r2兼容性
  10. 都说 VR 开发坑太多,结果华为云 5G Cloud VR 放了个大招儿!
  11. 无连续整数的子集数问题
  12. 【房价预测】基于matlab Elman神经网络开盘价预测【含Matlab源码 708期】
  13. 优秀的代码是如何分层的?
  14. VC2010 Tab控件使用
  15. 爬虫百度图片进入百度验证怎么办?
  16. 免费天气预报接口返回15天的天气JSON格式
  17. 国内顶尖网页游戏制作人和主策划名单(转)
  18. 每天自我提升的8个好习惯
  19. Windows Server 2012R2 启用网络发现失败
  20. linux 局域网 提高网速,提高Linux系统网速的方法

热门文章

  1. 2021腾讯算法大赛
  2. 904L 是一种耐酸不锈钢含低碳
  3. Racket编程指南——24 命令行工具和你的编辑器选择
  4. 更多:Racket系统编程
  5. 国内外常用计算机杀毒软件,国外杀毒软件排行榜(国内的不要)
  6. 转:大前研一:“质问力”是解决问题最重要的能力
  7. 最新谷歌GOOGLE搜索命令大全
  8. Google ----- 展示搜索的艺术!
  9. Quartus18.0新建工程
  10. SEO学习笔记一:Google搜索引擎背后的运作模式