SpringCloud微服务架构面试题库(带答案)
生成时间:2026-05-22 22:53
【面试题】1. Eureka的自我保护机制是什么?为什么要这样设计?
【标准答案】 自我保护机制是Eureka为了防止网络分区故障导致服务被错误剔除而设计的保护策略。
当Eureka Server在短时间内丢失超过85%的心跳时,会触发自我保护,不再剔除任何服务实例。即使有服务真的挂了,也保留在注册表中。
设计原因:网络抖动比服务宕机更常见。如果因为短暂的网络问题就把服务剔除,会导致大面积服务不可用——这比保留几个僵尸实例的危害更大。自我保护本质上是"宁可保留错误数据,也不删除正确数据"的AP模型体现。
关闭方式:eureka.server.enable-self-preservation=false(生产环境不建议关闭)
【面试题】2. Nacos作为注册中心,与Eureka的核心区别是什么?
【标准答案】 核心区别有三点:
CAP模型支持:Eureka只支持AP(高可用优先),Nacos支持AP和CP可切换,通过
nacos.core.protocol.raft.data配置,CP模式基于Raft协议保证一致性。功能范围:Nacos = 注册中心 + 配置中心,Eureka只是注册中心。Nacos同时支持服务发现和动态配置管理。
健康检查:Eureka依赖客户端心跳,Nacos支持主动健康检查(TCP/HTTP/MySQL多种探活方式),检测更准确。
性能:Nacos基于长连接推送变更,Eureka客户端定时拉取注册表。Nacos实时性更好,Eureka有30秒延迟。
【面试题】3. Spring Cloud Gateway如何实现灰度发布?
【标准答案】 灰度发布通过Gateway的动态路由和过滤器实现,核心方案:
方案一:基于请求头路由
spring:
cloud:
gateway:
routes:
- id: user-service-v2
uri: lb://user-service-v2
predicates:
- Header=gray, true
- id: user-service-v1
uri: lb://user-service-v1
predicates:
- Path=/user/**带gray: true请求头的流量走v2版本,其他走v1。
方案二:基于权重路由
predicates:
- Weight=group1, 80 # 80%流量走v1方案三:结合Nacos动态配置 通过Nacos配置中心实时调整路由规则,无需重启网关。
配合负载均衡策略,可以让灰度更精细化,比如按用户ID哈希分流,保证同一用户始终访问同一版本。
【面试题】4. Sentinel和Hystrix在熔断机制上有什么区别?
【标准答案】 主要有四点区别:
熔断状态机:两者都是三态(关闭→打开→半开),但Sentinel的半开状态可以配置探测请求数和比例阈值,更灵活。
限流能力:Hystrix只有熔断和隔离,Sentinel内置多种限流算法(QPS、并发线程数、滑动窗口、令牌桶)。Sentinel是熔断+限流一体化方案。
资源隔离:Hystrix依赖线程池隔离,Sentinel支持线程池和信号量两种模式,且信号量模式性能更高。
监控可视化:Sentinel有完善的Dashboard,实时监控、动态规则配置一站式完成;Hystrix需要整合Turbine或Dashboard。
维护状态:Hystrix已进入维护模式,官方推荐使用Resilience4j或Sentinel。
【面试题】5. 解释Seata的AT模式实现原理,它如何保证分布式事务一致性?
【标准答案】 AT模式是Seata的核心方案,全称是Automatic Transaction模式,核心原理:
一阶段(本地事务执行):
- 执行业务SQL,记录前后镜像(before image、after image)到undo_log表
- 生成行锁,防止并发修改
- 本地事务提交,释放本地锁
二阶段(全局提交/回滚):
- 提交:异步删除undo_log,性能高
- 回滚:根据undo_log反向生成SQL恢复数据
关键设计:
- 全局锁:保证全局事务间的写隔离,防止脏写
- 一阶段本地提交:不阻塞,性能接近本地事务
- 补偿机制:通过undo_log实现数据回滚
AT模式适合对一致性要求高、但可以接受短暂中间状态的场景,如电商下单、库存扣减等。缺点是不支持复杂业务逻辑的补偿。
【面试题】6. Redis分布式锁如何实现?Redisson的看门狗机制是什么?
【标准答案】 基础实现(SET NX EX):
// 加锁
SET lock_key unique_value NX EX 30
// 释放锁(Lua保证原子性)
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
end
return 0Redisson看门狗机制: 问题:锁过期时间设置30秒,业务执行50秒,锁提前释放怎么办?
解决:Redisson默认启动后台线程(看门狗),每隔锁过期时间的1/3(默认10秒)检查一次,如果持有锁的线程还在运行,自动续期到30秒。
RLock lock = redisson.getLock("myLock");
lock.lock(); // 启动看门狗
try {
// 业务逻辑,即使超过30秒也不会丢失锁
} finally {
lock.unlock();
}RedLock方案:多Redis节点,多数派成功才算加锁成功,防止单点故障。
【面试题】7. 微服务架构中,如何保证消息队列的可靠性投递?
【标准答案】 可靠性投递的核心是保证"消息不丢失",分三阶段:
生产端:
- 开启事务消息或确认机制(confirm callback)
- 消息持久化到本地消息表,定时任务重试
- RocketMQ的事务消息:半消息+本地事务+提交/回滚
Broker端:
- 同步刷盘(性能换可靠性)
- 多副本同步复制(主从同步)
- 消息确认机制返回ACK
消费端:
- 手动ACK,业务处理成功后确认
- 消费失败进入重试队列或死信队列
- 幂等性设计:消息ID去重,防止重复消费
完整方案:
生产者 → 本地消息表 → MQ Broker → 消费者 → ACK
↑ ↓
└───── 定时重试 ←────┘【面试题】8. 链路追踪中TraceId和SpanId是如何传递的?跨线程如何处理?
【标准答案】 传递机制:
- HTTP调用:通过请求头传递(如
X-Trace-Id、X-Span-Id) - RPC调用:通过RPC框架的隐式传参(如Dubbo的Attachment)
- MQ调用:通过消息属性传递
SpanId编码规则:采用层级编码,如0.1.2表示第三个服务的第二个调用的第一个子调用。
跨线程处理: Sleuth使用Tracer在创建新线程时手动传递:
// 方式一:手动传递
Span span = tracer.currentSpan();
executor.submit(() -> {
try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
// 子线程中能获取到父线程的TraceId
}
});
// 方式二:使用@Async + Sleuth自动包装
@Async
public void asyncMethod() {
// TraceContext自动传播
}注意事项:线程池需要包装为LazyTraceExecutor,否则TraceId会丢失。
【面试题】9. Spring Cloud Stream如何实现消费者的负载均衡?
【标准答案】 Stream通过consumer group实现消费者负载均衡:
核心配置:
spring:
cloud:
stream:
bindings:
input:
group: order-group # 同一group的消费者形成竞争关系
destination: order-topic负载均衡原理:
- 同一group的多个消费者订阅同一Topic,消息只会被其中一个消费
- 不同group的消费者会各自收到完整消息副本(广播)
分区消费:
bindings:
input:
consumer:
partitioned: true
instanceCount: 3 # 总实例数
instanceIndex: 0 # 当前实例索引消息按key哈希分配到固定分区,保证同一key的消息顺序性。
重平衡机制:消费者上下线时,Rebalance重新分配分区,类似Kafka的协调器机制。
【面试题】10. 如何设计一个高可用的微服务网关架构?
【标准答案】 高可用网关架构设计要点:
1. 网关集群部署
- 多实例部署,前面挂Nginx或SLB做负载均衡
- 无状态设计,任意实例可替换
2. 注册中心联动
- 网关注册到注册中心,支持动态发现
- 客户端通过注册中心发现网关实例
3. 限流熔断
- 网关层面限流(令牌桶、漏桶)
- 集成Sentinel对下游服务熔断保护
4. 灰度发布
- 网关路由规则动态配置
- 支持权重分流、蓝绿部署
5. 安全防护
- JWT/OAuth2统一鉴权
- 黑名单、防刷、WAF集成
6. 监控告警
- 接口耗时、QPS、错误率实时监控
- 接入Prometheus + Grafana
7. 故障降级
- 网关自身故障时,Nginx兜底返回降级页面
- 下游服务故障时,返回缓存或默认响应
架构图:
Client → Nginx/SLB → Gateway集群 → 后端微服务
↓
注册中心(Nacos)
↓
配置中心 + Sentinel Dashboard本轮题目覆盖:服务注册、配置中心、API网关、熔断限流、分布式事务、分布式锁、消息队列、链路追踪、负载均衡、高可用架构设计