2020年Java大厂面试专题整理大全---Dubbo面试专题及答案(下)

兄弟姐妹,哪位知道,2020年Java大厂面试专题整理大全---Dubbo面试专题及答案(下)
最新回答
冰依湄凌

2026-04-13 12:17:24

1. Dubbo 中用 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?

可以通信。Dubbo 消费者启动时会从 Zookeeper 拉取生产者的地址等数据并缓存在本地,每次调用时依据本地缓存的地址进行调用。注册中心是对等集群,任意一台宕机后会切换到另一台;全部宕机后,服务提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任一台宕机不影响使用,但全部宕机时服务消费者会无法使用并无限次重连等待服务者恢复。不过,若没有新增服务,调用不受影响;若要调用新服务则无法实现。

2. Dubbo 服务负载均衡策略

  • Random LoadBalance:按权重设置随机概率,权重可在 Dubbo 管控台配置。在一个截面上碰撞概率高,但调用量越大分布越均匀,按概率使用权重后也比较均匀,利于动态调整提供者权重。
  • RoundRobin LoadBalance:按公约后的权重设置轮循比率,存在慢的提供者累积请求问题,例如第二台机器慢但未挂,请求调到该台会卡住,久而久之所有请求都卡在这台。
  • LeastActive LoadBalance:最少活跃调用数,相同活跃数时随机。活跃数指调用前后计数差,使慢的提供者收到更少请求,因为越慢的提供者调用前后计数差越大。
  • ConsistentHash LoadBalance:一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求基于虚拟节点平摊到其它提供者,不会引起剧烈变动。缺省只对第一个参数 Hash,可通过配置<dubbo:parameter key="hash.arguments" value="0,1" />修改;缺省用 160 份虚拟节点,可通过配置<dubbo:parameter key="hash.nodes" value="320" />修改。

3. Dubbo 在安全机制方面的解决方案

  • Token 令牌:防止用户绕过注册中心直连,在注册中心上管理授权。
  • 服务黑白名单:控制服务所允许的调用方。

4. Dubbo 连接注册中心和直连的区别

  • 直连:在开发及测试环境下,常需绕过注册中心测试指定服务提供者,采用点对点直连方式,以服务接口为单位,忽略注册中心的提供者列表。
  • 注册中心:

    动态注册和发现服务,使服务位置透明,通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover。注册中心返回服务提供者地址列表给消费者,有变更时基于长连接推送变更数据给消费者。

    服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者调用,调用失败再选另一台。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,三者之间均为长连接(监控中心除外)。注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心立即推送事件通知消费者。

    注册中心和监控中心全部宕机不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。

5. Dubbo 服务集群配置(集群容错模式)

在集群调用失败时,Dubbo 提供多种容错方案,缺省为 failover 重试,可自行扩展集群容错策略。

  • Failover Cluster(默认):失败自动切换,出现失败时重试其它服务器,通常用于读操作,但重试会带来更长延迟。可通过retries="2"设置重试次数(不含第一次),配置示例:

    <dubbo:service retries="2" cluster="failover"/>

    <dubbo:reference retries="2" cluster="failover"/>

    cluster="failover"可不写,因为默认就是 failover。

  • Failfast Cluster:快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作,如新增记录。配置示例:

    <dubbo:service cluster="failfast" />

    <dubbo:reference cluster="failfast" />

    cluster="failfast"和cluster="failover"、retries="0"效果一样,retries="0"表示不重试。

  • Failsafe Cluster:失败安全,出现异常时直接忽略,通常用于写入审计日志等操作。配置示例:

    <dubbo:service cluster="failsafe" />

    <dubbo:reference cluster="failsafe" />

  • Failback Cluster:失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作。配置示例:

    <dubbo:service cluster="failback" />

    <dubbo:reference cluster="failback" />

  • Forking Cluster:并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作,但会浪费更多服务资源。可通过forks="2"设置最大并行数。配置示例:

    <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 通信协议相关问题

  • dubbo 协议为什么要消费者比提供者个数多:因 dubbo 协议采用单一长连接,假设网络为千兆网卡(1024Mbit = 128MByte),根据测试经验数据每条连接最多只能压满 7MByte(不同环境可能不同),理论上 1 个服务提供者需要 20 个服务消费者才能压满网卡。
  • dubbo 协议为什么不能传大包:因 dubbo 协议采用单一长连接,若每次请求数据包大小为 500KByte,假设网络为千兆网卡,每条连接最大 7MByte(不同环境可能不同),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262;单个消费者调用单个服务提供者的 TPS 最大为:7MByte / 500KByte = 14。若能接受可考虑使用,否则网络将成为瓶颈。
  • dubbo 协议为什么采用异步单一长连接:因为服务现状大都是服务提供者少,通常只有几台机器,而服务消费者多,可能整个网站都在访问该服务。例如 Morgan 的提供者只有 6 台,却有上百台消费者,每天有 1.5 亿次调用。如果采用常规的 hessian 服务,服务提供者很容易被压跨。通过单一连接保证单一消费者不会压死提供者,长连接减少连接握手验证等,并使用异步 IO,复用线程池,防止 C10K 问题。
  • dubbo 协议适用范围和适用场景:

    适用范围:传入传出参数数据包较小(建议小于 100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。

    适用场景:常规远程服务方法调用。

    补充信息:连接个数为单连接;连接方式为长连接;传输协议为 TCP;传输方式为 NIO 异步传输;序列化为 Hessian 二进制序列化。

  • RMI 协议:

    采用 JDK 标准的 java.rmi.*实现,采用阻塞式短连接和 JDK 标准序列化方式,是 Java 标准的远程调用协议。

    连接个数为多连接;连接方式为短连接;传输协议为 TCP;传输方式为同步传输;序列化为 Java 标准二进制序列化。

    适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。

    适用场景:常规远程服务方法调用,与原生 RMI 服务互操作。

  • Hessian 协议:

    用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现基于 Hessian 的远程调用协议。

    连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为 Hessian 二进制序列化。

    适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。

    适用场景:页面传输,文件传输,或与原生 hessian 服务互操作。

  • http 协议:

    采用 Spring 的 HttpInvoker 实现,基于 http 表单的远程调用协议。

    连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为表单序列化(JSON)。

    适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或 URL 传入参数,暂不支持传文件。

    适用场景:需同时给应用程序和浏览器 JS 使用的服务。

  • Webservice 协议:

    基于 CXF 的 frontend-simple 和 transports-http 实现,基于 WebService 的远程调用协议。

    连接个数为多连接;连接方式为短连接;传输协议为 HTTP;传输方式为同步传输;序列化为 SOAP 文本序列化。

    适用场景:系统集成,跨语言调用。

  • Thrift 协议:Thrift 是 Facebook 捐给 Apache 的一个 RPC 框架,当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,如 service name,magic number 等。