进来闲来无事看了些有关dubbo源码的书籍和《极客时间》何辉老师的课程,由于知识点比较碎,遂以笔记的方式纪录,毕竟好记性不如烂笔头,也希望对感情趣的同学提供点帮助
假设你是个新手开发者,可能只是简单使用过dubbo框架,此时把官网的这个架构图甩在你脸上不知第一反应是什么
由于dubbo中涉及太多的组建与模块,下面以我们常见的开发习惯逐一对各个分层做个梳理
一、Service
public interface DemoService
public interface DemoServiceImpl
以上图为例,不论是 demoService还是ServiceImpl,其本身都开发者定义的与业务息息相关的东西,Dubbo 把这样与业务逻辑关联紧密的一层称为服务层,即 Service
二、Config
<dubbo:registry id="" protocol="" />
<dubbo:protocol name="dubbo" port="" />
<dubbo:provider registry="" />
不论是服务调用者还是提供者,都会存在一些配置相关的数据,比如超时时间、重试此时等等,读过Spring源码的同学看到上面截图应该不会陌生,spring会把标签或注解最终解析成 BeanDifinition对象,Dubbo作为优秀的开源框架自然会借鉴spring的做法,其中 Dubbo 把这样专门存储与读取配置打交道的层次称为配置层,即 Config
三、Proxy
通过facade.jar便能够调用具体的远程服务,这个动作场景我们在java中应该也见过类似的实现,没错便是动态代理,Dubbo 把这种代理接口发起远程调用,或代理接收请求进行实例分发处理的层次,称为服务代理层,即 Proxy
四、Registry
有了 Proxy 但是代理怎么知道调用方的地址呢,于是便有了专门和注册中心打交道的模块以便给服务调用者和提供者实现服务注册与发现,Dubbo 把这一模块称为注册中心层,即 Registry
五、Cluster
有了Registry便能拿到一堆提供者的IP列表,根据配置的负载策略选最终的一个提供者IP,Dubbo 将这种封装多个提供者并承担路由过滤和负载均衡的层次,称为路由层,即 Cluster
六、Monitor
监控各个接口的调用情况,比如某个方法调用成功了多少次,失败了多少次,调用前后所花费的时间是多少,springCloud框架中也有类似的实现
七、Protocol
调用是个复杂的过程,比如调用前和调用后要执行哪些操作,那么封装调用细节,取调用结果,Dubbo 将这种封装调用过程的层次称为远程调用层,即 Protocol
八、Exchange
消费方的业务请求数据最终会封装为 Request、Response 对象,至于拿着 Request 对象是进行同步调用,还是直接转异步调用通过 Future.get 拿结果,那是底层要做的事情, Dubbo 将这种封装请求并根据同步异步模式获取响应结果的层次,称为信息交换层,即 Exchange
九、Transport
当 Request 请求对象准备好了,不管是同步发送,还是异步发送,最终都是需要发送出去的,Dubbo 把这种能将数据通过网络发送至对端服务的层次称为网络传输层,即 Transport
十、Serialize
dubbo的网络通信框架是netty,最终要把对象转成二进制才能往网卡中发送,那么谁来将这些Request、Response 对象翻译成网络中能识别的二进制数据呢,Dubbo 将这种能把对象与二进制进行相互转换的正反序列化的层次称为数据序列化层,即 Serialize
总体分层如下: