Dubbo3 源码系列 -- 新特性解读(初见篇)
| 日期 | 更新说明 |
|---|---|
| 2022年4月22日 | 初版编辑 |
"人生若只如初见,何事秋风悲画扇"
突然发现断断续续的技术文章有些年头了,最近几年好像突然停止了;之前的“专心练剑”的思路有些偏差或是接口输出,启示想想初把自己学到的东西分享出来,就是自己对于内容的输入(可以简单解读为“费曼学习”);总之,对于自己是输出总结,对于读者来说,如果有一点点的启示或者共鸣,那也是极好的呀!
前言
如果说有个技术架构可以让你接触大部分主流的微服务框架主流内容(服务的注册发现、服务治理、服务RPC、服务熔断等);如果说还有那么一个技术架构可以带你了解云原生和“下一代微服务”server mesh ,如果说这些内容可以让你学习这些内容的话只需要一个框架的话,我个人推荐是 Dubbo3 ;而她刚好满足如上所述的特点,哈哈有点广告的味道,看看官方是怎么说的:
Dubbo3 基于 Dubbo2 演进而来,在保持原有核心功能特性的同时, Dubbo3 在易用性、超大规模微服务实践、云原生基础设施适配、安全设计等几大方向上进行了全面升级。
那么让我来一起来看看Dubbo3 到底更新了那些内容吧。
Dubbo3 新特性篇
全新服务发现模型 -- 基于接口
3.x 引入了全新的基于应用粒度的服务发现机制;其实改功能在社区版 2.7.5中已经得到了升级。这样带来的好处如下:
- 新模型可大幅提高系统资源利用率,降低 Dubbo 地址的单机内存消耗(50%),降低注册中心集群的存储与推送压力(90%), Dubbo 可支持集群规模步入百万实例层次
对于使用Dubbo的大规模服务的服务节点,性能方面和云方向都是优化提升,降低注册中心的集群压力;具体分析查阅《Dubbo3 版本的 基准测试》;当然Dubbo3目前也是支持两种服务模式;如果考虑迁移的参考该文章 《应用级地址发现迁移指南》。
- 对齐其他微服务的架构(Spring Cloud、Kubernetes Service、gRPC 等)服务注册发现的标准;这对于服务行业标准统一也是好的改善。
全新的RPC 通信协议 -- Triple
Triple完全兼容 gRPC,并在协议层面扩展了负载均衡和流量控制相关机制;可谓是站在巨人的肩膀上,同时拥有gRPC的在K8S服务等同等的优势:
- IDL的语言
使用Protobuf 的序列化和IDL的服务,具有通用性。 - 天然支持跨语言调用
基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub
序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架 - 基于Http2
支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性
Dubbo3 采用了全新的协议,同时对于扩展了负载均衡和流量控制;这个协议的扩展其实是对于gRPC在云原生尤其是Kubernetes 平台接入做好准备。
全新的生态接入 -- 云原生
Dubbo3 构建的业务应用可直接部署在 VM、Container、Kubernetes 等平台,Dubbo3 很好的解决了 Dubbo 服务与调度平台之间的生命周期对齐,Dubbo 服务发现地址 与容器平台绑定的问题。
官方原文,这个后面在Dubbo3的源码中有体现,建议直接背诵吧。
提到云原生的 service mesh技术必不可少;Dubbo3更多考虑流量控制交给控制面Servicemesh 完成;其规划了两种形态的 Service Mesh 方案:
- 经典的基于 Sidecar 的 Service Mesh
- 无 Sidecar 的 Proxyless Mesh
用户在 Dubbo2 中熟知的路由规则,在 3.x 中将被一套统一的流量治理规则取代,这套统一流量规则将覆盖未来 Dubbo3 的 Service Mesh、SDK 等多种部署形态, 实现对整套微服务体系的治理
新的maven 项目结构的变化
由原来的all-in-one 包,一些可选的依赖已经作为独立组件单独发布;如果用户使用了不在 dubbo 核心依赖包中的独立组件,如 registry-etcd、rpc-hessian 等,需要为这些组件在 pom.xml 中单独增加依赖包。
得利与Dubbo的SPI机制,使得扩展更加方便也给用户自定义扩展带来更多的便利。
服务柔性 -- 尚未实现
简单理解,由于统一的流量治理规则使得流量治理的可以实现云原生时代的自适应和动态流控。
以下官方原文:
Dubbo3.0 的柔性增强以面向失败设计为理念,提供包括精准容量评估、自适应限流、自适应负载均衡的支持,自底向上的分步构建大规模可靠应用。 从单一服务的视角看,服务是压不垮的,稳定的。从分布式视角看,复杂的拓扑不会带来性能的下降,分布式负载均衡能够以最优的方式动态分配流量,保证异构系统能够根据运行时的准确服务容量合理分配请求,从而达到性能最优。
Dubbo3 新特性实践篇
看了很多的理论;一起来“Just Do IT”(为啥T大写,请自行体会这里“梗”吧)
trible协议体验
代码搭建
- 下载源码
git clone git clone https://github.com/apache/dubbo-samples.git
dubbo-samples模块编译构建(保证proto文件可以编译Java版本)
mvn clean install -Dmaven.test.skip=true
- 启动一下Zookeeper
- 运行
org.apache.dubbo.sample.tri.stub.TriStubServer
验证
- 使用
postman作为grpc的客户端发起测试
主要体验下postman的最新特性;注意:postm>=9.14的版本;当然你要是 go的话那个更好,笔者写的时候发现postman已经可以满足我的需求了;关于操作录制了一个gif图,方便理解:
- 后台日志:
[10:18:34:034] INFO stub.GreeterImpl: Server tri-stub received greet request name: "mollit Excepteur irure Ut"