欢迎来到 Spring Cloud 面试题目 首页|www.kaoacca.cn
Spring Cloud 面试题目

Spring Cloud 面试题目|微服务架构核心考点精讲

本页面系统梳理 Spring Cloud 面试高频知识点,覆盖 Eureka、Ribbon、Feign、Hystrix、Zuul、Gateway、Config、Bus、Sleuth、Stream 等核心组件的原理、源码级解析与实战场景应对策略,结合真实面试题与参考答案,帮助开发者高效备战微服务方向技术面试。

Spring Cloud 核心组件深度解析

从注册中心、配置中心到网关、流控,系统掌握微服务架构四大支柱组件

〔1〕Eureka:服务注册与发现

基于 REST 的服务注册与发现组件,采用 AP 模型(高可用优先)。服务启动时向 Eureka Server 注册自身信息(IP、端口、元数据、健康检查 URL),客户端通过 Eureka Client 定期拉取注册表并缓存,实现客户端负载均衡。

关键机制:
• 注册:服务启动时发送 POST /eureka/apps/{appId}
• 续约:每 30 秒发送心跳(PUT /eureka/apps/{appId}/{instanceId})
• 续约失败阈值:90 秒未收到续约则剔除(默认)
• 自保护模式:当 85% 以上服务续约失败时,不再剔除服务

高频考点

〔2〕Ribbon:客户端负载均衡

Ribbon 是 Netflix 开源的客户端负载均衡组件,与 Spring Cloud 集成后可实现动态服务调用。其核心是通过 IRule 接口支持多种策略:
• RoundRobinRule(轮询)
• RandomRule(随机)
• WeightedResponseTimeRule(加权响应时间)
• BestAvailableRule(最低并发)
• AvailabilityFilteringRule(过滤故障实例)

示例:在 @LoadBalanced 的 RestTemplate 中自动启用 Ribbon。

原理级掌握

〔3〕Feign:声明式服务调用

Feign 是声明式 HTTP 客户端,通过注解定义接口,自动拼接 URL、序列化请求体、处理响应。底层集成 Ribbon 实现负载均衡,集成 Hystrix 实现熔断降级。

典型用法:

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}
注意:Spring Cloud OpenFeign 从 spring-cloud-starter-netflix-feign-client 升级为 spring-cloud-starter-openfeign(2020.0.0+)

实战高频

〔4〕Hystrix:服务容错与熔断

提供断路器、线程隔离、降级、缓存、监控等能力。核心注解:
• @HystrixCommand(fallbackMethod = "fallback")
• @HystrixCommand(commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000") })

熔断机制:
• 请求失败率 > 50% → 触发熔断(默认)
• 半开状态:每 5 秒尝试恢复
• 拒绝策略:抛异常 / 返回默认值 / 调用备用服务

必考重点

〔5〕Gateway:新一代 API 网关

基于 WebFlux + Reactor 实现的非阻塞网关,替代 Zuul。核心组件:
• Route(路由):路径匹配 + 过滤器
• Predicate(断言):路径、Cookie、Header、参数等匹配
• Filter(过滤器):请求/响应修改(如添加 Header)

配置示例:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
支持全局 Filter(如 JWT 校验、限流)与路由级 Filter 组合使用。

趋势重点

〔6〕Config:分布式配置中心

集中管理微服务配置,支持 Git/SVN 存储后端。Server 端暴露 REST API,Client 端通过 @RefreshScope 实现配置热更新(需配合 Bus 或手动刷新)。

安全实践:
• 使用 Vault 存储敏感配置
• 启用 HTTPS + Basic Auth
• 配置加密解密(JCE + RSA)

进阶应用

〔7〕Sleuth + Zipkin:链路追踪

Sleuth 自动注入 TraceId/SpanId,Zipkin 负责收集与可视化。关键概念:
• Trace:一次完整请求链路(唯一 TraceId)
• Span:链路中的逻辑节点(开始/结束时间、标签)
• Annotation:关键时间点(cs、sr、ss、cr)

典型数据:

2024-06-15 10:20:33.123 INFO [user-service,7f8e9a0b1c2d3e4f,7f8e9a0b1c2d3e4f,true] 1 --- UserResource: [GET] /users/123
其中:[应用名, traceId, spanId, 是否导出]

可观测性

〔8〕Stream:消息驱动微服务

屏蔽消息中间件差异,统一编程模型。核心抽象:
• Source(发布者)→ Binder(适配器)→ Destination(通道)→ Consumer(消费者)

典型绑定:

@EnableBinding(Source.class)
public class EventPublisher {
    @Autowired
    private Source source;
    public void publish(String msg) {
        source.output().send(MessageBuilder.withPayload(msg).build());
    }
}
支持 Kafka、RabbitMQ、RocketMQ 等 Binder。

异步架构

热点专题:微服务架构实战问题

聚焦开发者最常遇到的 5 类核心问题,结合真实场景深入剖析

服务拆分的黄金法则与常见陷阱

服务拆分不是越细越好!过度拆分会导致:
• 调用链过长,链路追踪困难
• 事务一致性成本剧增
• 运维复杂度指数级上升
• 网络开销显著增加(每层调用增加 RTT)

推荐拆分维度:
① 按业务域拆分(用户域、订单域、支付域)
② 按读写分离拆分(读服务 + 写服务)
③ 按稳定性拆分(高频服务独立部署)
④ 按团队边界拆分(避免跨团队依赖)

反模式警示:
• 数据库直连(绕过服务层)→ 违反“服务边界”原则
• 公共模块未抽取为独立服务 → 导致“服务内聚不足”
• 服务间循环依赖 → 引发启动失败或死锁

案例:某电商系统将“库存服务”与“订单服务”拆分后,订单创建时需调用库存服务扣减库存,但库存服务又依赖订单服务查询历史数据,最终通过引入“库存预占+异步确认”机制解耦。

分布式事务方案对比与选型指南

常见方案:

方案 一致性 性能 适用场景 缺点
Seata(AT 模式) 强一致 中 单库事务、低并发 依赖全局锁,高并发下易冲突
Seata(TCC 模式) 最终一致 高 高并发、核心链路 需人工实现 try/confirm/cancel
消息事务(RocketMQ) 最终一致 高 异步解耦、非关键事务 需处理“消息重复”问题
Saga 模式 最终一致 高 长事务、跨系统 回滚逻辑复杂,需补偿机制

选型建议:
• 支付、库存扣减 → TCC(强一致性)
• 订单创建 → 消息事务(最终一致)
• 会员积分 → Saga(跨外部系统)

微服务安全:从网关到认证中心

主流安全架构:
① 网关统一鉴权(Gateway + JWT)
② OAuth2 + UAA(认证中心)
③ Spring Security + Resource Server

JWT 实践要点:
• 签名算法:RS256(非对称)优于 HS256
• 过期时间:access_token=15min,refresh_token=7d
• 黑名单机制:支持强制下线
• 令牌绑定:将用户 ID + 设备指纹作为附加校验

配置示例(Gateway):

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://uaa.kaoacca.cn
          jwk-set-uri: https://uaa.kaoacca.cn/.well-known/jwks.json
注意:生产环境应关闭 JWT 的 exp 自动验证,改用自定义过滤器实现更灵活控制。

高并发场景下的限流与降级策略

限流维度:
• 单机限流:令牌桶 / 漏桶(Sentinel)
• 分布式限流:基于 Redis + Lua(如 Gateway 全局限流)
• 热点参数限流:按参数值区分限流(Sentinel 支持)

Sentinel 配置示例:

@SentinelResource(value = "getUser", blockHandler = "blockHandler")
public User getUser(Long id) { ... }
public User blockHandler(Long id, BlockException ex) {
    return User.builder().id(id).name("系统繁忙").build();
}
降级策略:
• 超时降级:设置 Feign 超时时间 + Hystrix fallback
• 故障降级:调用本地缓存或 mock 数据
• 熔断降级:Hystrix 熔断后自动切换备用服务

真实案例:某秒杀活动通过 Gateway 限流(1000 QPS)+ Sentinel 热点参数限流(同一用户每秒最多 3 次)+ 本地缓存库存预热,成功应对 5000+ QPS 压力。

可观测性:从日志到指标到链路

ELK(Elasticsearch + Logstash + Kibana)用于日志聚合;
Prometheus + Grafana 用于指标监控;
Zipkin/Jaeger 用于链路追踪。

关键指标建议:
• 服务健康:UP/DOWN、实例数、响应时间(P95/P99)
• 错误率:5xx 错误占比、异常堆栈频率
• 业务指标:订单创建成功率、支付成功率、库存扣减失败率

告警策略:
• 静态阈值:响应时间 > 1s 持续 2 分钟
• 动态阈值:环比增长 > 300%
• 关联告警:服务不可用 + 错误率突增

实践建议:将日志、指标、链路三者打通,通过 TraceId 关联日志,快速定位问题根因。

面试技巧:如何展现微服务深度

从技术广度到深度,构建完整的回答逻辑

● 面试前准备(提前 7 天)
• 重读 Spring Cloud 官方文档核心章节
• 整理个人项目中的微服务实践(拆分逻辑、遇到的问题、解决方案)
• 动手搭建一套最小可运行 Demo(Eureka + Gateway + Config)
• 制作个人技术图谱(用 Xmind 绘制组件关系图)
● 面试中回答结构
  • 场景还原:先描述业务背景(如“我们系统有 12 个微服务,订单创建需调用库存、用户、支付服务”)
  • 技术选型:说明为何选择 Eureka 而非 Consul/Nacos(如“初期团队熟悉 Netflix 生态”)
  • 核心流程:结合流程图说明调用链(注册 → 发现 → 负载 → 熔断 → 网关路由)
  • 问题与优化:重点讲遇到的坑(如“Eureka 自保护模式导致服务不可用,通过调整阈值解决”)
  • 延伸思考:提出改进方向(如“后续引入 Sentinel 实现更细粒度的流控”)
● 面试后复盘
• 记录被问到但答不上的问题 → 查漏补缺
• 总结回答逻辑是否清晰 → 优化表达结构
• 将项目经验沉淀为技术博客 → 提升个人影响力

避坑指南:
⚠️ 不要说“没用过 Hystrix,我们用 Sentinel”——应解释替代方案的合理性
⚠️ 不要死记硬背参数(如“Eureka 续约间隔是 30 秒”),而应说明“这是 Netflix 基于网络抖动容忍度设定的平衡值”
⚠️ 遇到不会的问题,可说“我目前理解有限,但我的思路是……” + 分析框架

高频问答:Spring Cloud 面试 20 问

精选 20 道高频真题,附参考答案与延伸思考

Q1:Eureka 的自我保护模式是什么?何时触发?如何解决?

参考答案:自我保护模式是 Eureka 在网络不稳定时的容错机制。当 15 分钟内续约失败的服务比例 > 85%,Eureka Server 启用保护模式,不再剔除服务(即使续约失败)。

触发条件:
• 网络抖动导致大量心跳丢失
• 服务实例异常退出未发送注销请求
• Server 与 Client 网络分区

解决方案:
① 生产环境禁用(eureka.server.enable-self-preservation=false)
② 优化心跳频率(eureka.instance.lease-renewal-interval-in-seconds=10)
③ 结合 Zookeeper/Etcd 做多注册中心

Q2:Ribbon 的负载均衡策略有哪些?如何自定义?

参考答案:内置策略:
• RoundRobinRule(轮询)
• RandomRule(随机)
• WeightedResponseTimeRule(加权响应时间)
• BestAvailableRule(最低并发)
• RetryRule(带重试的轮询)

自定义方式:

@Configuration
public class RibbonConfig {
    @Bean
    public IRule myRule() {
        return new WeightedResponseTimeRule() {
            @Override
            public Server choose(Object key) {
                // 自定义逻辑:优先选择同机房实例
                Server server = super.choose(key);
                if (server != null && server.getMetadata().get("zone").equals("cn-shanghai")) {
                    return server;
                }
                return null;
            }
        };
    }
}
注意:Spring Cloud 2020+ 版本需通过 LoadBalancerClient 替代 Ribbon。

Q3:Feign 和 OpenFeign 有什么区别?

参考答案:
• Feign 是 Netflix 开源的声明式客户端
• OpenFeign 是 Spring Cloud 对 Feign 的增强封装(自动集成 Ribbon/Hystrix)
• 使用方式:@EnableFeignClients + @FeignClient

版本差异:
• Spring Cloud 2020.0.0 之前:依赖 spring-cloud-starter-netflix-feign-client
• 之后版本:依赖 spring-cloud-starter-openfeign,默认禁用 Ribbon,需手动启用

Q4:Hystrix 熔断的三种状态是什么?如何流转?

参考答案:
• CLOSED(关闭):正常请求,失败率超阈值(默认 50%)→ 转 OPEN
• OPEN(开启):所有请求直接走 fallback,5 秒后 → 半开
• HALF_OPEN(半开):允许少量请求通过,成功 → CLOSED,失败 → OPEN

配置示例:

@HystrixCommand(
    commandProperties = {
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
    }
)
注意:Hystrix 已进入维护模式,推荐迁移到 Resilience4j 或 Sentinel。

Q5:Gateway 如何实现动态路由?

参考答案:通过 RouteDefinitionRepository 接口实现动态增删路由:

@Component
public class DynamicRouteService {
    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;
    public void addRoute(String id, String uri, String path) {
        RouteDefinition definition = new RouteDefinition();
        definition.setId(id);
        definition.setUri(URI.create(uri));
        PredicateDefinition predicate = new PredicateDefinition();
        predicate.setArgs(Collections.singletonMap("pattern", path));
        predicate.setName("Path");
        definition.setPredicates(Collections.singletonList(predicate));
        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
    }
}
生产中常配合数据库配置 + Apollo/Nacos 配置中心实现热更新。

Q6:Config Server 如何实现配置加密?

参考答案:
① 启用 JCE(Java Cryptography Extension)
② 生成密钥:keytool -genseckey -alias mysecret -keyalg AES -keysize 256 -storetype jceks -keystore mysecret.jceks
③ 配置加密密钥:encrypt.key-store.location=classpath:/mysecret.jceks
④ 加密值:curl -d "plain-text" localhost:8888/encrypt
⑤ 配置文件中使用:password: '{cipher}加密串'

Q7:Sleuth 中 TraceId 和 SpanId 如何生成?

参考答案:
• TraceId:128 位随机数(基于 java.util.UUID)
• SpanId:64 位长整型(基于 java.util.concurrent.atomic.AtomicLong)
• 通过 B3Headers 协议在 HTTP Header 中透传:
X-B3-TraceId、X-B3-SpanId、X-B3-ParentSpanId

Q8:Stream 如何保证消息不丢失?

参考答案:
• Producer:启用 ackMode=RECORD + retries
• Broker:配置 replication-factor=3 + min.insync.replicas=2
• Consumer:手动提交 auto.offset.reset=earliest + 异常重试
关键配置:

spring:
  cloud:
    stream:
      kafka:
        binder:
          producer-properties:
            acks: all
            retries: 3

Q9:如何避免微服务中的“雪崩”?

参考答案:
① 服务隔离:线程池隔离(Hystrix)或信号量隔离
② 降级策略:本地缓存、Mock 数据、返回默认值
③ 熔断机制:失败率超阈值时熔断
④ 限流:网关层限流 + 应用层 Sentinel
⑤ 超时控制:Feign 超时时间 < 服务处理时间
真实案例:某支付系统通过“库存预占 + 异步扣减”,即使下游服务宕机,也能保证用户下单成功。

Q10:Spring Cloud 如何实现灰度发布?

参考答案:
方案一:Gateway + 自定义 Filter(根据 Header/Token 路由)
方案二:Sentinel 流控规则(按来源服务灰度)
方案三:Canary(基于 Kubernetes Deployment)
示例:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service-gray
          uri: lb://user-service-gray
          predicates:
            - Header=X-Gray, true
生产推荐:灰度比例从 5% → 20% → 50% → 100%,配合监控指标决策。

核心组件对比表

快速掌握各组件特性与适用场景

组件 功能 替代方案 适用版本 推荐指数
Eureka 服务注册与发现 Nacos、Consul、Etcd ≤2020.0.0 ★★★☆
Ribbon 客户端负载均衡 Spring Cloud LoadBalancer ≤2020.0.0 ★★☆☆
Feign 声明式 HTTP 客户端 WebClient + OpenFeign ≥2020.0.0 ★★★★
Hystrix 熔断与降级 Resilience4j、Sentinel ≤2020.0.0 ★★☆☆
Zuul API 网关 Spring Cloud Gateway ≤2020.0.0 ★☆☆☆
Config 分布式配置中心 Nacos、Apollo 全版本 ★★★☆
Sleuth 链路追踪 Jaeger、SkyWalking 全版本 ★★★★
斌知网
蜀ICP备2026017620号-5