相信开发人员对 Dubbo 都不会陌生,工作中对服务间的调用也常常使用 Dubbo 进行 RPC 调用。在开发中一般都是对方提供一个 API 接口,我方引入依赖,加上注解,然后就可以进行通信了。

本着知其所以然的目的,翻查资料,阅读源码,一起深入了解一下 Dubbo 的原理。

什么是 Dubbo ?

Dubbo 概念及架构 - 图1

Apache Dubbo 是一款高性能、轻量级的开源服务框架。
Apache Dubbo |ˈdʌbəʊ| 提供了六大核心能力:面向接口代理的高性能 RPC 调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。

这六大核心能力分别是:

  1. 面向接口代理的高性能 RPC 调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
  2. 智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
  3. 服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
  4. 高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如 Protocol、Transport、Serialization 被设计为扩展点,平等对待内置实现和第三方实现。
  5. 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
  6. 可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

通过官方回答可以提炼出以下要点:代理负载均衡注册发现扩展流量调度等等。

这些也是后面需要深入了解的方向,比如:

  • Dubbo 是如何通过代理实现接口调用的?
  • Dubbo 是如何实现负载均衡的?
  • Dubbo 的服务注册与发现是如何实现的?
  • ……

下面通过官网资料,进一步了解 Dubbo 的架构设计。

框架设计

部署架构

Dubbo 概念及架构 - 图2

  • Registry 注册中心:协调 Consumer 与 Provider 之间的地址注册与发现
  • Provider 提供者:暴露服务的服务提供方
  • Consumer 消费者:通过 RPC 调用服务的消费方
  • Monitor 监控中心:监控服务调用次数和时间等数据
  • Container 容器:服务运行容器

这是一个通用部署架构,在 Dubbo 3.0 中对架构进行了调整优化。除了注册中心,还有配置中心元数据中心,具体内容可以参考官方说明。

整体设计

Dubbo 2.7 中,提供了一份框架设计图:

Dubbo 概念及架构 - 图3

对 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 概念及架构 - 图4

总结

本文主要通过官方资料,了解到 Dubbo 的概念、部署架构、整体设计以及调用链。了解这些基本概念后,可以进一步结合工作、源码做更深入的研究。