SpringCloud微服务架构面试题库
生成时间: 2026-05-21 20:59
本轮 SpringCloud微服务架构面试题库(带答案)
【面试题】1. Eureka的自我保护机制是什么?生产环境要不要开启?
【标准答案】 自我保护机制是Eureka Server在短时间内丢失大量客户端心跳时,不再剔除这些实例,进入保护模式,避免网络抖动导致的误剔除。
核心原理:当每分钟续约数量 < 阈值(期望心跳数 × 85%),触发自我保护,停止剔除。
生产建议:建议开启。原因:生产环境网络不稳定时,关闭会导致大面积误剔除,服务实例明明活着却被踢掉,造成雪崩。
配套措施:
- 客户端配置重试和缓存
- 服务端集群部署保证高可用
- 监控告警,及时发现问题
【面试题】2. Nacos作为注册中心,AP和CP模式怎么选?
【标准答案】 Nacos支持AP和CP模式切换,通过nacos.naming.mode配置。
选型依据:
- AP模式(默认):保证可用性,允许短暂不一致。适合服务注册发现场景,因为服务实例偶尔不存在影响有限,优先保证服务可用。
- CP模式:保证一致性,适合需要强一致性的场景,如分布式锁选举、配置中心。
实际建议:
- 注册中心用AP,服务发现容忍短暂不一致
- 配置中心用CP,配置变更必须一致
- Nacos 2.x默认注册中心AP、配置中心CP,自动区分
【面试题】3. Ribbon和Spring Cloud LoadBalancer有什么区别?
【标准答案】 两者都是客户端负载均衡组件,但LoadBalancer是Ribbon的官方替代方案。
| 对比项 | Ribbon | Spring Cloud LoadBalancer |
|---|---|---|
| 状态 | 已进入维护模式,不再迭代 | Spring官方维护,活跃开发 |
| 响应式 | 不支持 | 支持Reactive |
| 集成度 | 需额外配置 | Spring Boot 2.x原生支持 |
| 扩展性 | IRule接口 | ReactiveLoadBalancer接口 |
迁移建议:
- 新项目直接用LoadBalancer
- 旧项目评估后逐步迁移
- LoadBalancer默认轮询,支持自定义策略
【面试题】4. OpenFeign的超时和重试怎么配置?
【标准答案】 OpenFeign的超时重试配置分两层:
超时配置:
yaml
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时
readTimeout: 10000 # 读取超时重试机制:
- 默认重试器是
Retryer.NEVER_RETRY,不重试 - 自定义重试:实现
Retryer接口,或配置feign.retryer
生产建议:
- connectTimeout设置短一点(2-5秒),快速感知网络问题
- readTimeout根据接口响应时间设定,避免过长导致线程堆积
- 幂等接口可重试,非幂等接口慎重重试
【面试题】5. Sentinel的熔断降级有哪些状态?状态怎么流转?
【标准答案】 Sentinel熔断器有三个状态:关闭、开启、半开启。
状态流转:
- 关闭 → 开启:错误率或慢调用比例超过阈值,触发熔断
- 开启 → 半开启:熔断时间窗口结束后,尝试放行一个请求探测
- 半开启 → 关闭:探测请求成功,恢复正常
- 半开启 → 开启:探测请求失败,重新熔断
熔断策略:
- 慢调用比例:响应时间超过阈值的请求比例
- 异常比例:异常请求占比
- 异常数:异常请求绝对数量
配置要点:熔断时长要合理,太短频繁探测,太长影响恢复。
【面试题】6. 令牌桶和漏桶限流算法有什么区别?
【标准答案】 两者都是限流经典算法,但适用场景不同。
漏桶算法:
- 流量先进桶,以恒定速率流出
- 流入大于桶容量则溢出(拒绝)
- 特点:输出流量平滑,适合保护下游不被突发流量冲击
令牌桶算法:
- 以固定速率生成令牌放桶里
- 请求来时取令牌,取不到则拒绝
- 特点:允许一定程度的突发流量,桶里有令牌就能瞬间通过
实际选择:
- 漏桶:适合削峰填谷、流量整形
- 令牌桶:适合API限流,允许合理突发
- Sentinel默认用令牌桶,Guava RateLimiter也是令牌桶
【面试题】7. Spring Cloud Gateway怎么实现统一的JWT鉴权?
【标准答案】 Gateway作为API网关,天然适合做统一鉴权。
实现方案:
- 编写全局过滤器
GlobalFilter,实现filter方法 - 从请求头提取Token,解析并校验JWT
- 校验通过:放行请求,可在Header中传递用户信息
- 校验失败:返回401,拒绝请求
关键代码结构:
java
@Component
public class AuthGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
// JWT校验逻辑
if (!validate(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}注意事项:
- 白名单路径跳过鉴权(登录、注册等)
- JWT密钥定期轮换
- 性能敏感场景用缓存加速校验
【面试题】8. Nacos配置中心怎么实现配置热更新?
【标准答案】 Nacos配置热更新有两种方式:
方式一:@RefreshScope注解
java
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.config}")
private String config;
}配置变更后,Nacos推送事件,Spring Cloud刷新Bean,下次请求获取新值。
方式二:监听配置变更
java
@Configuration
public class NacosConfigListener {
@NacosConfigListener(dataId = "app.yml")
public void onConfigChange(String newConfig) {
// 手动处理配置变更
}
}生产要点:
spring.cloud.nacos.config.refresh-enabled=true开启自动刷新- 敏感配置加密存储
- 配置变更要有审计和回滚机制
【面试题】9. Seata的AT模式是怎么实现分布式事务的?
【标准答案】 AT模式是Seata最常用的模式,对业务零侵入。
核心机制:
- 一阶段:执行业务SQL,同时记录undo_log(前后镜像)
- 二阶段提交:删除undo_log,事务完成
- 二阶段回滚:用undo_log反向生成SQL,恢复数据
关键点:
- 全局锁:防止写脏,保证隔离性
- undo_log:记录数据前后状态,支持回滚
- 零侵入:业务代码无需改动,自动代理数据源
适用场景:
- 大多数业务场景
- 对一致性要求不是极端严格
- 性能要求较高
注意:AT模式有脏写风险,需配合全局锁和数据库事务隔离级别。
【面试题】10. Redis分布式锁怎么解决锁续期和锁释放问题?
【标准答案】 Redis分布式锁的两大问题:锁续期和锁释放。
锁续期问题:
- 业务执行时间超过锁过期时间,锁自动释放,其他线程获得锁
- 解决:看门狗机制(Watchdog),后台线程定期续期
锁释放问题:
- 线程A的锁过期被释放,线程B获得锁,线程A执行完释放了B的锁
- 解决:Lua脚本保证原子性,释放时校验锁持有者
Redisson实现:
java
RLock lock = redisson.getLock("myLock");
lock.lock(); // 自动续期,默认30秒过期,每10秒续期
try {
// 业务逻辑
} finally {
lock.unlock(); // Lua脚本原子释放,校验持有者
}生产建议:
- 用Redisson,别自己造轮子
- 集群环境用RedLock或Redisson的MultiLock
- 锁粒度要小,避免大锁影响并发