这是dubbo的第一篇文章,我想在接下来的文章里面分析dubbo的一些设计点,为我们编写类似功能提供帮助。
网络上已经有很多文章解析dubbo源码,如果想看源代码解析的就不要看我写的文章。我只介绍dubbo原理性内容。文章里面会尽量使用图介绍。
上图是dubbo官网给出的调用链,里面展示了消息从客户端到服务端经历的各个接口。上面的大部分接口实现都可以通过ServiceConfig、ReferenceConfig修改。后面介绍SPI的时候会在介绍。
dubbo整体分成了若干层。如下:
config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。继承自AbstractConfig。
proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory
registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactory, Registry, RegistryService
cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance
monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter。服务端在本层完成服务注册,服务发布,从Export获取调用器并调用;客户端在本层注册注册中心,创建调用器对象。dubbo的各种访问协议在本层实现。
exchange 信息交换层:扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。本层的作用主要是封装底层对象,对上层提供统一接口。
transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec。Response和Request对象是在本层创建,本层也提供了一些封装功能,更多的是操作mina、netty等工具与远程交互。
serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
上面各层中,注册中心层是在启动的时候,向注册中心注册服务和客户端信息,监听注册中心。
如果我们要编写一个网络访问框架,也可以参考上面的分层架构。