相信开发人员对 Dubbo 都不会陌生,工作中对服务间的调用也常常使用 Dubbo 进行 RPC 调用。在开发中一般都是对方提供一个 API 接口,我方引入依赖,加上注解,然后就可以进行通信了。
本着知其所以然的目的,翻查资料,阅读源码,一起深入了解一下 Dubbo 的原理。
什么是 Dubbo ?
Apache Dubbo 是一款高性能、轻量级的开源服务框架。
Apache Dubbo |ˈdʌbəʊ| 提供了六大核心能力:面向接口代理的高性能 RPC 调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
这六大核心能力分别是:
- 面向接口代理的高性能 RPC 调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
- 智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
- 服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
- 高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如 Protocol、Transport、Serialization 被设计为扩展点,平等对待内置实现和第三方实现。
- 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
- 可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
通过官方回答可以提炼出以下要点:代理
、负载均衡
、注册发现
、扩展
、流量调度
等等。
这些也是后面需要深入了解的方向,比如:
- Dubbo 是如何通过代理实现接口调用的?
- Dubbo 是如何实现负载均衡的?
- Dubbo 的服务注册与发现是如何实现的?
- ……
下面通过官网资料,进一步了解 Dubbo 的架构设计。
框架设计
部署架构
- Registry 注册中心:协调 Consumer 与 Provider 之间的地址注册与发现
- Provider 提供者:暴露服务的服务提供方
- Consumer 消费者:通过 RPC 调用服务的消费方
- Monitor 监控中心:监控服务调用次数和时间等数据
- Container 容器:服务运行容器
这是一个通用部署架构,在 Dubbo 3.0 中对架构进行了调整优化。除了注册中心,还有配置中心和元数据中心,具体内容可以参考官方说明。
整体设计
在 Dubbo 2.7 中,提供了一份框架设计图:
对 Dubbo 3.0 而言,这块变动应该不大。
各层说明
- config 配置层:对外配置接口,以
ServiceConfig
,ReferenceConfig
为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 - 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
- exchange 信息交换层:封装请求响应模式,同步转异步,以
Request
,Response
为中心,扩展接口为Exchanger
,ExchangeChannel
,ExchangeClient
,ExchangeServer
- transport 网络传输层:抽象 mina 和 netty 为统一接口,以
Message
为中心,扩展接口为Channel
,Transporter
,Client
,Server
,Codec
- serialize 数据序列化层:可复用的一些工具,扩展接口为
Serialization
,ObjectInput
,ObjectOutput
,ThreadPool
调用链
总结
本文主要通过官方资料,了解到 Dubbo 的概念、部署架构、整体设计以及调用链。了解这些基本概念后,可以进一步结合工作、源码做更深入的研究。