本轮 Dubbo服务框架面试题库(带答案)
【面试题】1. Dubbo的服务超时配置优先级是怎样的?生产环境如何合理配置?
【标准答案】Dubbo超时配置优先级从高到低:Consumer方法级 > Consumer接口级 > Provider方法级 > Provider接口级。生产环境建议:Consumer端设置全局超时(如3000ms),关键方法可单独覆盖;Provider端设置兜底值(如5000ms)。超时时间需根据业务压测确定,一般RPC调用建议1-3秒,长耗时操作单独评估。切忌Consumer不配、只靠Provider配,否则Consumer默认1秒超时,Provider配再大也没用。
【面试题】2. Dubbo的Invoker是什么?在服务暴露和服务引用中分别扮演什么角色?
【标准答案】Invoker是Dubbo的核心抽象,代表一个可执行体。服务暴露时:ProxyFactory将服务实现类包装成Invoker(本地调用),再通过Protocol.export()转换为Exporter暴露到网络。服务引用时:Protocol.refer()创建远程Invoker(网络调用),再通过ProxyFactory生成代理对象供调用方使用。Invoker屏蔽了本地/远程调用差异,是Dubbo"统一调用模型"的核心,所有Filter、负载均衡、集群容错都在Invoker链上实现。
【面试题】3. Dubbo SPI与Java SPI的核心区别是什么?@Adaptive注解有什么用?
【标准答案】核心区别:Dubbo SPI按需加载、支持缓存,Java SPI一次性加载全部实现。Dubbo SPI通过META-INF/dubbo/目录配置,支持默认实现、别名、覆盖。@Adaptive实现自适应扩展点:运行时根据URL参数动态选择实现类,如@Adaptive("protocol")会根据URL中的protocol参数值选择对应Protocol实现。这避免了硬编码if-else,让框架能根据配置动态切换实现,是Dubbo"微内核+插件"架构的关键机制。
【面试题】4. Dubbo的Failover和Failfast容错策略分别适用于什么场景?
【标准答案】Failover(失败重试):默认策略,失败后自动重试其他Provider,适合读操作、幂等接口,如查询、统计。配置retries="2"重试2次(共3次调用)。Failfast(快速失败):失败立即抛异常,不重试,适合非幂等写操作,如新增、扣款,避免重复提交导致数据错误。生产建议:写操作用Failfast,读操作用Failover但控制重试次数,避免雪崩。
【面试题】5. Dubbo服务预热(Warmup)机制是什么?如何避免新服务上线流量突增?
【标准答案】Dubbo预热通过动态权重调节实现:服务刚启动时权重从1逐渐提升到配置值,预热期间请求量逐步增加。原理:startTime记录服务启动时间,计算运行时长,权重公式weight = weight * Math.min(uptime / warmup, 1),warmup默认10分钟。生产环境:新服务上线前先压测预热,或配置warmup参数;发布时采用灰度滚动发布,分批上线,避免瞬间流量打垮新实例。结合监控观察QPS曲线平稳上升。
【面试题】6. Dubbo的三种线程模型(AllDispatcher、MessageOnlyDispatcher、ExecutionDispatcher)有什么区别?
【标准答案】AllDispatcher(默认):IO线程和业务线程分离,所有消息先由IO线程接收,再由业务线程池处理,适合大部分场景。MessageOnlyDispatcher:IO线程直接处理请求消息(不进线程池),仅适合处理耗时极短的请求,如心跳、状态查询。ExecutionDispatcher:IO线程只接收请求,立即交给业务线程池执行,IO线程不参与序列化等操作,适合请求处理耗时的场景。线程模型选择:业务逻辑简单用MessageOnly,复杂业务用All或Execution,配合线程池隔离避免相互影响。
【面试题】7. Dubbo泛化调用是什么?什么场景需要使用?如何实现?
【标准答案】泛化调用是Consumer端无需API接口定义,直接调用任意服务的能力。实现:Consumer通过GenericService接口调用,使用Map<String, Object>传参;Provider端无需改动。场景:网关层聚合调用、测试平台动态调用、跨语言调用(无Java SDK)、配置中心动态路由测试。配置:<dubbo:reference id="xxx" interface="com.xxx.Service" generic="true"/>,调用方式genericService.$invoke("methodName", new String[]{"java.lang.String"}, new Object[]{"param"})。
【面试题】8. Dubbo结果缓存机制有哪些实现?LRU缓存适用于什么场景?
【标准答案】Dubbo内置三种缓存:LRU(最近最少使用):基于LinkedHashMap实现,容量满了淘汰最久未访问的,适合热点数据缓存、结果变化不频繁的场景,如商品详情、配置查询。ThreadLocal:线程级缓存,同一线程多次调用共享结果,适合批量处理时避免重复调用。JCache:集成JSR-107缓存规范,支持Ehcache、Redis等,企业级缓存场景。配置:<dubbo:service cache="lru" cache.size="1000"/>。注意:缓存仅适合读多写少、数据一致性要求不高的场景,强一致性业务禁用。
【面试题】9. Dubbo服务限流有哪些方式?executes和actives参数有什么区别?
【标准答案】限流方式:executes(Provider端执行限流):限制服务端同时执行的最大请求数,超出直接拒绝,保护Provider不被打垮,配置<dubbo:service executes="100"/>。actives(Consumer端并发限制):限制每个Consumer对某服务的最大并发请求数,超出等待,防止单Consumer过度消费,配置<dubbo:reference actives="10"/>。TpsLimitFilter:限制每秒请求数(TPS),配置<dubbo:parameter key="tps" value="100"/>。生产建议:Provider端配置executes做兜底,Consumer端配置actives做业务侧限流,关键服务再加TpsLimit。
【面试题】10. Dubbo3的应用级服务发现相比接口级服务发现有什么优势?
【标准答案】Dubbo2是接口级服务发现:每个接口注册一条数据,应用100个接口就注册100条,Nacos/ZK压力大,推送流量大。Dubbo3改为应用级服务发现:每个应用注册一条数据,接口作为元数据下发,注册中心压力降低1-2个数量级。优势:注册中心容量提升(支持百万级实例)、推送流量降低(只推送应用级变更)、与云原生生态兼容(K8s Service也是应用级)。迁移:Dubbo3兼容模式,新老服务可共存,建议新项目直接用应用级,老项目逐步迁移。