Skip to content

Dubbo服务框架面试题库 ​

生成时间:2026-05-24 19:44


【面试题】1. Dubbo的五大核心角色是什么?请简述服务调用的完整流程。 ​

【标准答案】Dubbo架构包含五个核心角色:

Provider(服务提供者):暴露服务的应用,提供服务实现。 Consumer(服务消费者):调用远程服务的应用。 Registry(注册中心):负责服务注册与发现,如Zookeeper、Nacos。 Monitor(监控中心):统计服务调用次数和耗时。 Container(服务容器):负责启动、加载、运行服务提供者。

完整调用流程: 服务启动时,Provider向Registry注册服务地址;Consumer向Registry订阅服务;Registry返回Provider列表给Consumer;Consumer基于负载均衡策略选择Provider发起调用;调用过程被Monitor记录统计。整个流程是服务暴露→注册→发现→调用→监控的闭环设计。


【面试题】2. Dubbo的负载均衡策略有哪些?各自适用什么场景? ​

【标准答案】Dubbo提供五种负载均衡策略:

Random随机(默认):按权重随机选择,权重越高被选中概率越大。适合大部分场景,特别是机器性能不均等时,通过权重调节流量分配。

RoundRobin轮询:按权重轮询,公平但可能造成请求堆积。适合机器性能相近、需要均匀分配流量的场景。

LeastActive最少活跃调用:选择活跃调用数最少的Provider,动态感知处理能力。适合请求处理时间差异大的场景,能自动把请求分给处理快的机器。

ConsistentHash一致性哈希:相同参数的请求总是发到同一Provider。适合有状态服务或需要会话粘性的场景,如用户信息查询。

自定义扩展:通过实现LoadBalance接口,可扩展个性化策略。


【面试题】3. Dubbo的集群容错策略有哪些?生产环境如何选型? ​

【标准答案】Dubbo提供六种集群容错策略:

Failover(默认):失败自动重试,通常用于读操作。重试次数可配置,但要注意幂等性。

Failfast快速失败:失败立即报错,适合非幂等写操作,如新增记录,避免重复提交。

Failsafe失败安全:失败忽略异常,适合写入审计日志等非关键操作。

Failback失败自动恢复:失败后台记录,定时重试,适合消息通知等最终一致性场景。

Forking并行调用:同时调用多个Provider,一个成功即返回,适合实时性要求高的场景。

Broadcast广播调用:逐个调用所有Provider,适合通知所有节点更新缓存等场景。

选型建议:读操作用Failover,写操作用Failfast或Failsafe,消息通知用Failback,实时性要求高用Forking。


【面试题】4. Dubbo SPI与Java SPI有什么区别?Dubbo SPI的优势是什么? ​

【标准答案】核心区别有三点:

实现方式:Java SPI配置文件在META-INF/services,通过ServiceLoader加载;Dubbo SPI配置文件在META-INF/dubbo,通过ExtensionLoader加载,支持按需加载而非全量加载。

功能增强:Dubbo SPI支持@SPI指定默认实现、@Adaptive动态代理、@Activate自动激活、Wrapper自动包装等高级特性,而Java SPI只是简单的接口-实现查找。

性能优化:Java SPI每次调用都会遍历所有实现类;Dubbo SPI按需加载,支持缓存和懒加载,性能更优。

实际价值:Dubbo SPI让框架具备强大的扩展能力,用户可以自定义Protocol、LoadBalance、Filter等组件,无需修改源码,实现了微内核+插件的架构设计思想。


【面试题】5. Dubbo服务超时配置的优先级是怎样的?超时后如何处理? ​

【标准答案】配置优先级:Consumer方法级 > Consumer接口级 > Provider方法级 > Provider接口级 > Consumer全局 > Provider全局。优先级从左到右依次降低,Consumer端配置优先于Provider端。

超时处理流程: 超时后Consumer端会抛出TimeoutException,同时Provider端可能仍在执行。如果是Failover集群容错策略,会自动重试其他Provider。

生产建议:

  1. Provider端设置合理超时,根据业务处理时间设定;
  2. Consumer端可覆盖超时,但要避免设置过短;
  3. 读操作可适当放宽超时,写操作超时建议快速失败;
  4. 超时时间要结合网络延迟和业务处理时间综合考量。

【面试题】6. Dubbo的服务暴露流程是怎样的?本地暴露和远程暴露有什么区别? ​

【标准答案】服务暴露流程: Spring容器启动 → 解析@Service注解 → 创建ServiceBean → 调用export()方法 → 检查是否延迟暴露 → 创建Invoker(通过ProxyFactory) → 本地暴露(injvm协议) → 远程暴露(dubbo协议) → 注册到注册中心。

本地暴露与远程暴露的区别:

  • 本地暴露:使用injvm协议,不走网络,同一个JVM内调用,性能最优;
  • 远程暴露:使用dubbo等协议,走Netty网络通信,支持跨JVM调用。

实际应用:当服务消费者和提供者在同一个应用内时,本地调用会走injvm协议,避免网络开销;跨应用调用走远程协议。


【面试题】7. Dubbo支持哪些序列化方式?如何选型? ​

【标准答案】Dubbo支持多种序列化方式:

Hessian2(默认):性能稳定,跨语言支持好,适合大多数场景。

Kryo:性能优异,序列化体积小,但需要注册类,适合对性能要求高的内部服务。

Protobuf:跨语言兼容性强,体积小,适合多语言异构系统。

Fastjson:JSON格式,调试方便,但性能一般,适合开发测试环境。

FST:性能接近Kryo,无需注册类,适合追求性能但不想手动注册的场景。

选型建议:

  • 默认用Hessian2,稳定可靠;
  • 纯Java环境、性能敏感用Kryo或FST;
  • 多语言调用用Protobuf;
  • 开发调试用Fastjson。

【面试题】8. Dubbo的服务降级如何实现?Mock机制怎么用? ​

【标准答案】服务降级实现方式:

Mock降级:在@Reference或<dubbo:reference>中配置mock属性,当服务调用失败时返回Mock实现结果。

配置方式:

  • mock="return null":失败返回null;
  • mock="return default":失败返回默认值;
  • mock="com.xxx.MockServiceImpl":失败调用自定义Mock实现类。

使用场景:

  • 服务提供方故障时,返回兜底数据,如商品详情页返回缓存数据;
  • 非核心服务不可用时,返回默认值,不影响主流程;
  • 促销期间主动降级非核心服务,保障核心业务。

Mock vs 熔断: Mock是Dubbo内置的简单降级机制;复杂场景可结合Sentinel或Hystrix实现熔断降级,支持更精细的控制。


【面试题】9. Dubbo3的应用级服务发现与接口级服务发现有什么区别? ​

【标准答案】接口级服务发现(Dubbo2): 每个服务接口在注册中心单独注册,接口数量多时注册中心压力大,一个应用100个接口就要注册100次。

应用级服务发现(Dubbo3): 以应用为单位注册,一个应用只注册一次,接口映射关系通过元数据中心维护。注册中心压力大幅降低,服务发现效率提升。

核心优势:

  1. 注册中心数据量减少90%以上;
  2. 更符合Spring Cloud、K8s等云原生生态;
  3. 支持百万级集群规模;
  4. 服务自省机制减少对注册中心的依赖。

兼容性:Dubbo3同时支持两种模式,可平滑迁移。


【面试题】10. Dubbo服务限流有哪些方式?如何防止服务被压垮? ​

【标准答案】Dubbo提供三种服务限流机制:

executes(服务端限流): 在Provider端配置,限制每个服务的最大并发执行数,超过直接拒绝。配置:@Service(executes = 100),表示最多100个并发。

actives(客户端限流): 在Consumer端配置,限制对每个Provider的并发调用数。配置:@Reference(actives = 10),表示对单个Provider最多10个并发。

TpsLimitFilter(TPS限流): 限制每秒请求数,基于令牌桶或滑动窗口算法。配置:<dubbo:parameter key="tps" value="100"/>。

生产建议:

  1. Provider端配置executes保护自身不被压垮;
  2. Consumer端配置actives避免对下游服务造成压力;
  3. 结合Sentinel实现更精细的限流控制;
  4. 监控限流指标,动态调整阈值;
  5. 限流后返回友好错误信息,触发降级逻辑。

共10道题目,覆盖架构原理、负载均衡、集群容错、SPI机制、服务暴露、序列化、服务降级、Dubbo3新特性、服务限流等核心考点。