2026-04-13 12:17:24
1. Dubbo 中用 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
可以通信。Dubbo 消费者启动时会从 Zookeeper 拉取生产者的地址等数据并缓存在本地,每次调用时依据本地缓存的地址进行调用。注册中心是对等集群,任意一台宕机后会切换到另一台;全部宕机后,服务提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任一台宕机不影响使用,但全部宕机时服务消费者会无法使用并无限次重连等待服务者恢复。不过,若没有新增服务,调用不受影响;若要调用新服务则无法实现。
2. Dubbo 服务负载均衡策略
3. Dubbo 在安全机制方面的解决方案
4. Dubbo 连接注册中心和直连的区别
动态注册和发现服务,使服务位置透明,通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover。注册中心返回服务提供者地址列表给消费者,有变更时基于长连接推送变更数据给消费者。
服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者调用,调用失败再选另一台。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,三者之间均为长连接(监控中心除外)。注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心立即推送事件通知消费者。
注册中心和监控中心全部宕机不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。
5. Dubbo 服务集群配置(集群容错模式)
在集群调用失败时,Dubbo 提供多种容错方案,缺省为 failover 重试,可自行扩展集群容错策略。
<dubbo:service retries="2" cluster="failover"/>
<dubbo:reference retries="2" cluster="failover"/>
cluster="failover"可不写,因为默认就是 failover。
<dubbo:service cluster="failfast" />
<dubbo:reference cluster="failfast" />
cluster="failfast"和cluster="failover"、retries="0"效果一样,retries="0"表示不重试。
<dubbo:service cluster="failsafe" />
<dubbo:reference cluster="failsafe" />
<dubbo:service cluster="failback" />
<dubbo:reference cluster="failback" />
<dubbo:service cluster="forking" forks="2"/>
<dubbo:reference cluster="forking" forks="2"/>
服务端服务级别:<dubbo:service interface="..." loadbalance="roundrobin" />
客户端服务级别:<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别:<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/></dubbo:service>
客户端方法级别:<dubbo:reference interface="..."> <dubbo:method name="..." loadbalance=
6. Dubbo 通信协议相关问题
适用范围:传入传出参数数据包较小(建议小于 100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用。
补充信息:连接个数为单连接;连接方式为长连接;传输协议为 TCP;传输方式为 NIO 异步传输;序列化为 Hessian 二进制序列化。
采用 JDK 标准的 java.rmi.*实现,采用阻塞式短连接和 JDK 标准序列化方式,是 Java 标准的远程调用协议。
连接个数为多连接;连接方式为短连接;传输协议为 TCP;传输方式为同步传输;序列化为 Java 标准二进制序列化。
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
适用场景:常规远程服务方法调用,与原生 RMI 服务互操作。
用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现基于 Hessian 的远程调用协议。
连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为 Hessian 二进制序列化。
适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
适用场景:页面传输,文件传输,或与原生 hessian 服务互操作。
采用 Spring 的 HttpInvoker 实现,基于 http 表单的远程调用协议。
连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为表单序列化(JSON)。
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或 URL 传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器 JS 使用的服务。
基于 CXF 的 frontend-simple 和 transports-http 实现,基于 WebService 的远程调用协议。
连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为 SOAP 文本序列化。
适用场景:系统集成,跨语言调用。