一、基礎概念
-
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)?