Dubbo入门
Apache Dubbo是⼀款易⽤、⾼性能的WEB和RPC框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能⼒、⼯具与最佳实践。
1. Dubbo的发展
- 早期Dubbo的定位: 基于JAVA的⾼性能,轻量级RPC框架。SOA(⾯向服务的架构) = RPC+服务治理
- 2018年阿⾥巴巴把这个框架捐献给了Apache基⾦会,正式更名为Apache Dubbo。最新版本为Dubbo3.x
- Dubbo3.3.0版本开始正式支持JDK17
2. SOA与微服务
时至今⽇,SOA与微服务架构基本可以统⼀成⼀个概念了。微服务是SOA架构的升级,在微服务体系统中,没有⼦系统了,全部都是服务化功能。微服务架构代表框架,SpringCloud, DNS。
3. Dubbo工作架构
架构上分为两层:服务治理抽象控制面和Dubbo数据面
- 服务治理控制面:Dubbo服务治理抽象层,一般不用关心开发直接使用现有组件。具体实现有协调服务发现的注册中心、流量管控策略、Dubbo Admin控制台等。
- Dubbo数据面:数据面代表集群部署的所有Dubbo程序,程序之间通过RPC协议实现数据交换,需要我们进行编码开发具体的实现逻辑。
- 服务消费者(Dubbo Consumer),发起业务调用或RPC通信的Dubbo程序。
- 服务提供者(Dubbo Provider),接收业务调用或RPC通信的Dubbo程序。
5. Dubbo的RPC协议
Dubbo内置两款高性能协议实现:
- Dubbo2协议是在TCP传输层协议之上设计的二进制通信协议,缺点是通用性较差,更适合在Dubbo服务间使用。
- Triple协议是基于HTTP/2之上构建的支持流式模式的通信协议,并且Triple完全兼容gRPC并丰富了gRPC,支持发布REST风格的 HTTP服务。
6. Dubbo微服务生态
6.1 服务注册和发现
支持Nacos、Zookeeper、Consul注册中心。
6.2 负载均衡
Dubbo内置提供加权随机、加权轮询、最少活跃请求数优先、最短响应时间优先、一致性哈希和自适应负载等策略。
6.3 熔断降级
Dubbo内置支持一套服务调用的流量控制规则,基于这些规则可以实现基于权重的比例流量分发、灰度验证、金丝雀发布、按请求参数的路由、同区域优先、超时配置、重试、限流降级等能力。
6.4 链路追踪
支持Skywalking、Zipkin对Tracing全链路追踪支持。
6.4 服务监控
提供Dubbo Admin工具对Dubbo集群的管控工作。
7. Dubbo与SpringCloud比较
7.1 相同点
- Dubbo和SpringCloud都提供整套微服务整体解决方案,让开发者在开发微服务应用时可以更加专注在业务逻辑开发上。
- Dubbo和SpringCloud都完全兼容Spring体系的应用开发模式。
7.2 SpringCloud的劣势
- SpringCloud只提供定义不提供官方稳定实现,开发者只能寻求类似Netflix、Alibaba、Azure等不同厂商的实现套件,而每个厂商支持的完善度、稳定性、活跃度各异。
- 有微服务全家桶却不是能拿来就用的全家桶,demo上手容易,但落地推广与长期使用的成本非常高。
- 代码开发与通信协议绑定HTTP,在性能、与其他RPC体系互通上存在不足。
- 服务治理能力不高,尤其是流量管控方面如负载均衡、流量路由方面能力都比较弱。
- 总体架构与实现只适用于小规模微服务集群实践,当集群规模增长后就会遇到地址推送效率、内存占用等各种瓶颈的问题,但此时迁移到其他体系却很难实现。
- 很多微服务实践场景的问题需要用户独自解决,比如优雅停机、启动预热、服务测试,再比如双注册、双订阅、延迟注册、服务按分组隔离、集群容错等。
7.3 SpringCloud的优势
- 同样都支持Spring开发体系的情况下,SpringCloud得到更多的官方支持。
- 基于HTTP的通信模式,让开发者更易于上手。
7.4 Dubbo的优势
- 在通信协议和编码上选择更灵活,包括rpc通信层协议如HTTP、HTTP/2(Triple、gRPC)、TCP二进制协议、rest等,序列化编码协议Protobuf、JSON、Hessian2等,支持单端口多协议。
- 提供高性能的RPC协议编码与实现。
- Dubbo从设计上突出服务服务治理能力,如权重动态调整、标签路由、条件路由等。
- Dubbo是在超大规模微服务集群实践场景下开发的框架,可以做到百万实例规模的集群水平扩容,应对集群增长带来的各种问题。
- Dubbo提供Java外的多语言实现,使得构建多语言异构的微服务体系成为可能。