dubbo-架构
总结构

注册中心
Dubbo 注册中心包括两个部分:存储介质(Zookeeper、Redis 等注册中心)、注册服务相关操作(注册服务、订阅服务)。

注册中心包含以下核心模块:
Registry:注册中心抽象;RegistryFactory:注册中心工厂,初始化时创建 Registry;Directory:服务目录,用于刷新和保存用于远程调用的invoker;NotifyListener:定义了通知接口,RegistryDirectory实现了Directory、NotifyListener接口,同时具有远程调用invoker功能、接受服务变更通知的功能。
服务消费者

服务消费者包括以下核心模块:Proxy、Registry、Protocol、Cluster、Invoker、Client。
Registry:注册中心模块,上文分析的模块;Proxy:服务代理模块,用于代理依赖的接口,使用过程中通过<dubbo:reference/>标签配置依赖接口,调用接口时实际上是调用该代理类;Protocol:服务协议模块,封装了 RPC 调用,在初始化时会创建用于远程调用的Invoker模块,并且通过调用Client模块与服务端建立连接;Cluster:高可用集群模块,主要用于支持服务容错,包括Cluster、ClusterInvoker、Directory、Router、LoadBalance;Invoker:服务调用者,消费者通过invoker调用目标接口,内部通过client模块完成与服务方的通信;Client:完成与服务方的连接建立、单向/双向消息发送和接收。
服务消费者初始化流程:
Proxy的ReferenceConfig模块发起,先通过Registry注册中心订阅服务变更事件,并在第一次初始化时主动执行服务变更通知;- 通过
DubboProtocol调用Client模块与服务端建立连接,并生成DubboInvoker; - 生成用于容错处理的
ClusterInvoker; client模块建立与服务端的连接时,以此通过Exchanger、Transporter组件;
发送请求流程:
- 调用
<dubbo:reference/>标签依赖的接口时,实际调用的是Proxy域中的服务代理; - 请求由 Proxy 代理,依次通过
ClusterInvoker负载均衡,再到DubboInvoker通过Client模块向服务提供者发送请求。请求发送后会通过AsyncToSyncInvoker方式阻塞等待结果,Client向服务提供者发送消息前需要通过Serialize组件对消息编码。
服务提供者

服务提供者从组成上可以拆分为 Registry、Proxy、Protocol、Invoker、Server。
服务提供者组成与服务消费者类似,但与服务消费者的不同之处如下:
- 通讯模块,服务消费者中叫
Client,服务提供者叫Server; - 服务消费者提供
Cluster集群容错模块,服务提供者没有; - 服务消费者通过
DubboInvoker提供远程调用来消费服务;服务提供者通过AbstractProxyInvoker来调用本地生成的Proxy; - 服务消费者通过
ReferenceConfig来配置生成 Proxy;服务提供者通过ServiceConfig来提供配置;
服务提供者接收到请求后,会依次经过:
Server Seralize:对请求数据包解码,然后发送给ChannelHandler;ThreadPool:任务分发到线程池,由后台线程处理;HeaderExchangeHandler进行本地业务处理调度,然后通过ExchangeHandler、AbstractProxyInvoker调用本地代理和本地实现得到最终的业务处理结果。
处理得到结果后,HeaderExchangeHandler 会通过 Channel 向 Server 对端发送响应结果,在将响应结果发送到消费者端前,会通过 Seralize 组件对响应结果编码然后传输。

浙公网安备 33010602011771号