Java大師成長計劃之第24天:Spring生態與微服務架構之分布式配置與API網關

📢 友情提示:

本文由銀河易創AI(https://ai.eaigx.com)平臺gpt-4-turbo模型輔助創作完成,旨在提供靈感參考與技術分享,文中關鍵數據、代碼與結論建議通過官方渠道驗證。

在微服務架構中,如何管理多個微服務的配置以及如何統一管理所有微服務的請求路由是兩個非常關鍵的問題。分布式配置管理和API網關是解決這些問題的核心技術。本文將深入探討如何利用?Spring Cloud Config?實現分布式配置管理,以及如何通過?Spring Cloud Gateway?來實現統一的API網關功能。

一、分布式配置管理:Spring Cloud Config

在微服務架構中,隨著服務數量的日益增加,每個服務都有自己的配置。這些配置可能包括數據庫連接信息、消息隊列設置、API 密鑰等。在這種環境下,管理各個微服務的配置變得異常復雜。為了保持系統的靈活性和可維護性,分布式配置管理成為了不可或缺的一部分。Spring Cloud Config?是解決這一問題的有效方案,它為微服務提供了集中化的外部配置管理。接下來,我們將詳細討論 Spring Cloud Config 的工作原理、搭建步驟以及使用實例。

1.1 Spring Cloud Config 的工作原理

Spring Cloud Config 的設計理念是將應用程序的配置從應用程序代碼中分離出來,以達到動態管理的目的。其主要構成包含兩個部分:Config Server?和?Config Client

1.1.1 Config Server

Config Server?是配置服務的核心部分,它負責理解配置存儲的來源,并向各個微服務應用提供配置信息。通常,配置文件存儲在 Git 倉庫、SVN、文件系統等地方,Config Server 會定期從這些來源拉取最新的配置。

Config Server 的工作流程如下:

  1. 配置存儲:配置文件可以存儲在 Git 倉庫的特定路徑下,每個微服務的配置可以依據其服務名稱和環境(如?devtestprod)來管理。
  2. 配置訪問:當某個微服務啟動時,它會向 Config Server 發送請求,獲取對應環境下的配置文件。
  3. 動態更新:微服務在運行中可以通過機制(例如 Spring Cloud的?@RefreshScope?注解)動態刷新配置,而無需重啟服務。
1.1.2 Config Client

Config Client?是每一個微服務實例,負責與 Config Server 通信,獲取所需的配置信息。Config Client 通過 HTTP 請求從 Config Server 中拉取配置信息,并將其加載到應用程序的上下文中。

Config Client 的工作流程包括:

  1. 注冊服務:微服務在啟動時會自動注冊到 Config Server,告知服務名稱和當前環境。
  2. 獲取配置:微服務會根據自身的服務名稱和環境變量向 Config Server 請求配置文件,并在成功后將這些配置加載到應用上下文中。
  3. 動態配置:微服務要實現動態配置,可以使用 Spring 提供的?@RefreshScope?注解,使配置在后續的請求中得到實時更新,確保應用按照最新配置運行。

1.2 Spring Cloud Config Server 的搭建

接下來,我們來具體看看如何搭建一個簡單的 Spring Cloud Config Server,以便為微服務管理配置信息。

1.2.1 創建 Config Server 項目
  1. 使用 Spring Initializr

    ?

    首先,通過?Spring Initializr?創建一個新的 Spring Boot 項目。從可選的依賴中選擇?Spring Cloud Config Server

  2. 添加 Maven 依賴

    ?

    在生成的項目的?pom.xml?文件中,確保包含以下依賴:

    xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
  3. 配置?application.yml

    ?

    配置文件的?application.yml?將包括 Config Server 的基本設定,尤其是文件的存儲方式。在此例中,我們可以使用 Git 作為配置文件的存儲。

    yaml

    server:port: 8888  # Config Server 的端口spring:cloud:config:server:git:uri: https://github.com/your-repository/config-repo  # Git 倉庫的地址clone-on-start: true  # 啟動時克隆配置search-paths: 'config'  # 配置文件所在路徑
1.2.2 啟動 Config Server
  1. 配置啟動類

    ?

    在主啟動類中添加?@EnableConfigServer?注解,啟用 Config Server 功能。

    java

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication
    @EnableConfigServer  // 開啟 Config Server
    public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);  // 啟動服務}
    }
  2. 運行 Config Server

    ?

    啟動 Config Server 并訪問其端點。訪問?http://localhost:8888?端口時,應該會看到服務列表及配置信息。

1.3 Spring Cloud Config Client 的配置

有了 Config Server 后,我們可以配置微服務客戶端來從 Config Server 獲取配置信息。

1.3.1 通過 Maven 配置 Config Client
  1. 添加依賴

    ?

    在微服務項目的?pom.xml?中添加 Spring Cloud Config Client 的依賴:

    xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
1.3.2 配置?application.yml

在 Config Client 中配置連接 Config Server 的信息,包括服務名稱、Config Server 地址等:

yaml

spring:application:name: myapp  # 微服務的名稱cloud:config:uri: http://localhost:8888  # Config Server 的地址label: master  # Git 倉庫中的分支
1.3.3 使用動態配置
  1. @RefreshScope?注解

    ?

    若要讓微服務支持動態配置更新,需要在相關類(通常是控制器類)中使用?@RefreshScope?注解。這標識了該類支持實時刷新配置。

    java

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RefreshScope  // 使得該類支持動態更新
    public class MyAppController {@Value("${myapp.greeting}")  // 使用配置private String greeting;@GetMapping("/greeting")public String getGreeting() {return greeting;  // 返回配置的內容}
    }
  2. 定義初始配置

在 Git 倉庫中創建一個名為?myapp.yml?的配置文件,內容如下:

yaml

myapp:greeting: "Hello, Spring Cloud Config!"  # 定義問候語

1.4 驗證配置

  1. 啟動微服務

    ?

    啟動微服務實例,訪問?http://localhost:8080/greeting?端點,您應該能夠看到從 Config Server 加載的配置內容。

  2. 動態刷新

    ?

    當配置文件更新后,用戶可以通過調用微服務的?/actuator/refresh?端點(需包含 Spring Boot Actuator 依賴)來刷新配置,通過?@RefreshScope?注解實現實時更新。

1.5 總結

通過使用?Spring Cloud Config,微服務架構實現了分布式配置管理,將應用程序的配置信息集中存儲和管理。Config Server 為各個微服務提供了動態和集中化的配置服務,顯著簡化了微服務的配置管理過程。通過動態配置及刷新機制,開發者可以有效地維護和更新各項配置,最大限度地減小系統運維的復雜性和出錯率,將更多精力放在業務發展上。


二、API 網關:Spring Cloud Gateway

在微服務架構中,隨著服務數量的不斷增加,如何有效地管理服務間的流量,保證系統的高可用性、擴展性以及安全性,成為了一個亟待解決的問題。API 網關作為微服務架構的重要組成部分,它為所有客戶端提供了統一的訪問入口,并負責請求的路由、負載均衡、安全驗證、限流等工作。Spring Cloud Gateway?是 Spring 團隊開發的一個高效的 API 網關,基于 Spring WebFlux 構建,支持異步編程和響應式架構,能夠處理高并發的請求。

2.1 Spring Cloud Gateway 的功能

Spring Cloud Gateway 提供了以下核心功能,這些功能可以幫助開發人員解決微服務架構中的許多復雜問題:

2.1.1 路由功能

API 網關的最基本功能是請求路由。Spring Cloud Gateway 可以根據請求的 URL、請求頭、請求參數等信息,將請求路由到不同的微服務。Spring Cloud Gateway 提供了非常靈活的路由配置,允許開發者定義復雜的路由規則。

路由規則可以基于以下條件進行匹配:

  • 請求路徑(Path):根據請求的 URI 路徑進行路由。
  • 請求頭(Headers):通過請求的頭部信息來決定路由。
  • 請求參數(Query Params):通過請求的查詢參數來決定路由。
  • HTTP 方法(Method):根據請求使用的 HTTP 方法(如 GET、POST)進行路由。
2.1.2 負載均衡

Spring Cloud Gateway 與 Spring Cloud的負載均衡工具(如 Ribbon)集成,能夠根據負載均衡策略將請求轉發到多個微服務實例中,從而有效提升系統的可用性和性能。通過負載均衡,API 網關可以動態選擇負載較小的服務實例進行請求轉發,避免單個服務實例的過載。

2.1.3 過濾器功能

Spring Cloud Gateway 提供了請求和響應的過濾器機制。過濾器是 API 網關中非常強大的功能,能夠在請求路由的過程中進行處理。例如,可以在請求到達服務之前對請求進行驗證、日志記錄、限流等操作,也可以在響應返回給客戶端之前對響應進行修改。

Spring Cloud Gateway 提供了以下幾種類型的過濾器:

  • 前置過濾器(Pre-filters):在請求被轉發到后端微服務之前進行處理。常見的應用場景包括請求鑒權、日志記錄、IP 黑名單等。
  • 后置過濾器(Post-filters):在請求從微服務返回并返回給客戶端之前進行處理。常見的應用場景包括響應壓縮、響應頭處理等。
  • 全局過濾器(Global filters):與前置和后置過濾器不同,全局過濾器會在每個路由請求中生效,可以用于對所有請求進行統一處理。
2.1.4 安全和鑒權

API 網關通常作為所有客戶端訪問微服務的唯一入口,因此它需要對請求進行安全驗證和鑒權。Spring Cloud Gateway 支持與常見的認證機制(如 OAuth 2.0、JWT)集成,從而實現對請求的身份驗證和授權。

  • JWT 認證:API 網關可以在請求中檢查 JWT Token,確保請求的合法性。如果驗證通過,則將請求轉發給目標微服務;如果驗證失敗,則返回相應的錯誤信息。
  • OAuth 2.0 認證:Spring Cloud Gateway 與 Spring Security 配合使用,支持 OAuth 2.0 的認證流程,保證只有授權的用戶才能訪問微服務資源。
2.1.5 限流與熔斷

Spring Cloud Gateway 內置了限流和熔斷功能,可以有效保護后端服務免受流量沖擊,避免服務過載。

  • 限流:API 網關可以設置請求的最大訪問頻率,超出頻率的請求會被拒絕。可以基于請求的 IP 地址、路徑、HTTP 方法等進行限流控制。
  • 熔斷:當后端服務不可用或響應時間過長時,API 網關可以啟用熔斷機制,快速返回失敗響應,避免繼續請求已不可用的服務。
2.1.6 動態路由

Spring Cloud Gateway 支持動態路由,即可以在運行時動態修改路由規則,而不需要重啟服務。這對于需要靈活調整路由規則的場景(如 A/B 測試、藍綠部署等)非常有用。

通過 Spring Cloud Config 或其他配置管理工具,Spring Cloud Gateway 可以在不重啟網關的情況下實時獲取配置更新,并自動更新路由規則。

2.2 Spring Cloud Gateway 的搭建

為了更好地理解 Spring Cloud Gateway 的使用,下面我們將展示如何搭建一個簡單的 API 網關。

2.2.1 創建 Spring Boot 項目

首先,使用 Spring Initializr 創建一個新的 Spring Boot 項目,并選擇以下依賴:

  • Spring Cloud Gateway:API 網關的核心功能。
  • Eureka Discovery Client(可選):如果我們想要使用 Eureka 注冊中心進行服務發現。
  • Spring Boot Actuator(可選):用于暴露健康檢查、度量等端點。

在項目的?pom.xml?中,應該包含以下依賴:

xml

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2.2 配置路由規則

在?application.yml?中配置 Spring Cloud Gateway 的路由規則。例如,下面的配置將所有訪問?/api/**?的請求轉發到?http://localhost:8081?的服務上。

yaml

spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081  # 目標微服務的 URIpredicates:- Path=/api/**  # 路由條件,根據路徑匹配filters:- AddRequestHeader=X-Request-Foo, Bar  # 為請求添加自定義請求頭
2.2.3 啟動網關服務

創建主啟動類:

java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient  // 啟用 Eureka 客戶端(如果使用 Eureka 注冊中心)
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
2.2.4 運行網關服務

啟動網關應用程序后,網關將監聽在默認的 8080 端口。訪問?http://localhost:8080/api/**?路徑時,所有的請求都會被路由到配置的目標微服務(例如?http://localhost:8081)。

2.3 配置過濾器和限流

Spring Cloud Gateway 提供了多種過濾器,可以用于請求的前后處理。常見的過濾器使用場景包括日志記錄、認證、限流等。

2.3.1 配置限流

Spring Cloud Gateway 提供了內置的限流功能,可以對請求進行流量控制。例如,下面的配置實現了基于 IP 地址的限流:

yaml

spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081predicates:- Path=/api/** filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10  # 每秒生成 10 個請求redis-rate-limiter.burstCapacity: 20  # 最大容忍的請求數
2.3.2 配置認證過濾器

Spring Cloud Gateway 可以與 Spring Security 配合使用,實現請求的認證功能。例如,下面的配置為請求添加了 JWT 驗證過濾器:

yaml

spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081predicates:- Path=/api/**filters:- name: JwtAuthenticationFilterargs:auth-server: http://auth-server  # 認證服務器的地址

2.4 總結

Spring Cloud Gateway?是構建微服務架構中 API 網關的一個強大工具,提供了靈活的路由、負載均衡、安全認證、限流和熔斷等功能。它不僅能夠簡化微服務的服務間通信,還能有效保護微服務免受惡意流量和過載請求的影響。通過 Spring Cloud Gateway,開發者可以輕松管理服務之間的請求流量、驗證身份、監控請求等操作,從而保證微服務系統的高可用性、性能和安全性。


三、總結

在微服務架構中,分布式配置管理和 API 網關是兩個非常重要的組件。通過?Spring Cloud Config,我們可以集中管理微服務的配置信息,避免手動修改每個服務的配置文件,確保配置的一致性和動態刷新。與此同時,Spring Cloud Gateway?提供了統一的 API 網關功能,能夠處理請求的路由、負載均衡、安全認證、限流等任務,有效簡化了服務間的通信和治理工作。

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

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

相關文章

eSwitch manager 簡介

eSwitch manager 的定義和作用 eSwitch manager 通常指的是能夠配置和管理 eSwitch&#xff08;嵌入式交換機&#xff09;的實體或接口。在 NVIDIA/Mellanox 的網絡架構中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充當 eSwitch manager&am…

最新開源 TEN VAD 與 Turn Detection 讓 Voice Agent 對話更擬人 | 社區來稿

關鍵詞&#xff1a;對話式 AI | 語音智能體 | Voice Agent | VAD | 輪次檢測 | 聲網 | TEN GPT-4o 所展示對話式 AI 的新高度&#xff0c;正一步步把我們在電影《Her》中看到的 AI 語音體驗變成現實。AI 的語音交互正在變得更豐富、更流暢、更易用&#xff0c;成為構建多模態智…

AI實踐用例---日程規劃(通用日程管理文件ICS)靈感踩坑日常

我是一位踐行獨立開發者之路的菜鳥開發者。 由于執行力較差,常常有很多想法但是很多時候沒有去踐行。 所以我有了讓大模型為我生成日程安排的想法,這確實可以,很簡單。只需要將你的想法告訴ai就行了。 例如: 發給AI的提示詞: 我想你幫我對,嗯,未來的一年做一個嗯,大…

大疆無人機??DRC 鏈路

在大疆上云API中&#xff0c;??DRC 鏈路??通常指 ??Device-Cloud Remote Control Link&#xff08;設備-云端遠程控制鏈路&#xff09;??&#xff0c;它是無人機&#xff08;或設備&#xff09;與云端服務之間建立的??實時控制與數據傳輸通道??&#xff0c;用于實現…

tomcat一閃而過,按任意鍵繼續以及控制臺中文亂碼問題

問題描述 今天在打開tomcat,啟動startup.bat程序時 tomcat直接閃退,后面查找資料后發現,可以通過編輯startup.bat文件內容,在最后一行加入pause即可讓程序不會因為異常而終止退出 這樣方便查看tomcat所爆出的錯誤: 然后,我明確看到我的tomcat啟動程序顯示如下的內容,沒有明確…

中大型水閘安全監測系統解決方案

一、方案概述 中大型水閘作為水利工程的重要組成部分&#xff0c;承擔著調節水位、控制水流、防洪排澇等多重功能&#xff0c;在防洪減災、水資源配置、生態環境改善等方面發揮著巨大作用。然而&#xff0c;由于歷史原因&#xff0c;許多水閘存在建設標準偏低、質量較差、配套設…

軌跡誤差評估完整流程總結(使用 evo 工具)

roslaunch .launch rosbag play your_dataset.bag -r 2.0 ? 第二步&#xff1a;錄制估計軌跡 bash 復制編輯 rosbag record -O traj_only.bag /aft_mapped_to_init 運行一段時間后 CtrlC 停止&#xff0c;生成 traj_only.bag 第三步&#xff1a;提取估計軌跡和真值軌跡為…

Linux任務管理與守護進程

目錄 任務管理 jobs&#xff0c;fg&#xff0c;bg 進程組概念 任務概念 守護進程 守護進程的概念 守護進程的查看 守護進程的創建 ?編輯模擬實現daemon函數 任務管理 每當有一個用戶登錄Linux時&#xff0c;系統就會創建一個會話&#xff08;session&#xff09; 任何…

Json rpc 2.0比起傳統Json在通信中的優勢

JSON-RPC 2.0 相較于直接使用傳統 JSON 進行通信&#xff0c;在協議規范性、開發效率、通信性能等方面具有顯著優勢。以下是核心差異點及技術價值分析&#xff1a; 一、結構化通信協議&#xff0c;降低開發成本 傳統 JSON 通信需要開發者自定義數據結構和處理邏輯&#xff0c;…

機器學習與人工智能:NLP分詞與文本相似度分析

DIY AI & ML NLP — Tokenization & Text Similarity by Jacob Ingle in Data Science Collective 本文所使用的數據是在 Creative Commons license 下提供的。盡管我們已盡力確保信息的準確性和完整性&#xff0c;但我們不對數據的完整性或可靠性做任何保證。數據的使…

RK3568平臺OpenHarmony系統移植可行性評估

https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/quick-start/quickstart-appendix-compiledform.md 官方給的標準系統就是RK3568, 所以肯定可以, 關于硬件加速部分 看了鴻蒙RK3568開發板的GPU編譯配置,只能說能用 https://docs.openharmony.cn/pages/v4.1/zh-cn/…

論文淺嘗 | HOLMES:面向大語言模型多跳問答的超關系知識圖譜方法(ACL2024)

筆記整理&#xff1a;李曉彤&#xff0c;浙江大學碩士&#xff0c;研究方向為大語言模型 論文鏈接&#xff1a;https://arxiv.org/pdf/2406.06027 發表會議&#xff1a;ACL 2024 1. 動機 多跳問答&#xff08;Multi-Hop Question Answering, MHQA&#xff09;技術近年來在自然語…

機器學習中的特征工程:解鎖模型性能的關鍵

在機器學習領域&#xff0c;模型的性能往往取決于數據的質量和特征的有效性。盡管深度學習模型在某些任務中能夠自動提取特征&#xff0c;但在大多數傳統機器學習任務中&#xff0c;特征工程仍然是提升模型性能的關鍵環節。本文將深入探討特征工程的重要性、常用方法以及在實際…

Kotlin與Java的融合趨勢:從互操作到云原生實踐

在2025年的軟件開發領域&#xff0c;Kotlin和Java作為JVM生態的支柱語言&#xff0c;展現出強大的協同能力。Kotlin以其簡潔的語法和現代特性迅速崛起&#xff0c;而Java憑借其成熟生態和穩定性依然占據主導地位。通過兩者的融合&#xff0c;我們的實時聊天系統將開發效率提升了…

Python生成器:高效處理大數據的秘密武器

生成器概述 生成器是 Python 中的一種特殊迭代器&#xff0c;通過普通函數的語法實現&#xff0c;但使用 yield 語句返回數據。生成器自動實現了 __iter__() 和 __next__() 方法&#xff0c;因此可以直接用于迭代。生成器的核心特點是延遲計算&#xff08;lazy evaluation&…

Flask框架入門與實踐

Flask框架入門與實踐 Flask是一個輕量級的Python Web框架&#xff0c;以其簡潔、靈活和易于上手的特點深受開發者喜愛。本文將帶您深入了解Flask的核心概念、基本用法以及實際應用。 什么是Flask&#xff1f; Flask是由Armin Ronacher于2010年開發的微型Web框架。與Django等…

數學復習筆記 14

前言 和家里人交流了一下&#xff0c;他們還是希望我全力以赴初試&#xff0c;我確實也得放開了干&#xff0c;不要束手束腳的。好好加油。感覺公共課都沒有啥壓力&#xff0c;主要是專業課要好好加油&#xff0c;真不能過不了線&#xff0c;要是過不了線&#xff0c;啥都白搭…

金格iWebOffice控件在新版谷歌Chrome中不能加載了怎么辦?

金格iWebOffice控件是由江西金格網絡科技有限責任公司開發的中間件軟件&#xff0c;主要用于在瀏覽器中直接編輯Word、Excel、PowerPoint等Office文檔&#xff0c;曾經是一款優秀國產的WebOffice插件。 由于2022年Chrome等瀏覽器取消支持PPAPI接口&#xff0c;導致這款金格iWe…

ChatGPT 能“記住上文”的原因

原因如下 你把對話歷史傳給了它 每次調用 OpenAI 接口時&#xff0c;都會把之前的對話作為參數傳入&#xff08;messages 列表&#xff09;&#xff0c;模型“看見”了之前你說了什么。 它沒有長期記憶 它不會自動記住你是誰或你說過什么&#xff0c;除非你手動保存歷史并再次…

微信小程序van-dialog確認驗證失敗時阻止對話框的關閉

使用官方(Vant Weapp - 輕量、可靠的小程序 UI 組件庫)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名稱" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…