dubbo整体分层
- 左边淡蓝色背景的是服务消费者使用的接口,右边淡绿色背景的是服务提供者使用的接口,位于中轴线是双方都使用到的接口。
- 由上到下分为十层,各层为单向依赖,右边黑色箭头为依赖关系。每一层都可以剥离上层被复用,其中Service层和config层是api,其他层是SPI。
- 绿色小块是扩展接口,蓝色小块为实现类。
- 蓝色虚线是初始化部分,启动时候的export和refer流程;红色实线是调用过程,即发起一次dubbo调用。紫色箭头为继承。
各层的说明
- config配置层:对外配置接口,以ServiceConfig、ReferenceConfig为中心,初始化配置类,也可以通过Spring容器生成配置类。
- Proxy层:服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,可以理解为在客户端生成代理来发起远程调用,服务端生成统一的可调用代理,扩展接口是ProxyFactory,主要实现是Javassist动态代理。
- registry注册中心层:封装服务注册和发现,以服务URL为中心,实现注册、订阅、监听回调等功能,扩展接口为RegistryFactory、RegistryService、Registry,代码层面分为api和具体实现,有多种实现比如etcd、redis、zk等。
- cluster路由层:封装多个服务提供者的服务目录、路由、负载均衡,以Invoker为中心,并桥接注册中心,扩展接口为Cluster、Directory、Router、LoadBalance。
- monitor层:RPC调用次数和调用时间监控。
- protocol远程调用层:封装RPC调用,以Invocation、Result为中心,扩展接口为Protocol、Invoker、Exporter。代码层面有dubbo-rpc-api和具体的协议实现。
- exchange信息交换层:封装请求响应模式,同步转异步,以Request、Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient、ExchangeServer。
- transport网络传输层:抽闲mina和netty等为统一接口,以Message为中心,扩展接口是Channel、Transporter、Client、Server、Codec
- serialize 数据序列化层:提供一些可复用的序列化算法和工具,扩展接口为 Serialization、ObjectInput、ObjectOutput、ThreadPool
各层之间的关系
- 在dubbo中,Protocol是核心层,也就是只要有Protocol+Invoker+Exporter就可以完成非透明的RPC调用。
- Cluster不是必须的,只是服务提供者都是集群,Cluster目的是伪装为一个Invoker,外层只需要关注Protocol层Invoker即可,只有一个服务提供者是不需要Cluster的。
- Proxy层是和用户(服务端、客户端)交互时屏蔽RPC的细节使用的。让PRC调用变得更透明,调用者就像调用本地的接口。
- Remoting包含了Exchang信息交换层和Transport信息传输层,Transport只是封装了单向的信息传输,比如Netty接收发送消息,而在Exchange层封装了Request-Reponse语义。