Skip to content

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的官方替代方案。

对比项RibbonSpring 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熔断器有三个状态:关闭、开启、半开启。

状态流转:

  1. 关闭 → 开启:错误率或慢调用比例超过阈值,触发熔断
  2. 开启 → 半开启:熔断时间窗口结束后,尝试放行一个请求探测
  3. 半开启 → 关闭:探测请求成功,恢复正常
  4. 半开启 → 开启:探测请求失败,重新熔断

熔断策略:

  • 慢调用比例:响应时间超过阈值的请求比例
  • 异常比例:异常请求占比
  • 异常数:异常请求绝对数量

配置要点:熔断时长要合理,太短频繁探测,太长影响恢复。


【面试题】6. 令牌桶和漏桶限流算法有什么区别? ​

【标准答案】 两者都是限流经典算法,但适用场景不同。

漏桶算法:

  • 流量先进桶,以恒定速率流出
  • 流入大于桶容量则溢出(拒绝)
  • 特点:输出流量平滑,适合保护下游不被突发流量冲击

令牌桶算法:

  • 以固定速率生成令牌放桶里
  • 请求来时取令牌,取不到则拒绝
  • 特点:允许一定程度的突发流量,桶里有令牌就能瞬间通过

实际选择:

  • 漏桶:适合削峰填谷、流量整形
  • 令牌桶:适合API限流,允许合理突发
  • Sentinel默认用令牌桶,Guava RateLimiter也是令牌桶

【面试题】7. Spring Cloud Gateway怎么实现统一的JWT鉴权? ​

【标准答案】 Gateway作为API网关,天然适合做统一鉴权。

实现方案:

  1. 编写全局过滤器GlobalFilter,实现filter方法
  2. 从请求头提取Token,解析并校验JWT
  3. 校验通过:放行请求,可在Header中传递用户信息
  4. 校验失败:返回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最常用的模式,对业务零侵入。

核心机制:

  1. 一阶段:执行业务SQL,同时记录undo_log(前后镜像)
  2. 二阶段提交:删除undo_log,事务完成
  3. 二阶段回滚:用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
  • 锁粒度要小,避免大锁影响并发