Skip to content

本轮 SpringCloud微服务架构面试题库(带答案)

【面试题】1. Eureka的自我保护机制是什么?触发条件有哪些?生产环境如何配置? ​

【标准答案】Eureka自我保护是AP模型的体现。当Eureka Server短时间内丢失大量客户端心跳(超过85%),会认为网络分区故障,不再剔除服务实例,避免误删。触发条件:每分钟心跳数 < 阈值(期望心跳数 × 0.85)。生产配置建议:eureka.server.enable-self-preservation=true开启(默认),eureka.server.renewal-percent-threshold=0.85调整阈值。若网络稳定可关闭,但需配合健康检查。

【面试题】2. Nacos作为注册中心与Eureka的核心差异是什么?如何选择? ​

【标准答案】核心差异在一致性模型:Nacos默认AP(可用性),可切换CP(一致性);Eureka纯AP。Nacos优势:支持临时/持久实例,临时用AP、持久用CP;集成配置中心,减少运维成本;支持DNS-F协议,跨语言友好。选择建议:追求生态统一、配置中心集成选Nacos;存量Eureka项目无需迁移。生产建议:Nacos集群至少3节点,使用MySQL持久化,开启鉴权。

【面试题】3. Ribbon自定义负载均衡策略的实战场景和实现方式? ​

【标准答案】实战场景:灰度发布时让特定版本流量路由到新版本实例;金丝雀发布时按权重分流。实现方式:1)实现IRule接口,重写choose方法;2)配置类注入自定义策略:@Bean public IRule customRule() { return new WeightedResponseTimeRule(); };3)配置文件指定:<service-name>.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule。注意:Spring Cloud 2020+已移除Ribbon,推荐使用Spring Cloud LoadBalancer。

【面试题】4. OpenFeign超时重试配置的最佳实践?如何避免重试风暴? ​

【标准答案】配置层面:feign.client.config.default.connectTimeout=5000、readTimeout=10000;spring.cloud.loadbalancer.retry.enabled=true开启重试。最佳实践:1)设置合理超时(连接超时短、读取超时长);2)重试次数≤2次;3)幂等接口(GET)重试,非幂等(POST)慎重重试;4)使用@FeignClient(fallback=XXXFallback.class)降级;5)核心链路禁用重试,改用异步+补偿。避免重试风暴:设置ribbon.MaxAutoRetriesNextServer=1限制下个服务实例重试次数,监控重试指标。

【面试题】5. Sentinel与Hystrix的核心差异?生产环境如何选择? ​

【标准答案】核心差异:Sentinel支持QPS/线程数限流、热点参数限流、系统自适应保护;Hystrix专注于熔断降级。Sentinel优势:控制台实时监控、动态规则推送、流量整形;Hystrix已停止维护。生产选择:新项目推荐Sentinel,与Spring Cloud Alibaba生态集成好;存量Hystrix项目逐步迁移。关键配置:sentinel.datasource.nacos.server-addr持久化规则,spring.cloud.sentinel.transport.dashboard连接控制台,@SentinelResource(blockHandler="handleBlock")定制降级逻辑。

【面试题】6. 熔断器的三种状态及转换条件是什么?如何配置合理的熔断阈值? ​

【标准答案】三种状态:Closed(关闭,正常调用)→ Open(打开,快速失败)→ Half-Open(半开,试探性调用)。转换条件:失败率>阈值(默认50%)且请求数≥最小请求数(默认5)时Closed→Open;经过熔断时长(默认5秒)后Open→Half-Open;Half-Open下一次调用成功则→Closed,失败则→Open。配置建议:失败率阈值40-60%,熔断时长10-30秒,最小请求数10-20。Sentinel配置:DegradeRule.setCount(0.5).setTimeWindow(10).setMinRequestAmount(10)。

【面试题】7. Spring Cloud Gateway如何实现动态路由?生产环境如何热更新? ​

【标准答案】动态路由实现:1)路由配置存储在Nacos/数据库;2)实现RouteDefinitionLocator接口,从存储加载路由;3)使用RouteDefinitionWriter动态增删改。热更新方案:监听Nacos配置变更,触发ApplicationEventPublisher.publishEvent(new RefreshRoutesEvent(this))刷新路由。生产要点:1)路由变更加分布式锁,避免并发冲突;2)灰度发布时先添加新路由、验证通过后再切换;3)控制台提供路由可视化管理。示例:gateway.route.locator.enabled=true开启动态路由。

【面试题】8. 分布式事务Seata的AT模式如何保证数据一致性?有哪些坑? ​

【标准答案】AT模式原理:1)第一阶段:执行业务SQL,记录前后镜像到undo_log,提交本地事务;2)第二阶段:全局提交异步删除undo_log,全局回滚则根据undo_log反向生成SQL回滚。核心依赖:全局锁(避免脏写)、undo_log(回滚依据)。常见坑:1)跨库关联查询需改写SQL;2)大事务性能差,建议拆分;3)全局锁竞争时可能超时,调整lock.retry.interval;4)数据库需支持事务(MySQL InnoDB)。生产建议:小事务、低并发场景用AT;高并发用TCC。

【面试题】9. Redis分布式锁Redisson的看门狗机制是什么?如何避免死锁? ​

【标准答案】看门狗机制:Redisson加锁默认30秒,后台线程每10秒(锁时长的1/3)自动续期,业务执行不超时锁不失效。避免死锁:1)加锁设置合理超时时间:tryLock(waitTime, leaseTime, TimeUnit.SECONDS);2)业务代码用try-finally确保释放锁:lock.unlock();3)异常情况锁超时自动释放。生产建议:1)看门狗适合不确定业务执行时长的场景;2)明确时长的业务直接设置leaseTime,关闭看门狗;3)使用RLock lock = redisson.getFairLock("myLock")公平锁避免饥饿。

【面试题】10. Spring Cloud Stream如何保证消息可靠性投递?消费者如何做幂等? ​

【标准答案】可靠性投递:1)生产者:spring.cloud.stream.bindings.output.producer.required-acks=all确认机制;2)消费者:enable-auto-commit=false手动提交offset;3)消费失败重试+死信队列。幂等方案:1)消息ID去重:Redis SETNX或数据库唯一索引;2)业务幂等键(订单号+操作类型);3)乐观锁版本号。代码示例:@StreamListener(target = "input", condition = "headers['type']=='order'")过滤消息。生产配置:spring.cloud.stream.bindings.input.consumer.max-attempts=3重试3次,失败入死信队列DLQ。