Spring Cloud 高頻面試題詳解(含代碼示例與深度解析)

文章目錄

  • Spring Cloud 高頻面試題詳解(含代碼示例與深度解析)
    • 1. 什么是 Spring Cloud?它與 Spring Boot 有什么關系?
    • 2. 服務發現:Eureka 和 Nacos 的區別與選型?
      • Eureka 示例與原理
      • Eureka vs Nacos 對比表
    • 3. 負載均衡:Ribbon 和 LoadBalancer 的區別?
      • Ribbon (已進入維護模式)
      • Spring Cloud LoadBalancer (官方新標準)
    • 4. 服務調用:Feign 和 OpenFeign?
    • 5. 服務容錯:Hystrix 和 Sentinel 的區別?
      • Hystrix (已停止維護)
      • Sentinel (阿里開源,目前主流)
    • 6. API 網關:Spring Cloud Gateway vs Zuul?
      • Zuul 1.x (Netflix,基于阻塞IO,已淘汰)
      • Spring Cloud Gateway (官方推薦,基于響應式)
    • 7. 分布式配置中心:Spring Cloud Config 和 Nacos?
      • Spring Cloud Config
      • Nacos Config
    • 總結

Spring Cloud 高頻面試題詳解(含代碼示例與深度解析)

本文旨在幫助求職者系統性地復習和準備 Spring Cloud 相關面試,涵蓋了從核心組件到高級用法的常見問題,并輔以代碼示例和表格對比,助你輕松拿下面試。


1. 什么是 Spring Cloud?它與 Spring Boot 有什么關系?

Spring Cloud 是一套分布式系統解決方案的規范集合,它基于 Spring Boot 提供了快速構建分布式系統中常見模式的工具(例如:配置管理、服務發現、斷路器、智能路由、微代理、控制總線、一次性令牌、全局鎖、領導選舉、分布式會話和集群狀態)。

關系與區別

  • Spring Boot:專注于快速、方便地開發單個微服務,提供了自動配置、起步依賴等特性,簡化了獨立服務的開發。
  • Spring Cloud:專注于微服務架構的協調與治理,它將多個 Spring Boot 應用程序整合起來,為它們提供分布式環境下的能力。

簡單比喻

Spring Boot 像是制造汽車的工廠,能快速造出許多功能獨立的汽車(微服務)。而 Spring Cloud 像是交通管理系統,負責所有汽車之間的通信、調度、交通規則(治理),確保整個交通網絡(微服務系統)有序、可靠地運行。


2. 服務發現:Eureka 和 Nacos 的區別與選型?

服務發現是微服務架構的基石,客戶端通過它來定位網絡上的服務實例。

Eureka 示例與原理

1. Eureka Server (服務端)

# application.yml
server:port: 8761
eureka:instance:hostname: localhostclient:register-with-eureka: false # 自身不注冊到Eurekafetch-registry: false       # 不獲取注冊信息service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2. Eureka Client (客戶端 - 服務提供者)

# application.yml
spring:application:name: user-service # 應用名稱,以后就用這個名字來調用服務
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # 注冊中心的地址

Eureka vs Nacos 對比表

特性EurekaNacos
核心功能服務注冊與發現服務注冊與發現、動態配置管理
一致性協議AP (保證可用性和分區容錯性)AP + CP 模式切換 (同時滿足一致性和可用性)
健康檢查Client Beat (客戶端心跳)Server Beat (服務端主動檢測) / Client Beat
負載均衡需集成 Ribbon集成 Ribbon,自身也提供
配置中心不支持原生支持,功能強大
管理界面功能相對簡單功能豐富,集成配置管理
社區生態Netflix 已停止維護,進入維護模式阿里巴巴開源,社區活躍,持續更新

選型建議

  • 老項目或簡單場景:Eureka 足夠。
  • 新項目強烈推薦 Nacos:它集注冊中心和配置中心于一體,功能更全面,性能更好,是目前的主流選擇。

3. 負載均衡:Ribbon 和 LoadBalancer 的區別?

Spring Cloud 提供了客戶端負載均衡器。

Ribbon (已進入維護模式)

Ribbon 是一個客戶端負載均衡器,通過與服務發現組件(如 Eureka)集成,獲取所有服務實例列表,然后在客戶端采用特定策略(如輪詢、隨機)進行調用。

// 在 RestTemplate 上使用 @LoadBalanced 注解即可開啟 Ribbon
@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced // 這個注解讓 RestTemplate 具有了客戶端負載均衡的能力public RestTemplate restTemplate() {return new RestTemplate();}
}// 使用時直接使用服務名代替IP地址
@Service
public class UserService {@Autowiredprivate RestTemplate restTemplate;public User findOrderByUserId(Long userId) {// 直接使用服務名 "order-service",Ribbon 會將其解析為實際地址并負載均衡String url = "http://order-service/orders/" + userId;return restTemplate.getForObject(url, User.class);}
}

Spring Cloud LoadBalancer (官方新標準)

由于 Ribbon 停止維護,Spring Cloud 官方推出了 LoadBalancer 作為其替代品。

如何使用

  1. 引入依賴 (通常包含在 spring-cloud-starter-loadbalancer 中)
  2. 同樣的代碼:上述 RestTemplate 的代碼無需改動,只需移除 Ribbon 依賴,引入 LoadBalancer 依賴即可無縫切換。
  3. 支持 Reactive:完美支持 WebClient 進行響應式編程。
// 使用 WebClient + LoadBalancer
@Service
public class UserService {@Autowiredprivate WebClient.Builder webClientBuilder;public Mono<User> findOrderByUserId(Long userId) {return webClientBuilder.build().get().uri("http://order-service/orders/" + userId) // 使用服務名.retrieve().bodyToMono(User.class);}
}

結論

  • 新項目務必使用 Spring Cloud LoadBalancer,它是官方欽定的未來。
  • 老項目如果使用 Ribbon,建議規劃遷移。

4. 服務調用:Feign 和 OpenFeign?

Feign 是一個聲明式的 Web Service 客戶端,它的目的是讓編寫 Java HTTP 客戶端變得更簡單。使用 Feign 時,只需要創建一個接口并加上注解即可。

OpenFeign 是 Spring Cloud 在 Feign 的基礎上支持了 Spring MVC 注解,并整合了 Ribbon 和 Eureka(現在主要是 LoadBalancer),從而大大簡化了服務間調用的開發。

示例:如何用 OpenFeign 優雅地調用服務

  1. 添加依賴spring-cloud-starter-openfeign

  2. 啟動類開啟 Feign

    @SpringBootApplication
    @EnableFeignClients // 開啟 Feign 客戶端功能
    public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
    }
    
  3. 聲明接口

    // 聲明這是一個 Feign 客戶端,并指定要調用的服務名
    @FeignClient(name = "order-service")
    public interface OrderServiceClient {// 定義接口方法,就像在寫 Spring MVC 的 Controller 一樣@GetMapping("/orders/{orderId}") // 映射 order-service 中的接口路徑Order getOrderById(@PathVariable("orderId") Long orderId);@PostMapping("/orders")Order createOrder(@RequestBody Order order);
    }
    
  4. 像調用本地服務一樣使用

    @Service
    public class UserService {// 直接注入 Feign 客戶端接口@Autowiredprivate OrderServiceClient orderServiceClient;public User getUserWithOrders(Long userId) {User user = userRepository.findById(userId);// 直接調用接口方法,Feign 會幫你處理HTTP請求、負載均衡、服務發現等所有底層細節List<Order> orders = orderServiceClient.getOrdersByUserId(userId);user.setOrders(orders);return user;}
    }
    

核心優勢接口化、聲明式的調用,極大地提高了開發效率,使代碼更清晰、更易于維護。


5. 服務容錯:Hystrix 和 Sentinel 的區別?

在分布式環境中,避免服務出現雪崩效應是重中之重。這就是服務容錯組件的作用。

Hystrix (已停止維護)

Hystrix 通過斷路器 (Circuit Breaker) 模式來實現容錯。

  • 熔斷:當失敗率達到閾值,斷路器打開,所有請求直接失敗,不再調用實際服務。
  • 降級:服務熔斷或資源不足時,提供一種備選方案(fallback),返回一個托底數據。
@RestController
public class OrderController {@Autowiredprivate OrderServiceClient orderServiceClient;// 使用 @HystrixCommand 指定降級方法@GetMapping("/user/{userId}/orders")@HystrixCommand(fallbackMethod = "getOrdersFallback")public List<Order> getOrders(@PathVariable Long userId) {return orderServiceClient.getOrdersByUserId(userId);}// 降級方法public List<Order> getOrdersFallback(Long userId) {return Collections.emptyList(); // 返回空列表作為托底數據}
}

Sentinel (阿里開源,目前主流)

Sentinel 功能更強大,不僅支持熔斷降級,還支持流量控制、系統自適應保護、實時監控等。

對比表

特性HystrixSentinel
核心焦點斷路器 (熔斷器)流量控制、熔斷降級、系統保護
配置方式代碼注解為主控制臺動態配置,規則可持久化
擴展性一般豐富 SPI 擴展接口
實時監控簡單的監控界面功能強大的實時監控和控制臺
規則持久化不支持支持多種數據源(如Nacos, Apollo)

結論

  • 新項目強烈推薦使用 Sentinel,功能更全面,控制臺更友好,配置更靈活。
  • Hystrix 已停止維護,僅為遺留系統存在。

6. API 網關:Spring Cloud Gateway vs Zuul?

API 網關是所有微服務的流量入口,負責路由、過濾、鑒權、限流等。

Zuul 1.x (Netflix,基于阻塞IO,已淘汰)

Spring Cloud Gateway (官方推薦,基于響應式)

Spring Cloud Gateway 基于 WebFlux 響應式編程模型,性能更高,功能更強。

核心概念

  • Route (路由):定義匹配條件和轉發目標。
  • Predicate (斷言):匹配 HTTP 請求的條件(如路徑、方法、頭信息)。
  • Filter (過濾器):處理請求和響應的邏輯(如添加請求頭、鑒權、限流)。

配置示例

spring:cloud:gateway:routes:- id: user_route # 路由IDuri: lb://user-service # 目標服務地址,lb:// 表示從注冊中心負載均衡predicates:- Path=/api/user/** # 斷言:路徑匹配filters:- StripPrefix=1 # 過濾器:去掉路徑中的第一個前綴(/api)- AddRequestHeader=X-Request-color, blue # 添加請求頭

結論

  • 無條件選擇 Spring Cloud Gateway,它是官方未來,性能優越,功能持續更新。Zuul 1.x 已徹底淘汰。

7. 分布式配置中心:Spring Cloud Config 和 Nacos?

集中管理所有微服務在不同環境下的配置文件。

Spring Cloud Config

  • Server端:從 Git、SVN 等倉庫拉取配置。
  • Client端:從 Server 端獲取配置。
  • 缺點:配置變更后,需要手動通過 Spring Cloud Bus 消息總線刷新所有客戶端,流程繁瑣。

Nacos Config

作為配置中心,Nacos 的優勢巨大

  1. 開箱即用:與注冊中心一體,無需額外部署。
  2. 動態刷新:通過 @RefreshScope 注解,客戶端能自動監聽配置變化并刷新,無需手動觸發 Bus。
  3. 管理界面:提供友好的 Web UI 管理配置。
  4. 多環境與灰度:支持命名空間 (Namespace) 和數據ID (Data ID) 進行環境隔離和灰度發布。

使用示例

  1. 添加依賴spring-cloud-starter-alibaba-nacos-config

  2. bootstrap.yml 中配置 Nacos Server 地址

    spring:application:name: user-servicecloud:nacos:config:server-addr: localhost:8848file-extension: yaml # 指定配置格式為yamlnamespace: dev # 指定命名空間(用于環境隔離)
    
  3. 在 Controller 中使用 @Value 并開啟自動刷新

    @RestController
    @RefreshScope // 這個注解是關鍵,允許動態刷新配置
    public class UserController {@Value("${user.config.title:默認標題}") // 冒號后面是默認值private String title;@GetMapping("/title")public String getTitle() {return this.title;}
    }
    

結論

  • Nacos 在配置中心方面完勝 Spring Cloud Config,是其完美的替代品,極大地簡化了分布式配置的復雜度。

總結

組件類別過去式 (Netflix 體系)現在與未來 (主流選擇)
服務發現EurekaNacos
負載均衡RibbonSpring Cloud LoadBalancer
服務調用FeignOpenFeign
服務容錯HystrixSentinel
API網關Zuul 1.xSpring Cloud Gateway
配置中心Spring Cloud ConfigNacos

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96319.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ascend310B重構驅動run包

在Atlas 200I AI加速模塊(Ascend310B)移植過程中如需要將自己編譯的Image、dt.img及內核模塊打包到啟動鏡像包中需要對"Ascend-hdk-310b-npu-driver-soc_<version>_linux-aarch64.run"(下面統稱驅動run包)進行重構。下面將介紹如何重構run包。 重構驅動run包需…

Leecode hot100 - 287. 尋找重復數

題目描述 287. 尋找重復數 - 力扣&#xff08;LeetCode&#xff09; 定一個包含 n 1 個整數的數組 nums &#xff0c;其數字都在 [1, n] 范圍內&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一個重復的整數。 假設 nums 只有 一個重復的整數 &#xff0c;返…

機器人控制器開發(驅動層——奧比大白相機適配)

文章總覽 編譯OrbbecSDK_ROS2的代碼 執行命令 colcon buildros2 launch orbbec_camera dabai.launch.py問題1&#xff1a; 運行時報錯&#xff1a; [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not…

`vcpkg` 微軟開源的 C/C++ 包管理工具的使用和安裝使用spdlog

vcpkg 是 微軟開源的 C/C 包管理工具&#xff0c;類似于 Python 的 pip、Node.js 的 npm、Rust 的 cargo。 它的主要作用是&#xff1a;幫助你快速下載、編譯、安裝和管理 C/C 第三方庫&#xff0c;并自動配置到你的項目&#xff08;比如 Visual Studio、CMake、MSBuild&#x…

Mysql 幻讀詳解

我們來詳細地聊一聊 MySQL InnoDB 中的“幻讀”&#xff08;Phantom Read&#xff09;問題。這是一個在數據庫事務隔離中非常核心且有時令人困惑的概念。 我會從定義、例子、原因以及解決方案幾個方面來徹底講清楚。 1. 什么是幻讀&#xff1f; 官方定義&#xff1a;幻讀指的…

如何生成 GitHub Token(用于 Hexo 部署):保姆級教程+避坑指南

如何生成 GitHub Token&#xff08;用于 Hexo 部署&#xff09;&#xff1a;保姆級教程避坑指南 前置說明&#xff1a;為什么需要 GitHub Token&#xff1f; 在使用 Hexo 部署博客到 GitHub Pages 時&#xff0c;你可能會遇到「密碼驗證失敗」或「需要雙重驗證」的問題——這…

常用加密算法之 AES 簡介及應用

相關系列文章 常用加密算法之 SM4 簡介及應用常用加密算法之 RSA 簡介及應用 引言 AES&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09;是一種??廣泛使用的對稱分組加密算法??&#xff0c;它使用相同的密鑰進行加密和解密操作&#xff0c…

Java面試問題記錄(一)

一、Java 核心基礎與進階1、我們知道 Java 中存在 “值傳遞” 和 “引用傳遞” 的說法&#xff0c;你能結合具體例子&#xff0c;說明 Java 到底是值傳遞還是引用傳遞嗎&#xff1f;這背后涉及到 JVM 中哪些內存區域的交互&#xff1f;Java中只有值傳遞&#xff0c;不存在引用傳…

Redis 主從復制、哨兵與 Cluster 集群部署

文章摘要 本文基于 VMware 虛擬機環境&#xff0c;詳細講解 Redis 高可用架構的核心組件與部署流程&#xff0c;涵蓋三大核心模塊&#xff1a;Redis 主從復制&#xff08;實現數據備份與讀寫分離&#xff09;、Redis 哨兵&#xff08;基于主從復制實現故障自動轉移&#xff0c;…

ElementUI 中 validateField 對部分表單字段數組進行校驗時多次回調問題

目錄 方案一&#xff1a;循環調用 Promise.all 合并結果 方案二&#xff1a;直接傳入數組字段 總結 在實際業務中&#xff0c;我們有時只需要對表單的部分字段進行校驗。ElementUI 提供的 validateField 方法支持單個字段&#xff0c;也支持字段數組&#xff0c;但在使用時…

Visual Studio 2026 震撼發布!AI 智能編程時代正式來臨

Visual Studio 2026 震撼發布&#xff01;AI 智能編程時代正式來臨 Visual Studio 2026 Insider圖標 開發者們的開發環境即將迎來前所未有的智能革命&#xff0c;微軟用Visual Studio 2026 重新定義了編碼體驗。 2025年9月10日&#xff0c;微軟正式推出了Visual Studio 2026 In…

Gamma AI:高效制作PPT的智能生成工具

你有沒有過這種崩潰時刻&#xff1f;領導讓你下午交一份產品介紹 PPT&#xff0c;你打開模板網站翻了半小時沒找到合適的&#xff0c;好不容易選了個模板&#xff0c;又得手動調整文字間距、搭配圖片&#xff0c;光是把數據做成圖表就花了一小時&#xff0c;最后趕出來的 PPT 還…

Python副業新玩法:用Flask搭小程序后端,躺賺被動收入的秘密

凌晨1點&#xff0c;林浩合上電腦時&#xff0c;手機彈出一條微信消息——是上周幫一家社區水果店搭的小程序后端&#xff0c;商家發來了當月的服務費到賬提醒。他靠在椅背上笑了&#xff1a;這是這個月第8筆“睡后收入”&#xff0c;加起來剛好覆蓋了下個月的房貸。半年前&…

基于PyQt5和阿里云TTS的語音合成應用開發實戰[附源碼】

項目概述 本文將詳細介紹一個基于PyQt5圖形界面框架和阿里云TTS(Text-to-Speech)服務的語音合成桌面應用程序的開發過程。該應用提供了完整的文字轉語音功能,包括多音色選擇、參數調節、實時試聽、語速調節和音頻下載等特性。 技術棧 前端界面: PyQt5 語音合成: 阿里云TTS服…

基于esp32c3 rust embassy 的墨水屏程序

EPD Reader 基于ESP32-C3的電子墨水屏閱讀器&#xff0c;支持ap 配網、sntp 時間同步、txt閱讀、天氣預報、顯示節假日信息、農歷顯示、自動休眠、web配置等功能。這是在另一個項目 一個rust embassy esp32c3 的練習項目-CSDN博客的基礎上修改的 。 界面比較粗糙&#xff0c;以…

Spring 單例測試及線程安全

創建一個賬戶類 package com.duanhw.demo22.account;import org.springframework.beans.factory.annotation.Value;//Service public class AccountService {Value("1000")private Integer balance;//存款public void deposit(Integer amount){int newbalance balanc…

【vue】組件寬度調整失效后,調整的方法

父容器布局限制 若組件放置在柵格布局&#xff08;如display: grid&#xff09;或彈性容器中&#xff0c;父元素的寬度限制可能導致子組件寬度失效。解決方案是為父容器設置明確的寬度&#xff0c;或通過百分比布局實現自適應16。例如&#xff1a; <div style"width:…

Java 在Word 文檔中插入頁眉頁腳:一份實用的編程指南

在現代企業應用中&#xff0c;Java 開發者經常需要處理各種文檔操作&#xff0c;其中對 Word 文檔的自動化處理尤為常見。無論是生成報告、合同還是其他商業文檔&#xff0c;頁眉頁腳作為文檔結構的重要組成部分&#xff0c;承載著公司 Logo、頁碼、版權信息等關鍵內容。手動添…

深入解析Dart虛擬機運行原理

Dart虛擬機運行原理 一、Dart虛擬機 1.1 引言 Dart VM是一種虛擬機&#xff0c;為高級編程語言Dart提供執行環境&#xff0c;但這并意味著Dart在D虛擬機上執行時&#xff0c;總是采用解釋執行或者JIT編譯。 例如還可以使用Dart虛擬機的AOT管道將Dart代碼編譯為機器代碼&#xf…

光譜相機在AI眼鏡領域中的應用

一、核心應用場景?健康監測系統??實時生理指標分析?&#xff1a;通過眼周皮膚光譜特征&#xff0c;監測血氧(SpO?)和血紅蛋白變化&#xff0c;精度可達2%?血糖無創檢測?&#xff1a;近紅外光譜(900-1700nm)分析淚液成分&#xff0c;臨床測試相關系數R0.87?疲勞度評估?…