SpringCloud微服务架构面试题库
生成时间:2026-05-21 21:04
【面试题】1. Nacos作为注册中心,它的AP和CP模式如何切换?什么场景下用AP,什么场景下用CP?
【标准答案】Nacos通过spring.cloud.nacos.discovery.server-mode配置切换,默认AP模式。AP模式适合对可用性要求高的场景,比如电商详情页、推荐系统,短暂的数据不一致可以接受,但服务必须能随时注册发现。CP模式适合对一致性要求高的场景,比如金融交易、库存扣减,宁可暂时不可用也不能读到脏数据。Nacos底层用的是Raft协议保证CP,AP模式下各节点独立处理请求。实际项目中,大多数业务用AP就够了,只有核心链路才切CP。
【面试题】2. Spring Cloud LoadBalancer相比Ribbon有什么优势?如何自定义负载均衡策略?
【标准答案】Ribbon已进入维护状态,Spring Cloud LoadBalancer是官方推荐替代。优势:一是原生支持响应式编程(Reactor),二是更轻量不依赖Netflix组件,三是与Spring Cloud生态深度集成。自定义策略有两种方式:实现ReactorServiceInstanceLoadBalancer接口,或者用@LoadBalancerClients(defaultConfiguration = xxx.class)指定配置类。常用策略:轮询(RoundRobin,默认)、随机(Random)、加权(Weighted,适合异构集群)、一致性哈希(适合有状态服务)。
【面试题】3. OpenFeign的超时重试机制如何配置?连接超时和读超时有什么区别?
【标准答案】配置项:feign.client.config.default.connectTimeout(连接超时)和readTimeout(读超时),单位毫秒。连接超时是TCP三次握手的时间,网络抖动时容易触发,一般设短点(1-3秒)。读超时是等待响应数据的时间,取决于下游业务处理耗时,建议按P99响应时间加缓冲设置。重试通过feign.client.config.default.retryer配置,默认会重试5次,生产环境建议关闭或限制重试次数,避免雪崩。坑点:重试只在IO异常时触发,业务异常(如500)不会重试。
【面试题】4. Sentinel的熔断状态机有哪几种状态?各状态之间如何流转?
【标准答案】三个状态:关闭(Closed)、开启(Open)、半开(Half-Open)。正常情况下熔断器关闭,请求正常通过。当错误率或慢调用比例超过阈值,熔断器打开,后续请求直接走降级逻辑,持续熔断时长后进入半开状态。半开状态会放行少量请求探测下游是否恢复:如果成功,熔断器关闭;如果仍然失败,重新打开。配置项:熔断策略(慢调用比例、异常比例、异常数)、阈值、熔断时长。实际项目中,熔断时长建议30秒以上,半开探测请求量根据业务敏感度设置。
【面试题】5. Spring Cloud Gateway如何实现灰度发布?请说出完整方案。
【标准答案】核心思路:通过请求头或Token携带版本标识,Gateway路由时匹配版本号分发到不同版本服务。具体实现:一是注册中心打标签,Nacos用metadata区分版本;二是Gateway配置路由断言,- Header=X-Version, v2匹配灰度流量;三是结合负载均衡策略,GrayLoadBalancer按版本筛选实例。高级方案:AB Testing平台控制流量比例,逐步放量;结合Sentinel做灰度流量限流保护;蓝绿部署时通过Feature Toggle控制功能开关。注意:灰度上线前必须在预发环境验证,放量比例从小到大,随时准备回滚。
【面试题】6. Seata的AT模式为什么会有脏写风险?如何解决?
【标准答案】AT模式原理:一阶段执行本地事务,二阶段异步提交/回滚。脏写风险:一阶段提交后、二阶段回滚前,另一事务读到中间状态并提交,回滚时把新事务的修改覆盖掉。解决方案:一是全局锁,Seata用lock_key字段锁定记录,其他全局事务会等待;二是避免长事务,业务上拆分粒度;三是关键业务用TCC模式替代,显式控制回滚逻辑。实战经验:AT模式适合对一致性要求不高的场景(如积分累计),核心资金链路建议用TCC或本地消息表。
【面试题】7. Redis分布式锁用SET NX EX有什么问题?Redisson如何解决?
【标准答案】SET NX EX的问题是:锁超时释放后,持有锁的线程还在执行,误删其他线程的锁;单点Redis宕机会导致锁失效。Redisson解决方案:一是Watch Dog自动续期,后台线程每10秒续约30秒;二是加锁时设置唯一标识(UUID+线程ID),释放时Lua脚本原子校验;三是RedLock算法,多节点同时加锁,大多数成功才算成功。实战配置:tryLock(waitTime, leaseTime, TimeUnit),waitTime控制等待获取锁的时间,leaseTime控制锁持有时间(设置后Watch Dog失效)。
【面试题】8. Spring Cloud Stream如何保证消息可靠性投递?消息积压怎么处理?
【标准答案】可靠性投递三要素:生产端确认、消费端确认、持久化。配置:spring.cloud.stream.bindings.output.producer.required-acks=all,消费者enable-auto-commit=false手动ACK。消费失败处理:重试3次后进死信队列(DLQ),人工介入或定时任务重试。消息积压处理方案:一是增加消费者实例数(注意分区数要够);二是批量消费提高吞吐;三是临时扩容消费者,消费完缩容;四是根本原因排查:下游处理慢还是生产太快。RocketMQ有专门的消息积压监控,Kafka用lag指标告警。
【面试题】9. SkyWalking如何实现无侵入式链路追踪?TraceId如何跨服务传递?
【标准答案】无侵入原理:Java Agent字节码增强,在类加载时插入探针代码,拦截Spring MVC、Dubbo、MySQL等框架的入口和出口方法。TraceId传递:通过ThreadLocal存储,跨服务时塞入HTTP Header(sw-traceid),下游Agent从Header解析后继续传递。采样策略:默认全量,生产环境建议降采样(如20%),配合Error全采样。性能影响:Agent本身开销约5%,可通过配置减少拦截点优化。架构:Agent采集 → OAP Server聚合 → UI展示,支持Elasticsearch/H2存储。
【面试题】10. 微服务架构下如何设计API网关的统一认证鉴权方案?
【标准答案】主流方案:OAuth2 + JWT + Gateway统一鉴权。流程:用户登录 → 认证中心颁发Access Token(JWT格式)→ 前端请求携带Token到Gateway → Gateway校验Token(验签名、过期时间、黑名单)→ 解析用户信息注入Header透传 → 下游服务信任Header。关键点:一是JWT无状态,网关本地校验无需远程调用;二是Refresh Token机制延长会话;三是黑名单用Redis存储(如用户退出登录);四是权限变更后强制重新登录刷新Token。高级方案:网关只做认证,鉴权下沉到各服务(RBAC/ABAC),通过Open Policy Agent(OPA)统一策略引擎。
本轮题目覆盖:注册中心AP/CP切换、负载均衡策略、Feign超时重试、熔断状态机、灰度发布、分布式事务脏写、Redis分布式锁、消息可靠性、链路追踪、网关认证鉴权