跳转至

Dubbo 使用过程经典踩坑

一、超时与重试

问题

默认 timeout=1000retries=2(即第一次失败后再试 2 次,共 3 次调用)。如果接口本身慢,会导致:

  • 服务端被重复调用(接口不幂等就重复扣款)。
  • 调用方超时,服务端其实成功了。

解决

  • 写操作必须显式设 retries="0"
    @Reference(timeout = 3000, retries = 0)
    
  • 读操作可以保留重试。
  • 业务接口必须设计成幂等。

二、泛化调用与序列化

问题

服务端改了字段(加字段、改类型),客户端没升级,可能反序列化失败。

解决

  • DTO 只加字段,不改字段类型。
  • 不用的字段不要删,用 @Deprecated
  • 接口演进要向后兼容。

三、找不到服务 / No provider

常见原因

  1. 注册中心地址不对。
  2. 服务端没启动 / 没注册成功。
  3. 客户端 group / version 不匹配。
  4. 网络不通(安全组、端口)。

排查:dubbo-admin 看提供者列表。

四、慢调用拖垮线程池

问题

某个下游接口变慢,所有调用线程都阻塞在那里,Tomcat / Dubbo 业务线程池耗尽,整个应用假死。

解决

  • 超时必须设置,不能无限等。
  • 配合 Sentinel / Resilience4j 做熔断降级。
  • 隔离线程池:不同服务用不同线程池,互不影响。

五、大对象 / 大附件

一次 RPC 传几 MB 的对象会:

  • 序列化慢。
  • 占满网络连接。
  • 触发超时。

解决:用文件存储 + URL 传递,不要直接传大对象。

六、循环依赖 / 启动慢

Dubbo 服务引用是懒连接(默认),第一次调用才连。如果启动时就要验证,配 check=trueinit=true

七、与 Spring Boot 版本兼容

  • Dubbo 2.7+ 支持 spring-boot-starter
  • 老版本 XML 配置在 Spring Boot 2.x 可能不生效。

八、序列化协议选择

  • Hessian2:默认,跨语言,但性能一般。
  • Protostuff / Kryo:更快,但要注册。
  • 同一集群所有提供者、消费者必须用同一序列化协议。

九、优雅上下线

  • 应用重启时,先从注册中心注销,等一段时间(如 10s)再停进程,避免请求打过来。
  • K8s 环境配合 preStop hook。

一句话

Dubbo 的坑大多来自:超时没设、重试没关、序列化不兼容、下游慢拖垮自己