Dubbo是阿里开源的的rpc框架,现已成为Apache的顶级项目。Dubbo在国内的大公司中使用较多,具有良好的服务治理能力。
在阿里停止维护一段时间后,2017年又重新开始维护,2.x的最新版本为2.7版本。2021年Dubbo更新到了3.0版本,相对于2.x版本,有了巨大的变化。博主将通过两篇文章分别对dubbo2和dubbo3进行简单的介绍,本文主要介绍dubbo3。
RPC框架原理与实践
Dubbo原理与实践(1)
Dubbo原理与实践(2)
dubbo3 与 dubbo2 的服务发现配置是完全一致的,不需要改动什么内容。
但就实现原理上而言,dubbo3 引入了全新的服务发现模型,即应用级服务发现(dubbo2是接口级的), 在工作原理、数据格式上已完全不能兼容老版本服务发现。
dubbo3 格式的 Provider 地址不能被 dubbo2 的 Consumer 识别到,反之 Dubbo2 的消费者也不能订阅到 dubbo3的Provider。
dubbo3 默认保持了接口级地址发现的行为,这保证了dubbo2用户可以直接无感升级到 dubbo3。
而如果要开启应用级服务发现,则需要通过配置显式开启(双注册、双订阅)。
应用级服务发现
概括来说,dubbo3 引入的应用级服务发现主要有以下优势:
下面举个例子来说明dubbo3 服务发现模型在性能提升和可伸缩性方面的优势:
假设一个微服务应用定义了 100 个接口(dubbo 中的服务),则需要往注册中心中注册 100 个服务,如果这个应用被部署在了 100 台机器上,那这 100 个服务总共会产生 100 * 100 = 10000 个虚拟节点;而同样的应用, 对于 dubbo3 来说,新的注册发现模型只需要 1 个服务(只和应用有关和接口无关), 只注册和机器实例数相等的 1 * 100 = 100 个虚拟节点到注册中心。
在这个简单的示例中,dubbo 所注册的地址数量下降到了原来的 1 / 100,对于注册中心、订阅方的存储压力都是一个极大的释放。更重要的是, 地址发现容量彻底与业务 RPC 定义解耦开来,整个集群的容量评估对运维来说将变得更加透明:部署多少台机器就会有多大负载,不会像 dubbo2 一样, 因为业务 RPC 重构就会影响到整个集群服务发现的稳定性。
Dubbo3 提供了 Triple(dubbo3)、dubbo2 协议,这是 dubbo 框架的原生协议。
除此之外,dubbo3 也对众多第三方协议进行了集成,并将它们纳入 dubbo 的编程与服务治理体系, 包括 gRPC、Thrift、JsonRPC、Hessian2、REST 等。以下重点介绍 Triple 与 Dubbo2 协议。
Triple协议是dubbo3推出的主力协议,它是在dubbo1和dubbo2两代协议的基础上,适应云原生技术标准化浪潮而产生的。
协议是rpc的核心,它规范了数据在网络中传输的内容和格式。除了必须的请求,响应数据外,通常还包括额外的控制数据,如单次请求的序列化方式、超时时间,压缩方式和鉴权信息等。
rpc协议的的设计需要考虑如下内容:
- 通用性:统一的二进制格式,跨语言,跨平台,多传输层协议支持。
- 扩展性:协议增加字段,升级,支持用户扩展和附加业务数据。
- 性能:越快越好。
- 穿透性:能够被各种终端设备识别和转发,如网关和代理服务器等。
事实上,rpc协议主要包括两部分内容,通信协议和序列化协议,具体可参见本文开头列出的rpc框架原理与实践。这里主要介绍通信协议。
RPC的通信协议可以基于tcp,也可以基于http。相比构建于tcp传输层的私有rpc通信协议,构建于http之上的通信解决方案具有更好的通用性,如webServices或者REST架构。
选择构建于http之上的rpc通信协议,有两个明显的优势:
当然,也存在比较明显的问题:
dubbo2的通信协议是基于tcp的,google的gRpc则是基于http2之上。
gRpc的优势由http2和protobuf继承而来:
但是也存在部分问题:
Dubbo3最终选择兼容 gRPC ,以 http2 为基础构建新的协议,也就是 Triple。
容器化应用程序和微服务的兴起促进了针对负载内容优化技术的发展。客户端中使用的传统通信协议(Restful或其他基于HTTP的自定义协议)难以满足应用在性能、可维护性、扩展性和安全性等方面的需求。一个跨语言、模块化的协议会逐渐成为新的应用开发协议标准。自从2017年gRPC协议成为CNCF的项目后,包括k8s、etcd等越来越多的基础设施和业务都开始使用gRPC的生态,作为云原生的微服务框架,Dubbo的新协议也完美兼容了gRPC。并且,对于gRPC协议中的一些不完善的部分,Triple也将进行增强和补充。
那么,Triple协议是否解决了上面提到的一系列问题呢?
Triple协议现状
Triple特点和优势
在API领域,最重要的趋势是标准化技术的崛起。Triple协议是Dubbo3推出的主力协议。它采用分层设计,其数据交换格式基于Protobuf协议开发,具备优化的序列化/反序列化效率。当然还支持多种其他的序列化方式,支持多语言。在传输层协议上,Triple选择了HTTP/2,相较于HTTP/1.1,其传输效率有了很大提升。此外,HTTP/2作为一个成熟的开放标准,具备丰富的安全、流控等能力,同时拥有良好的互操作性。Triple不仅可以用于Server服务端调用,也可以支持浏览器、移动APP和IoT设备与后端服务的交互,同时Triple协议无缝支持Dubbo3的全部服务治理能力。
在Cloud Native的潮流下,跨平台、跨厂商、跨环境的系统间互操作性的需求必然会催生基于开发标准的RPC技术,而gRPC顺应了历史趋势,得到了越来越广泛的应用。在微服务领域,Triple协议的提出和落地,是Dubbo3迈上云原生微服务的一大步。
[1]. https://dubbo.apache.org/zh/docs/v3.0/