Dubbo启停原理解析

本章主要内容:
• Dubbo配置解析;
• Dubbo服务暴露原理;
• Dubbo服务消费原理;
• Dubbo优雅停机解析
1配置解析
目前Dubbo框架同时提供了 3种配置方式:XML配置、 注解、 属性文件(properties和ymal)配置, 最常用的还是XML和注解两种方式。
1.1 基于schema设计解析
Dubbo 设计之初也考虑到属性最大限度的复用, 因此对schema进行了精心的设计, Dubbo schema层级的详细设计如图5.1所示。
Dubbo启停原理解析

Dubbo启停原理解析

1.2 基于XML配置原理解析

1.3基于注解配置原理解析
2服务暴露的实现原理
2.2远程服务的暴露机制
我们先看一下整体RPC的暴露原理
Dubbo启停原理解析

在整体上看, Dubbo框架做服务暴露分为两大部分, 第一步将持有的服务实例通过代理转换成Invoker,第二步会把Invoker通过具体的协议(比如Dubbo)转换成Exporter,框架做了这层抽象也大大方便了功能扩展。 这里的Invoker可以简单理解成一个真实的服务对象实例, 是Dubbo框架实体域, 所有模型都会向它靠拢, 可向它发起invoke调用。 它可能是一个本地的实现, 也可能是一个远程的实现, 还可能是一个集群实现。
2.3本地服务的暴露机制
很多使用Dubbo框架的应用可能存在同一个JVM暴露了远程服务, 同时同一个JVM内部又引用了自身服务的情况, Dubbo默认会把远程
服务用injvm协议再暴露一份, 这样消费方直接消费同一个JVM内部的服务, 避免了跨网络进行远程通信。
3服务消费的实现原理
3.1单注册中心消费原理
Dubbo启停原理解析

在整体上看, Dubbo框架做服务消费也分为两大部分, 第一步通过持有远程服务实例生成Invoker,这个Invoker在客户端是核心的远程代理对象。 第二步会把Invoker通过动态代理转换成实现用户接口的动态代理引用。 这里的Invoker承载了网络连接、 服务调用和重试等功能, 在客户端, 它可能是一个远程的实现, 也可能是一个集群实现
3.2多注册中心消费原理
在实际使用过程中, 我们更多遇到的是单注册中心场景, 但是当跨机房消费时, Dubbo框架允许同时消费多个机房服务。 默认Dubbo消费机房的服务顺序是按照配置注册中心的顺序决定的, 配置靠前优先消费。
多注册中心消费原理比较简单, 每个单独注册中心抽象成一个单独的Invoker,多个注册中心实例最终通过StaticDirectory保存所有的Invoker,最终通过Cluster合并成一个Invoker

4优雅停机原理解析
优雅停机特性是所有RPC框架中非常重要的特性之一, 因为核心业务在服务器中正在执行时突然中断可能会出现严重后果。 接下来我们详细探讨Dubbo框架内部实现优雅停机的原理,如图5-7所示。
Dubbo启停原理解析

Dubbo中实现的优雅停机机制主要包含6个步骤:
(1)收到kill 9进程退出信号, Spring容器会触发容器销毁事件。
(2) provider端会取消注册服务元数据信息。
(3) consumer端会收到最新地址列表(不包含准备停机的地址) 。
(4) Dubbo协议会发送readonly事件报文通知consumer服务不可用。
(5) 服务端等待已经执行的任务结束并拒绝新任务执行。
可能读者会有疑问, 既然注册中心已经通知了最新服务列表, 为什么还要再发送readonly报文呢? 这里主要考虑到注册中心推送服务有网络延迟, 以及客户端计算服务列表可能占用一些时间。 Dubbo协议发送readonly时间报文时, consumer端会设置响应的provider为不可用状态, 下次负载均衡就不会调用下线的机器。
 

备注:文章参考《深入理解Apache Dubbo与实战》,作者:林琳,诣极

 

 

 

 

 

 

 

 

 

 

上一篇:Java设计模式——命令模式


下一篇:Dubbo的底层实现原理和机制