dubbo-架构

总结构

img

注册中心

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

img

注册中心包含以下核心模块:

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

服务消费者

img

服务消费者包括以下核心模块:ProxyRegistryProtocolClusterInvokerClient

  • Registry:注册中心模块,上文分析的模块;
  • Proxy:服务代理模块,用于代理依赖的接口,使用过程中通过 <dubbo:reference/> 标签配置依赖接口,调用接口时实际上是调用该代理类;
  • Protocol:服务协议模块,封装了 RPC 调用,在初始化时会创建用于远程调用的 Invoker 模块,并且通过调用 Client 模块与服务端建立连接;
  • Cluster:高可用集群模块,主要用于支持服务容错,包括 ClusterClusterInvokerDirectoryRouterLoadBalance
  • Invoker:服务调用者,消费者通过 invoker 调用目标接口,内部通过 client 模块完成与服务方的通信;
  • Client:完成与服务方的连接建立、单向/双向消息发送和接收。

服务消费者初始化流程:

  • ProxyReferenceConfig 模块发起,先通过 Registry 注册中心订阅服务变更事件,并在第一次初始化时主动执行服务变更通知;
  • 通过 DubboProtocol 调用 Client 模块与服务端建立连接,并生成 DubboInvoker
  • 生成用于容错处理的 ClusterInvoker
  • client 模块建立与服务端的连接时,以此通过 ExchangerTransporter 组件;

发送请求流程:

  • 调用 <dubbo:reference/> 标签依赖的接口时,实际调用的是 Proxy 域中的服务代理;
  • 请求由 Proxy 代理,依次通过 ClusterInvoker 负载均衡,再到 DubboInvoker 通过 Client 模块向服务提供者发送请求。请求发送后会通过 AsyncToSyncInvoker 方式阻塞等待结果,Client 向服务提供者发送消息前需要通过 Serialize 组件对消息编码。

服务提供者

img

服务提供者从组成上可以拆分为 RegistryProxyProtocolInvokerServer

服务提供者组成与服务消费者类似,但与服务消费者的不同之处如下:

  • 通讯模块,服务消费者中叫 Client,服务提供者叫 Server
  • 服务消费者提供 Cluster 集群容错模块,服务提供者没有;
  • 服务消费者通过 DubboInvoker 提供远程调用来消费服务;服务提供者通过 AbstractProxyInvoker 来调用本地生成的 Proxy
  • 服务消费者通过 ReferenceConfig 来配置生成 Proxy;服务提供者通过 ServiceConfig 来提供配置;

服务提供者接收到请求后,会依次经过:

  • Server Seralize:对请求数据包解码,然后发送给 ChannelHandler
  • ThreadPool:任务分发到线程池,由后台线程处理;
  • HeaderExchangeHandler 进行本地业务处理调度,然后通过 ExchangeHandlerAbstractProxyInvoker 调用本地代理和本地实现得到最终的业务处理结果。

处理得到结果后,HeaderExchangeHandler 会通过 Channel 向 Server 对端发送响应结果,在将响应结果发送到消费者端前,会通过 Seralize 组件对响应结果编码然后传输。

posted @ 2024-06-14 15:42  Stitches  阅读(33)  评论(0)    收藏  举报