本轮 SpringCloud微服务架构面试题库(带答案)
【面试题】1. Nacos作为注册中心时,如何保证服务发现的实时性?如果Nacos Server宕机,服务还能调用吗?
【标准答案】 Nacos通过UDP推送+心跳机制双重保障实时性。服务端变更时主动推送,客户端也定期拉取。Server宕机后,客户端本地缓存的服务列表仍可用,短时间内的服务调用不受影响。但宕机期间新服务无法注册,已下线服务无法剔除,最终会导致调用失败。生产环境必须部署Nacos集群,至少3节点,配合MySQL持久化。
【面试题】2. Spring Cloud Gateway如何实现动态路由?路由配置热更新怎么做?
【标准答案】 Gateway的动态路由核心是RouteDefinitionLocator接口,默认从配置文件加载。实现动态路由有两种方式:一是结合Nacos Config,路由配置放配置中心,变更后通过@RefreshScope或Actuator的/refresh端点热更新;二是自定义RouteDefinitionLocator,从数据库或Nacos读取,配合事件监听机制实现实时推送。推荐用Nacos Config,简单可靠,生产常用。
【面试题】3. Sentinel的熔断降级与Hystrix有什么本质区别?生产环境选哪个?
【标准答案】 核心区别:Hystrix基于线程池隔离,资源消耗大;Sentinel基于滑动窗口统计,资源消耗小。Hystrix已进入维护模式不再更新,Sentinel是阿里巴巴开源,持续迭代中,支持更丰富的流控策略。生产环境强烈推荐Sentinel:轻量级、控制台可视化、规则持久化方便、与Spring Cloud Alibaba集成度高。唯一缺点是社区文档不如Hystrix成熟,但官方文档够用。
【面试题】4. OpenFeign调用超时如何配置?超时重试会带来什么问题?如何避免?
【标准答案】 超时配置分两层:Feign层通过feign.client.config.default.connectTimeout和readTimeout设置;Ribbon/LoadBalancer层通过ribbon.ReadTimeout等配置。建议Feign超时略大于Ribbon超时。重试问题:网络抖动时可能导致请求重复执行,对于非幂等操作(如下单、扣款)会引发数据错误。解决方案:关键接口用唯一请求ID做幂等控制;关闭重试(MaxAutoRetries设为0);或用分布式锁保证原子性。
【面试题】5. Seata的AT模式如何保证分布式事务一致性?有什么坑?
【标准答案】 AT模式核心是自动补偿:一阶段执行业务SQL并记录前后镜像到undo_log;二阶段提交删除日志,回滚时用镜像逆向生成补偿SQL。优点是业务无侵入,写起来像本地事务。坑点:一是全局锁竞争,热点数据会阻塞;二是大事务性能差,需拆小;三是脏写问题,RM宕机且本地事务已提交时可能无法回滚,需配合数据库事务日志。适合对一致性要求高、并发不极端的场景,超高并发建议用TCC。
【面试题】6. Spring Cloud Stream如何保证消息不丢失?消费者宕机怎么办?
【标准答案】 消息不丢失需三重保障:生产者端配置ack确认机制;消息队列开启持久化;消费者关闭自动提交,改为手动ack。消费者宕机场景:若已拉取消息但未确认,MQ会重新投递给其他消费者。关键配置:spring.cloud.stream.bindings.input.consumer.auto-commit=false,手动调用Acknowledgment.acknowledge()。另外要配置死信队列,处理多次重试失败的消息,避免阻塞正常流程。
【面试题】7. Redis分布式锁用Redisson实现,为什么要用看门狗机制?直接SET NX EX有什么问题?
【标准答案】 SET NX EX是简单分布式锁,但有致命问题:锁过期时间难设置,业务执行超时锁自动释放,会导致并发安全问题。Redisson的看门狗(Watchdog)机制自动续期:默认30秒过期,每10秒自动续期到30秒,业务没结束锁不会丢。另外Redisson支持等待锁、可重入锁、红锁(RedLock,多Redis节点防止单点故障)。生产环境必须用Redisson,不要自己造轮子。
【面试题】8. 微服务之间如何传递用户身份信息?Token过期了怎么处理?
【标准答案】 主流方案:网关统一认证后,把用户信息放入请求头(如X-User-Id、X-User-Name),下游服务通过拦截器提取并放入ThreadLocal。OpenFeign传递Token需配置RequestInterceptor,把当前请求头透传到下游。Token过期处理:网关拦截器判断Token失效返回401,前端收到后跳转登录页;服务间调用若Token失效,可通过刷新Token获取新Token再重试,或设计长效内部Token与用户Token分离。
【面试题】9. 链路追踪SkyWalking如何工作?对性能有影响吗?
【标准答案】 SkyWalking通过Agent无侵入埋点:Java Agent在类加载时修改字节码,自动采集调用链信息。TraceId通过HTTP头或RPC上下文传递,SpanId标识每个调用节点。性能影响:Agent本身消耗约5%-15%性能,采样率设置合理的话可接受。生产优化:调低采样率(非核心服务1%-5%)、关闭不必要的链路追踪、用异步方式上报数据。与Zipkin对比:SkyWalking对业务代码零侵入,更适合大型微服务架构。
【面试题】10. 微服务灰度发布如何实现?Spring Cloud Gateway支持吗?
【标准答案】 灰度发布核心是流量路由:根据用户ID、Header、Cookie等维度将部分流量导向新版本。Gateway原生支持基于权重的路由(Weight路由断言),可以配置v1权重80、v2权重20实现流量切分。更精细的控制需自定义Filter,读取请求头判断灰度标识,再通过负载均衡器转发到指定版本。配合Nacos元数据,服务注册时标记version=v2,Gateway按元数据过滤实例即可。生产还需监控灰度服务的错误率、延迟,异常时快速回滚。