vlambda博客
学习文章列表

Dubbo及注册中心原理

Dubbo及注册中心原理

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


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

                  

Dubbo及注册中心原理



01
PART

Dubbo意义

Dubbo及注册中心原理

Dubbo及注册中心原理

网站应用的架构变化经历了一个从所有服务分布在一台服务器上(All in one ,单一应用架构)到 垂直应用架构(MVC模式,按照各模块的职能划分)到分布式应用架构(RPC,按照服务不同分布在不同的服务器上)再到面向服务的架构(SOA,增加调度中心,负责集群的调度和管理)的过程.Dubbo就是处在SOA架构阶段的一个远程服务调用框架.


01
PART
系统架构

Dubbo及注册中心原理

Dubbo及注册中心原理

Dubbo系统分为五个部分:
远程服务运行容器(Container)

远程服务提供方(Provider)注册中心(Register)

远程服务调用者(Consumer)监控中心(Monitor)

Dubbo服务调用过程:

  • 服务提供方(Provider)所在的
    应用在容器中启动
    并运行
    (这个容器可以说是该应用部署的
    tomcat)

  • 服务提供方(Provider)将自己要发布的服务注册到注册中心(Registry)

  • 服务调用(Consumer)方启动后向注册中心订阅它想要调用的服务

  • 注册中心(registry)存储着Provider注册的远程服务,并将其所管理的服务列表通知给服务调用方(Consumer)并且注册中心和提供方和调用方之间均保持长连接,可以获取Provider发布的服的变化情况并将最新的服务列表推送给Consumer

  • Consumer根据从注册中心获得的服务列表根据软负载均衡算法选择一个服务提供者(Provider)进行远程服务调用如果调用失败选择另一台进行调用(Consumer会缓存服务列表,即使注册中心宕机也不妨碍进行远程服务调用)

  • 监控中心(Monitor)对服务的发布和订阅进行监控和统计服务消费者和提供者,在内存中累计调次数和调用时间,定时每分钟发送一次统计数据到监控中心(Monitor);Monitor可以选ZookeeperRedis或者Multiast
    注册中心等后续
    介绍.



02
PART
Dubbo+Zookeeper

Dubbo及注册中心原理

Dubbo及注册中心原理
Dubbo可以用Zookeeper作为注册中心,存储Provider注册的远程服务信息.
Zookeeper采用树形的目录结构来存储信息.


Dubbo及注册中心原理

Dubbo及注册中心原理
服务提供者启动时:
向/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="" />,可订阅服务的所有分组和

    所有版本的提供者



01
PART

Dubbo+Redis

Dubbo及注册中心原理

Dubbo及注册中心原理

Redis是一个基于内存的,以Key-Value形式

存储数据的高性能Nosql数据库可以用来存储

远程服务信息用作注册中心

使用 Redis 的 Key—Map 

结构存储数据结构:

  • 主键Key为服务名和服务类型:

    比如./dubbo/com.foo.BarService

    /providers或./dubbo/com.foo.
    BarService/providers相当于
    Zookeeper中的第三层目录

  • Value为过期时间用于判断脏数据,
    脏数据由监控中心删除


使用Redis的Publish/Subscribe事件通知

数据变更:

  • 通过事件的值区分事件类型:register,

    unregister,subscribe,unsubscribe

  • 普通消费者直接订阅指定服务提供者的Key
    只会收到指定服务的register,unregister

  • 事件监控中心通过psubscribe

    功能订阅/dubbo/*会收到

    所有服务的所有变更事件

调用过程:

  • BarService/providers发送 register 事件

  • 服务消费方启动时:

    从Channel:/dubbo/
    com.foo.BarService/providers订阅

    register和unregister事件并向Key:/dubbo

  • 服务消费方收到register和unregister
    事件后从Key:/dubbo/com.foo.
    BarService/providers


  • 服务监控中心启动时:

    从Channel:/dubbo/*订阅register和unregister,以及subscribe
    和unsubsribe事件
  • 服务监控中心:

  • 服务监控中心:





猿灯塔:做程序猿的引导者!

新浪微博:@猿灯塔