本文首发于微信公众号【猿灯塔】,转载引用请说明出处

今天是猿灯塔“365天原创计划”第4天。

今天呢!灯塔君跟大家讲:

一.Dubbo意义

网站应用的架构变化经历了一个从所有服务分布在一台服务器上(All in one 、单一应用架构)到 垂直

应用架构 (MVC模式,按照各模块的职能划分)到分布式应用架构(RPC、按照服务不同分布在不同的

服务器上)再到面向服务的架构(SOA,增加调度中心,负责集群的调度和管理)的过程。 Dubbo就
是处在SOA架构阶段的一个远程服务调用框架
 
二..系统架构

Dubbo系统分为五个部分:远程服务运行容器(Container),远程服务提供方(Provider)、注册中
心(Register)、远程服务调用者(Consumer)、监控中心(Monitor)。
Dubbo服务调用过程:
  • 服务提供方(Provider)所在的应用在容器中启动并运行(这个容器可以说是该应用部署的tomcat)
  • 服务提供方(Provider)将自己要发布的服务注册到注册中心(Registry)
  • 服务调用方(Consumer)启动后向注册中心订阅它想要调用的服务
  • 注册中心(registry)存储着Provider注册的远程服务,并将其所管理的服务列表通知给服务调用
  • 方(Consumer),且注册中心和提供方和调用方之间均保持长连接,可以获取Provider发布的服
  • 务的变化情况,并将最新的服务列表推送给Consumer
  • Consumer根据从注册中心获得的服务列表,根据软负载均衡算法选择一个服务提供者
  • (Provider)进行远程服务调用,如果调用失败则选择另一台进行调用。(Consumer会缓存服务
  • 列表,即使注册中心宕机也不妨碍进行远程服务调用)
  • 监控中心(Monitor)对服务的发布和订阅进行监控和统计服务消费者和提供者,在内存中累计调
  • 用次数和调用时间,定时每分钟发送一次统计数据到监控中心(Monitor);Monitor可以选择
  • Zookeeper、Redis或者Multiast注册中心等,后序介绍。
 
三.Dubbo + Zookeeper

Dubbo可以用Zookeeper作为注册中心,存储Provider注册的远程服务信息。

Zookeeper采用树形的目录结构来存储信息。

  • 服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地 址
  • 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地 址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地 址。
 
 
支持以下功能:
  • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
  • 当注册中心重启时,能自动恢复注册数据,以及订阅请求
  • 当会话过期时,能自动恢复注册数据,以及订阅请求
  • 当设置<dubbo:registry check="false" />时,记录失败注册和订阅请求,后台定时重试
  • 可通过设置<dubbo:registry username="admin" password="124" />设置zookeeper 登录信息
  • 可通过<dubbo:registry group="dubbo" />设置 zookeeper 的根节点,不设置将使用无 根树
  • 支持 * 号通配符 <dubbo:redistry group="" version="" />,可订阅服务的所有分组 和所有版本的
提供者
 
四.Dubbo + Redis 
Redis是一个基于内存的,以Key-Value形式存储数据的高性能Nosql数据库,可以用来存储远程服务信
息用作注册中心

使用 Redis 的 Key—Map 结构存储数据结构:
  • 主键 Key 为服务名和服务类型:比如./dubbo/com.foo.BarService/providers或./dubbo/com.foo.BarService/providers,相当于Zookeeper中的第三层目录
  • 值 Map 中的 Key 为 URL 地址 ,Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除
使用 Redis 的 Publish/Subscribe 事件通知数据变更:
  • 通过事件的值区分事件类型: register , unregister , subscribe , unsubscribe
  • 普通消费者直接订阅指定服务提供者的 Key,只会收到指定服务的 register , unregister 事件
  • 监控中心通过 psubscribe 功能订阅 /dubbo/* ,会收到所有服务的所有变更事件
调用过程:
  • 服务提供方启动时,向 Key:/dubbo/com.foo.BarService/providers 下,添加当前提供者的地址, 并向 Channel:/dubbo/com.foo.BarService/providers 发送 register 事件
  • 服务消费方启动时,从 Channel:/dubbo/com.foo.BarService/providers 订阅 register 和unregister 事件 , 并向 Key:/dubbo/com.foo.BarService/providers 下,添加当前消费者的地址
  • 服务消费方收到 register 和 unregister 事件后,从 Key:/dubbo/com.foo.BarService/providers
下获取提供者地址列表
  • 服务监控中心启动时,从 Channel:/dubbo/* 订阅 register 和 unregister ,以及subscribe 和unsubsribe 事件
  • 服务监控中心收到 register 和 unregister 事件后,从Key:/dubbo/com.foo.BarService/providers 下获取提供者地址列表
  • 服务监控中心收到 subscribe 和 unsubsribe 事件后,从Key:/dubbo/com.foo.BarService/consumers 下获取消费者地址列表

365天干货不断,可以微信搜索「 猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板

 

Dubbo及注册中心原理的更多相关文章

  1. 如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他

    注册中心作用 开篇首先想思考一个问题,没有注册中心 Dubbo 还能玩下去吗? 当然可以,只要知道服务提供者地址相关信息,消费者配置之后就可以调用.如果只有几个服务,这么玩当然没问题.但是生产服务动辄 ...

  2. Dubbo配置注册中心设置application的name使用驼峰命名法存在的隐藏项目启动异常问题

    原创/朱季谦 首先,先提一个建议,在SpringBoot+Dubbo项目中,Dubbo配置注册中心设置的application命名name的值,最好使用xxx-xxx-xxx这样格式的,避免随便使用驼 ...

  3. Dubbo多注册中心和Zookeeper服务的迁移

    一.Dubbo多注册中心 1. 应用场景 例如阿里有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心. consumer.xml <?xm ...

  4. SpringCloud之Eureka注册中心原理及其搭建

    一.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCl ...

  5. Dubbo Multicast 注册中心即相关代码实现

    Dubbo 的 Multicast注册中心有下面特点: 不需要启动任何中心节点,只要广播地址一样,就可以互相发现 组播受网络结构限制,只适合小规模应用或开发阶段使用. 组播地址段: 224.0.0.0 ...

  6. Javaconfig形式配置Dubbo多注册中心

    多注册中心,一般用不到,但是某些情况下的确能解决不少问题,可以将某些dubbo服务注册到2套dubbo系统中,实现服务在2套系统间的共用. 网上的配置说明很多,但包括dubbo官方说明文档都是以xml ...

  7. Dubbo多注册中心

    一.创建提供者08-provider-registers (1) 创建工程 直接复制05-provider-group工程,并命名为08-provider-registers (2) 修改配置文件 二 ...

  8. dubbo 多注册中心

    这个我调试了下,多个注册中心在创建代理的时候,每个注册中心对应一个invoker,持有一个RegistryDirectory对应一个zkClinet,并且维护这样一个map: 那些不正确zk在创建代理 ...

  9. 阿里dubbo服务注册原理解析

           阿里分布式服务框架 dubbo现在已成为了外面很多中小型甚至一些大型互联网公司作为服务治理的一个首选或者考虑方案,相信大家在日常工作中或多或少都已经用过或者接触过dubbo了.但是我搜了 ...

随机推荐

  1. java实现第三届蓝桥杯数据压缩

    数据压缩 某工业监控设备不断发回采样数据.每个数据是一个整数(0到1000之间).各个数据间用空白字符(空格,TAB或回车换行)分隔.这些数据以文本形式被存储在文件中. 因为大多数时候,相邻的采样间隔 ...

  2. PAT 德才论

    宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...

  3. DDD之4聚合和聚合根

    聚合就是归类的意思,把同类事物统一处理: 聚合根也就是最抽象,最普遍的特性: 背景 领域建模的过程回顾: 那么问题来了? 为什么要在限界上下文和实体之间增加聚合和聚合根的概念,即作用是什么? 如何设计 ...

  4. 小程序 大转盘 抽奖 canvas animation

    项目需求运用到大转盘 可设置概率 可直接自定义结果 效果如下

  5. 简单说维特比算法 - python实现

    动态规划求最短路径算法,与穷举法相比优点在于大大降低了时间复杂度; 假如从起点A到终点S的最短路径Road经过点B1,那么从起点A到B1的最短路径的终点就是B1,否则如果存在一个B2使得A到B2的距离 ...

  6. 【PHP】如何将SESSION数据存放到Redis中

    在php中,SESSION的数据默认是存放到文件中,这样性能不仅不高,而且不利于扩展.在搭建集群后,默认存放到文件中就不适用了.所以,我们一般将SESSION自定义,让SESSION中的数据存放到 数 ...

  7. OKR-Periods of Words【KMP最小前后缀】

    OKR-Periods of Words 传送门:链接    来源:UPC 8180 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得 ...

  8. UWP实现第二字幕并且跟随系统的设置

    话不多说,先看一下最终效果 系统设置默认 在系统设置里面更改字幕的显示效果 需求 要求播放器可以显示第二字幕,类似旁白的文字解释.比如片中出现了一个专业术语,这个时候观众可能有些疑惑.所以需要在屏幕上 ...

  9. python中列表,元组,字符串 互相转换

    #-*-coding:utf-8-*- #1.字典dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type 's ...

  10. HTTP协议简要

    HTTP协议简要 HTTP协议是指超文本传输协议,简单来说就是一种规则,允许将HTML文档从Web服务器传送到Web浏览器. HTTP请求 HTTP请求包括三部分:请求行(请求方法),请求头(消息报头 ...