Provider: 暴露服务的服务提供方
Protocol 负责提供者和消费者之间协议交互数据 ;
Service 真实的业务服务信息 可以理解成接口 和 实现 ;
Container Dubbo的运行环境;
Consumer: 调用远程服务的服务消费方
Protocol 负责提供者和消费者之间协议交互数据;
Cluster 感知提供者端的列表信息 ;
Proxy 可以理解成 提供者的服务调用代理类 由它接管 Consumer中的接口调用逻辑;
Registry: 注册中心,用于作为服务发现和路由配置等工作,提供者和消费者都会在这里进行注册
Monitor: 用于提供者和消费者中的数据统计,比如调用频次,成功失败次数等信息
提供者端启动 容器负责把Service信息加载 并通过Protocol 注册到注册中心 ;
消费者端启动 通过监听提供者列表来感知提供者信息 并在提供者发生改变时 通过注册中心及时 通知消费端 ;
消费方发起 请求 通过Proxy模块利用Cluster模块来选择真实的要发送给的提供者信息交由Consumer中的Protocol 把信息发送给提供者 ;
提供者同样需要通过 Protocol 模块来处理消费者的信息 最后由真正的服务提供者 Service 来进行处理;
2.1. 从上图可以看出, 淡绿色部分代表provider部分,淡蓝色部分表示consumer部分。
2.2. 整体调用链路可以分为三大层:业务层(提供接口和实现的地方, 一般由研发人员进行编写)、远程过程调用层(RPC层)、远程数据传输层(Remoting层)。
3.3.调用链路说明:
A:消费者通过Interface进行方法调用统一交由消费者端的 Proxy 通过ProxyFactory来进行代理对象的创建使用到了 jdk javassist以及java 的代理技术等等。
B:接下来对应的请求将转给Filter 进行进一步处理,此时如果对应的SPI(接口扩展点)则进行对应的调用执行。[调用自定义的FIter]
C: 继而进入InVoker方法调用,具体可以分为三个部分:
a:通过Directory 去配置中新读取信息最终通过list方法获取所有的Invoker引用。
b:通过Cluster模块 根据选择的具体路由规则 来选取Invoker列表。
c:通过LoadBalance模块 根据负载均衡策略 选择一个具体的Invoker 来处理我们的请求。
d:如果调用失败,依据客户端配置的重试机制。再进入到客户端的ReTry 机制。
e:继续经过Filter 进行执行功能的前后封装 Invoker 选择具体的执行协议。
f: 客户端进行编码和序列化,根据对饮的配置协议(http/dubbo/rmi/hessian),有客户端向服务端发送数据。
g:到达Provoder 中的 Server 在这里进行 反编码 和 反序列化的接收数据。
h. 使用Exporter选择执行。
I. 交给Filter 进行一个提供者端的过滤 到达 Invoker 执行器 。
J 通过Invoker 调用接口的具体实现 然后返回。
图例说明:
Dubbo的源码整体设计与调用链路十分相似,只不过在源码设计图中可以看到各个层有更为详细的层次划分。
图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于 中轴线上的为双方都用到的接口。
图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可 以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色 三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
(一) 业务逻辑层
service 业务层 包括我们的业务代码 比如 接口 实现类 直接面向开发者。
(二)远程过程调用层(RPC层)
config 配置层: 对外提供配置 以ServiceConfig ReferenceConfig 为核心 可以直接初始化配置 类 也可以解析配置文件生成
proxy 服务代理层 :无论是生产者 还是消费者 框架都会产生一个代理类 整个过程对上层透明 就是 业务层对远程调用无感
registry 注册中心层: 封装服务地址的注册与发现 以服务的URL为中心
cluster 路由层 :(集群容错层) 提供了多个提供者的路由和负载均衡 并且它桥接注册中心 以 Invoker为核心
monitor 监控层 :RPC调用相关的信息 如 调用次数 成功失败的情况 调用时间等 在这一层完成
protocol 远程调用层: 封装RPC调用 无论是服务的暴露 还是 服务的引用 都是在Protocol中作为主 功能入口 负责Invoker的整个生命周期 Dubbo中所有的模型都向Invoker靠拢。
(三)Remoting层(Remoting层)
exchange信息交换层 封装请求和响应的模式 如把请求由同步 转换成异步;
Transport网络传输层 统一网络传输的接口 比如 netty 和 mina 统一为一个网络传输接口 ;
serialize数据序列化层负责管理整个框架中的数据传输的序列化 和反序列化;