spring Could 高频面试题
一、基础概念
-
Spring Cloud 的核心组件有哪些?
- 答案:Eureka/Nacos(服务注册发现)、Ribbon/LoadBalancer(负载均衡)、Feign/OpenFeign(声明式HTTP客户端)、Hystrix/Sentinel(熔断限流)、Zuul/Gateway(API网关)、Config/Nacos(配置中心)、Sleuth/Zipkin(分布式链路追踪)。
-
Spring Cloud 与 Spring Boot 的关系?
- 答案:Spring Boot 提供快速开发单微服务的能力;Spring Cloud 基于 Boot 构建分布式系统的工具箱,整合第三方组件(如Netflix OSS)实现微服务治理。
二、服务注册与发现
-
Eureka 和 Nacos 的区别?
- 答案:
特性 Eureka Nacos 一致性协议 AP(最终一致性) AP + CP(可切换) 配置管理 ❌ ✔️(集成配置中心) 健康检查 客户端心跳 主动探测 + 心跳 权重/元数据 ❌ ✔️
- 答案:
-
Eureka 如何防止服务列表过期?
- 答案:
- 客户端每 30s 发送心跳到 Eureka Server。
- Server 若 90s 未收到心跳,则将实例标记为过期并从注册表移除。
- 客户端每 30s 从 Server 全量拉取服务列表(可配置增量同步)。
- 答案:
三、服务调用与负载均衡
-
Ribbon 的负载均衡策略有哪些?
- 答案:
RoundRobinRule
(轮询)RandomRule
(随机)WeightedResponseTimeRule
(响应时间加权)ZoneAvoidanceRule
(区域优先)
- 答案:
-
Feign 的工作原理?
- 答案:
- 通过
@EnableFeignClients
扫描接口; - 为接口生成动态代理;
- 调用时拼接 HTTP 请求,由 Ribbon 负载均衡选择实例;
- 默认使用 JDK 的
HttpURLConnection
发送请求(可替换为 OKHttp)。
- 通过
- 答案:
四、熔断与限流
-
Hystrix 熔断器的状态转换流程?
- 答案:
- 关闭(Closed):请求正常通过。
- 打开(Open):错误率超阈值(默认50%),熔断开启,请求直接失败。
- 半开(Half-Open):熔断一段时间后,尝试放行部分请求,若成功则关闭熔断。
- 答案:
-
Sentinel 对比 Hystrix 的优势?
- 答案:
- 实时监控:集成 Dashboard 实时显示 QPS/响应时间;
- 规则持久化:支持推送到 Nacos/Redis;
- 精细化控制:支持基于调用来源、热点参数的流控;
- 低开销:基于滑动窗口的统计,性能损耗更低。
- 答案:
五、API 网关
-
Spring Cloud Gateway 的过滤器类型?
- 答案:
- Pre 过滤器:在路由前执行(如限流、日志);
- Post 过滤器:在响应返回前执行(如修改响应头);
- 全局过滤器:作用于所有路由(如认证、请求记录)。
- 答案:
-
Gateway 如何实现动态路由?
- 答案:
- 集成 Nacos 或 Redis,监听路由配置变更;
- 实现
RouteDefinitionRepository
接口,从数据库读取路由规则; - 调用
RouteLocatorBuilder
动态刷新路由。
- 答案:
六、配置中心
-
Spring Cloud Config 的配置刷新原理?
- 答案:
- 客户端通过
@RefreshScope
标记需要刷新的 Bean; - 调用
/actuator/refresh
端点 → 触发RefreshEvent
事件; - 销毁旧 Bean 并重新初始化(依赖配置的 Bean会被重建)。
- 客户端通过
- 答案:
-
Nacos 配置中心如何保证高可用?
- 答案:
- 集群部署:至少 3 节点(推荐 Raft 协议);
- 数据持久化:配置存储到 MySQL(避免单点故障);
- 客户端缓存:本地缓存配置,即使 Server 宕机仍可运行。
- 答案:
七、分布式链路追踪
- Sleuth 的 TraceId 传递原理?
- 答案:
- 通过 HTTP Header(
X-B3-TraceId
)传递; - 集成
Feign
/RestTemplate
自动注入 Header; - 支持异步线程(
LazyTraceExecutor
包装线程池)。
- 通过 HTTP Header(
- 答案:
八、场景设计题
- 如何设计一个服务雪崩防护方案?
- 答案:
- 前端:请求限流(Nginx 层);
- 网关:Sentinel 全局 QPS 限流 + 熔断规则;
- 服务间:Feign 整合 Hystrix(设置超时、线程隔离);
- 数据库:连接池控制(如 HikariCP 最大连接数);
- 降级策略:返回兜底数据(如缓存中的旧数据)。
- 答案:
附:高频追问问题
- 为什么需要 API 网关?与 Nginx 的区别?
- Spring Cloud Alibaba 与 Netflix 组件的替代关系?
- 如何保证微服务之间调用的幂等性?
- 分布式事务在 Spring Cloud 中的解决方案(Seata)?