Dubbo学习笔记

集群与分布式概念

image-20231011152301603

dubbo服务架构

image-20231012095823723

Zookeeper注册中心

启动Zookeeper(点击zkServer启动)

Dubbo高级特性

序列化

pojo对象必须实现serializable接口才能进行消费者和生产者数据传递

1
2
3
4
public class User implement serializable{
private String name;
private Long password;
}

地址缓存

当注册中心挂掉之后,服务调用者不会因为这个原因而无法远程调用方法:

因为当第一次远程调用时,他虽然会从注册中心获取方法地址,但是也会保存此地址于本机缓存中,所以下次调用不需要经过注册中心

超时与重试

1
2
3
4
5
6
@DubboService(timeout = 3000,retries = 2)//超时时间3秒,重试两次,一共执行三次
public class UserServiceImpl implement UserService{
public User finUser(String name){
return new User(name,"123456")
}
}

多版本

通过指定版本注入;降低代码耦合,提高可扩展性。

1
2
3
4
5
6
7
8
9
10
11
12
@DubboService(version = "1.0")//超时时间3秒,重试两次,一共执行三次
public class UserServiceImpl implement UserService{
public User finUser(String name){
return new User(name,"123456")
}
}
@DubboService(version = "2.0")//超时时间3秒,重试两次,一共执行三次
public class UserServiceImpl2 implement UserService{
public User finUser(String name){
return new User(name,"123456")
}
}
1
2
@Reference(version = "1.0")
UserService userService;

负载均衡

image-20231014143228335

使用方式

1
2
@Reference(loadbalance = "random")//远程注入userService,并选择负载均衡模式
private UserService userService;

集群容错

调用服务出错重试

image-20231014150845237

1
2
@Reference(cluster = "failover")//选择集群容错模式
private UserService userService;

服务降级

image-20231014151502689

image-20231014151349809

1
2
@Reference(mock = "force:return null")//设置为降级服务
private UserService userService;

Dubbo与Spring Cloud的区别

image-20250412231625538

Dubbo的通信协议对比

Dubbo 支持多种通信协议,不同的协议在性能、兼容性、适用场景上有所差异。以下是 Dubbo 主要通信协议的详细介绍及其特点:


Dubbo 协议(默认协议)

  • 协议类型:基于 TCP 的长连接协议(二进制传输)。
  • 特点
    • 高性能:采用单一长连接 + NIO 异步通信,减少连接数,适合高并发、小数据量的服务调用。
    • 多路复用:单个连接支持多请求并发,降低资源消耗。
    • 序列化:默认使用 Hessian2 序列化(可配置为 Kryo、Protobuf 等),压缩率高。
    • 适用范围:适合服务间高频调用(如内部微服务调用)。
  • 缺点
    • 跨语言支持弱:依赖 Java 接口定义,非 Java 语言对接复杂。
    • 防火墙不友好:基于自定义 TCP 端口,可能被企业防火墙拦截。

配置示例

1
<dubbo:protocol name="dubbo" port="20880" />

Triple 协议(Dubbo 3.0+ 推荐协议)

  • 协议类型:基于 HTTP/2gRPC 标准的协议,兼容 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版本