Dubbo学习笔记
Dubbo学习笔记
FANSEA集群与分布式概念
dubbo服务架构
Zookeeper注册中心
Dubbo高级特性
序列化
pojo对象必须实现serializable接口才能进行消费者和生产者数据传递
1 | public class User implement serializable{ |
地址缓存
当注册中心挂掉之后,服务调用者不会因为这个原因而无法远程调用方法:
因为当第一次远程调用时,他虽然会从注册中心获取方法地址,但是也会保存此地址于本机缓存中,所以下次调用不需要经过注册中心
超时与重试
1 | //超时时间3秒,重试两次,一共执行三次 |
多版本
通过指定版本注入;降低代码耦合,提高可扩展性。
1 | //超时时间3秒,重试两次,一共执行三次 |
1 |
|
负载均衡
使用方式
1 | //远程注入userService,并选择负载均衡模式 |
集群容错
调用服务出错重试
1 | //选择集群容错模式 |
服务降级
1 | //设置为降级服务 |
Dubbo与Spring Cloud的区别
Dubbo的通信协议对比
Dubbo 支持多种通信协议,不同的协议在性能、兼容性、适用场景上有所差异。以下是 Dubbo 主要通信协议的详细介绍及其特点:
Dubbo 协议(默认协议)
- 协议类型:基于 TCP 的长连接协议(二进制传输)。
- 特点:
- 高性能:采用单一长连接 + NIO 异步通信,减少连接数,适合高并发、小数据量的服务调用。
- 多路复用:单个连接支持多请求并发,降低资源消耗。
- 序列化:默认使用 Hessian2 序列化(可配置为 Kryo、Protobuf 等),压缩率高。
- 适用范围:适合服务间高频调用(如内部微服务调用)。
- 缺点:
- 跨语言支持弱:依赖 Java 接口定义,非 Java 语言对接复杂。
- 防火墙不友好:基于自定义 TCP 端口,可能被企业防火墙拦截。
配置示例:
1 | <dubbo:protocol name="dubbo" port="20880" /> |
Triple 协议(Dubbo 3.0+ 推荐协议)
- 协议类型:基于 HTTP/2 和 gRPC 标准的协议,兼容 gRPC 生态。
- 特点:
- 跨语言友好:完全兼容 gRPC,支持多语言客户端(Java、Go、Python 等)。
- Streaming 通信:支持 Request-Response、Streaming(如服务端流、客户端流)。
- 云原生适配:无缝对接 Kubernetes、Service Mesh(如 Istio)。
- 安全性:支持 TLS 加密,符合云原生安全标准。
- 适用场景:
- 需要跨语言协作的微服务架构。
- 需要流式通信(如实时数据传输)。
- 云原生环境(如 Kubernetes + Istio)。
配置示例:
1 | <dubbo:protocol name="tri" port="50051" /> |
HTTP 协议(RESTful)
- 协议类型:基于 HTTP/1.1 的 RESTful 风格协议。
- 特点:
- 通用性强:易于通过浏览器或工具(如 Postman)调试。
- 跨语言支持:所有语言均可通过 HTTP 调用。
- 防火墙友好:使用 80/443 端口,穿透性强。
- 缺点:
- 性能较低:文本传输(如 JSON/XML)开销大,无多路复用。
- 无长连接:每次请求需重新建立连接,不适合高频调用。
配置示例:
1 | <dubbo:protocol name="http" port="8080" /> |
gRPC 协议
- 协议类型:基于 HTTP/2 的高性能 RPC 协议。
- 特点:
- 高性能:二进制传输 + 多路复用,延迟低、吞吐高。
- 跨语言:支持所有 gRPC 官方语言(Java、Go、C++ 等)。
- IDL 强约束:通过 Protobuf 定义接口,保证接口一致性。
- 适用场景:
- 多语言微服务架构。
- 需要强类型接口约束的场景。
配置示例:
1 | <dubbo:protocol name="grpc" port="9090" /> |
其他协议
Dubbo 还支持以下协议,但使用频率较低:
- RMI 协议:基于 Java 原生 RMI,依赖 Java 序列化,仅限 Java 间通信。
- Hessian 协议:基于 HTTP 的二进制协议,跨语言支持较好(如 Java、Python)。
- WebService 协议:基于 SOAP 的 XML 协议,适合遗留系统集成。
- Thrift 协议:类似 gRPC,需通过 Thrift IDL 定义接口。
协议选择建议
场景 | 推荐协议 | 理由 |
---|---|---|
内部 Java 服务高频调用 | Dubbo 协议 | 性能最优,长连接复用 |
多语言协作或云原生环境 | Triple/gRPC | 兼容 gRPC 生态,支持 Streaming 和 HTTP/2 |
对外暴露 RESTful API | HTTP 协议 | 通用性强,易于调试和集成 |
需要强类型接口约束 | gRPC 协议 | Protobuf 定义接口,跨语言一致性高 |
协议配置关键参数
在 dubbo:protocol
中可配置以下核心参数:
name
:协议名称(如dubbo
,tri
,http
)。port
:服务监听端口(-1 表示自动分配)。serialization
:序列化方式(如hessian2
,kryo
,protobuf
)。threads
:业务线程池大小。payload
:最大允许的数据包大小(防止 OOM)。
总结
- Dubbo 协议:默认选择,适合高性能 Java 服务间调用。
- Triple/gRPC:未来趋势,适合云原生和多语言场景。
- HTTP 协议:对外暴露 RESTful API 或简单调试时使用。
- 根据业务需求(性能、跨语言、调试便捷性)和架构环境(云原生、Service Mesh)选择合适的协议。
Dubbo启动bug
KeeperErrorCode = Unimplemented
Dubbo的curator版本和服务端Zookeeper版本不兼容,降低curator版本