dubbo

Dubbo RPC 服务治理与运维

补充说明

dubbo 是 Apache 的 Java RPC 框架,核心角色是 Provider、Consumer 和注册中心。Provider 暴露接口与协议端口,Consumer 从注册中心订阅地址并负载均衡调用;注册中心只保存元数据,不转发业务流量。

它解决服务发现、负载均衡、超时、重试、熔断、泛化调用和多协议接入。默认 dubbo 协议基于长连接和 Hessian2 序列化,适合内部 Java 服务;Triple 协议基于 HTTP/2 和 protobuf,适合跨语言与网关。与 gRPC 相比,Dubbo 的治理能力和 Java 接口绑定更强;与 REST 相比,它更适合低延迟的内部调用。

注册中心常用 Nacos 和 ZooKeeper:ZooKeeper 是 CP、临时节点加 Watch,会话过期会摘除实例;Nacos 支持 AP/CP、推送和健康检查,配置中心与注册中心可合一。Dubbo 3 的应用级服务发现会减少注册中心地址数量,但接口级路由与治理规则仍需理解。

常用示例

java -jar provider.jar --dubbo.protocol.port=20880
java -jar consumer.jar --dubbo.registry.address=nacos://127.0.0.1:8848
telnet 127.0.0.1 22222
ls
ps
cd com.example.UserService
ls
invoke sayHello("world")
online
offline
shutdown

QoS 的 invoke 是泛化调用,参数按 JSON 风格书写;online/offline 控制 Provider 上下线。代码侧泛化调用:

ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
reference.setInterface("com.example.UserService");
reference.setGeneric("true");
GenericService service = reference.get();
Object result = service.$invoke(
    "sayHello", new String[]{"java.lang.String"}, new Object[]{"world"});

注解与超时重试:

@DubboService(version = "1.0.0")
public class UserServiceImpl implements UserService { }

@DubboReference(version = "1.0.0", check = false, timeout = 500, retries = 0, cluster = "failfast")
private UserService userService;

常见配置

dubbo.application.name=order-service
dubbo.application.qos-enable=true
dubbo.application.qos-port=22222
dubbo.application.qos-accept-foreign-ip=false
dubbo.registry.address=nacos://127.0.0.1:8848
dubbo.registry.group=dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.protocol.serialization=hessian2
dubbo.consumer.timeout=1000
dubbo.consumer.retries=2
dubbo.consumer.check=false
dubbo.consumer.cluster=failover
dubbo.consumer.loadbalance=random

默认值:dubbo 协议端口 20880、调用超时 1000ms、重试 2 次(共 3 次调用)、集群容错 failover、负载均衡 random;QoS 端口 22222,qos-accept-foreign-ip 默认 false。Triple 协议默认端口 50051,切换协议时客户端与防火墙都要改。

易错点与排错

相关命令

读完自测

  1. Dubbo 的默认超时和重试次数是多少,为什么非幂等接口要关闭重试?
  2. ZooKeeper 与 Nacos 作为注册中心的关键差异是什么?
  3. QoS 的 invoke 和 online/offline 分别有什么风险或用途?
答案
  1. 默认 timeout 1000ms、retries 2(共 3 次);超时也会重试,非幂等写会产生重复数据。
  2. ZooKeeper 是 CP、临时节点加 Watch;Nacos 支持 AP/CP、推送和健康检查,并可兼作配置中心。
  3. invoke 可泛化调用任意方法,暴露公网风险极高;online/offline 用于优雅上下线,会改变注册中心可见性。