SpringCloud Gateway 組件的使用

作者:小凱
沉淀、分享、成長,讓自己和他人都能有所收獲!

我發現了一個很有意思的縮寫單詞 gw、wg,都是網關的意思。因為 gw = gateway、wg = wangguan,所以在各個系統開發中,既有 gw 也有 wg 的存在。而網關也是各個互聯網中用于統一對外的核心系統,當然使用網關的手段也不同,有中大廠自研,也有中小廠使用開源的組件。所以這個系列會陸續的分享出各個類型的網關,讓大家了解以及按需選擇使用。

其實只要一個公司有拆分較多的微服務,有很多的應用都要對外提供接口,就需要引入網關系統。否則就會有非常多共性功能重復在各個系統開發。比如;負載、熔斷、降級、限流、切量、統一登錄、地址轉發等功能。這些東西要是讓每個系統實現一遍,后續是非常難管理的。
那么這么多開源網關選擇哪個,或者如何自研網關呢,后面陸續的分享出各個網關的介紹和使用,以及自研的教程,讓大家可以積累自己的知識體系以及做技術選型。

前面已經分享了一篇 Higress (opens new window)今天分享的是 SpringCloud Gateway

官網:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#glossary(opens> new window)
案例:https://gitcode.net/KnowledgePlanet/road-map/xfg-dev-tech-springcloud-gateway(opens> new window)

Spring Cloud Gateway 是一套非常容易使用的網關服務,通過yml配置或者代碼編程的方式實現網關功能。對于網關你可以理解在接收一個 http 請求后,通過網關的配置過濾、替換、攔截、轉發等操作到指定的請求地址上去。

一、SpringCloud Gateway 介紹
Spring Cloud Gateway 是一個基于 Spring Framework 和 Spring Boot 提供的網關解決方案。可以幫助開發者輕松地構建出具有動態路由、限流、熔斷等特性的 API 網關。
在這里插入圖片描述

1.基于異步非阻塞模型:Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用了異步非阻塞的 API,可以提供更高的吞吐量和更低的延遲。
2.動態路由:可以通過配置文件或者 API 動態地添加、修改或刪除路由規則,不需要重啟服務。
3.路由斷言:可以根據 HTTP 請求的各種參數(如路徑、頭部、請求參數等)來匹配路由。
4.過濾器:提供了一系列內置的 GatewayFilter 工廠,可以在請求被路由前或后執行各種操作,如修改請求頭、增加參數、限流等。同時也支持自定義過濾器。
5.集成與安全:可以與 Spring Cloud 的服務發現和斷路器等組件無縫集成,同時也可以集成 Spring Security 實現安全控制。
6.限流與熔斷:可以集成如 Resilience4J 等庫來實現限流和熔斷功能,保護后端服務不被過多的請求壓垮。
7.監控與跟蹤:可以與 Spring Cloud Sleuth 和 Zipkin 等組件集成,實現請求的跟蹤和監控。
Spring Cloud Gateway 的工作原理是將進入的 HTTP 請求根據配置的路由規則轉發到對應的后端服務。它在轉發請求的過程中可以執行一系列的過濾器鏈,這些過濾器可以修改請求和響應,或者根據特定的邏輯決定是否繼續處理請求。

二、環境部署

  1. 測試工程
    在這里插入圖片描述
  • 注意;本機安裝了 docker 或者云服務器安裝了 docker + compose。
  • 在提供的案例工程中,包括;環境配置(nacos - 注冊中心、redis - 限流使用)、curl 測試訪問網關地址、app 是網關配置、provider-01\02 是2個測試工程,提供了2個接口,方便驗轉發。
  • 最后的 webflux 是使用這項技術來模擬開發網關,讓大家了解到 SpringCloud Gateway 簡單運行機制。
  1. 基礎環境
    開發環境:JDK 17
    云服務器:2c4g 最低,我是用的 2c8g 體驗的。https://yun.xfg.plus (opens new window)- 價格實惠。
    基礎環境:Docker、Portainer、Git
    在這里插入圖片描述
  • docker 安裝 mysql 會自動根據 docker compose 腳本配置,把 nacos 需要的 sql 導入進去。
  • Phpmyadmin - MySQL 后臺管理工具、redis-admin - Redis 后臺管理工具。
  1. 生產接口
    xfg-dev-tech-gateway-provider-01、xfg-dev-tech-gateway-provider-02,分別提供了2個生產的 http 接口。你可以啟動服務后單獨訪問接口測試。我們這里主要的用途是通過網關來使用這2個接口。

📢 注意以下測試,都要先啟動這2個接口提供者工程。

3.1 生產者01

@RestController()
@CrossOrigin("*")
@RequestMapping("/api/user/")
public class HiGatewayController {/*** curl http://127.0.0.1:8091/api/user/hi*/@RequestMapping(value = "hi", method = RequestMethod.GET)public String hi() {return "hello gateway,provider 01";}}
3.1 生產者01
@RestController()
@CrossOrigin("*")
@RequestMapping("/api/user/")
public class HiGatewayController {/*** curl http://127.0.0.1:8092/api/user/hi*/@RequestMapping(value = "hi", method = RequestMethod.GET)public String hi() {return "hello gateway,provider 02!";}}

三、模擬網關 - webflux
基于 webflux 開發 api網關,不要引入 spring web 組件,而是引入以下組件;

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.97.Final</version>
</dependency>
  1. 簡單路由
@Configuration
public class GatewayRouter {@Beanpublic RouterFunction<ServerResponse> routeToService() {return RouterFunctions.route(GET("/service1").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),request -> ServerResponse.ok().bodyValue("Response from Service 1")).andRoute(GET("/service2").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),request -> ServerResponse.ok().bodyValue("Response from Service 2"));}}
  • 這是一個請求地址和返回接口的簡單路由。
  • 你可以啟動服務后,訪問地址:http://localhost:9091/service1 http://localhost:9091/service2
  1. 接口路由
@Configuration
public class ApiGatewayConfiguration {private final WebClient.Builder webClientBuilder;public ApiGatewayConfiguration(WebClient.Builder webClientBuilder) {this.webClientBuilder = webClientBuilder;}/*** curl http://localhost:9091/wg/service1/8091* curl http://localhost:9091/wg/service2/8092* @return*/@Beanpublic RouterFunction<ServerResponse> routerFunction() {return route(GET("/wg/service1/{id}"), this::service1Handler).andRoute(GET("/wg/service2/{id}"), this::service2Handler);}public Mono<ServerResponse> service1Handler(ServerRequest request) {String id = request.pathVariable("id");Mono<String> response = webClientBuilder.build().get().uri("http://127.0.0.1:8091/api/user/hi?" + id).retrieve().bodyToMono(String.class);return ServerResponse.ok().body(response, String.class);}public Mono<ServerResponse> service2Handler(ServerRequest request) {String id = request.pathVariable("id");Mono<String> response = webClientBuilder.build().get().uri("http://127.0.0.1:8092/api/user/hi?" + id).retrieve().bodyToMono(String.class);return ServerResponse.ok().body(response, String.class);}}

在這里插入圖片描述

-通 過 routerFunction 對不同的請求地址進行轉發操作。

  • 如圖 curl http://localhost:9091/wg/service1/8091、curl http://localhost:9091/wg/service2/8092 可以得到不同的響應結果。

四、網關測試 - SpringCloud Gateway
在這里插入圖片描述

  • 文檔:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html(opens new window)
  • 使用:你可以右鍵翻譯文檔,根據文檔的說明來配置各個場景驗證網關使用。
  1. yml配置
spring:redis:host: 127.0.0.1port: 16379database: 0lettuce:pool:max-active: 10max-wait: 1000max-idle: 5min-idle: 3application:name: xfg-dev-tech-springcloud-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacoslocator:enabled: truegateway:discovery:locator:enabled: trueglobalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods: "*"alloedHeaders: "*"routes:- id: route_01uri: lb://provider-01order: 1predicates:- Path=/gw/**- Weight=group1, 1filters:- StripPrefix=1- id: route_02uri: lb://provider-02order: 1predicates:- Path=/gw/**- Weight=group1, 9filters:- StripPrefix=1- name: RequestRateLimiterargs:key-resolver: "#{@ipKeyResolver}" # 限流方式:Bean名稱redis-rate-limiter.replenishRate: 1 # 生成令牌速率:個/秒redis-rate-limiter.burstCapacity: 3 # 令牌桶容量redis-rate-limiter.requestedTokens: 1 # 每次消費的Token數量
  • 配 置 Redis 是為了使用限流組件,同時要配置 RequestRateLimiter 類,配置對應的限流 bean 名稱。
  • n acos 是注冊中心,網關走的是 nacos 注冊中心里的服務。這些服務是生產者接口配置了 nacos 注冊到注冊中心了。這樣就可以通過 lb://provider-02 進行訪問。lb = nacos,provider-02 是生產者配置的服務名稱。
  • 在 yml 配置中,一組 id: route_01 下面是對應的網關配置,以這個距離,訪問 Path=/gw/** 路徑,filters 過濾掉 StripPrefix=1 1個路徑 gw 其余的打到 provider-01 服務上,也就是可以訪問具體的服務了。另外 Weight=group1, 1 是權重配置,group1 代表這一組的,1 表示權重比。如果你不用 nacos,uri 也可以配置一個具體的 http 地址測試
  • 這些內容在 SpringCloud Gateway 官網有對應的介紹,直接按照文檔配置使用即可。
  1. 代碼配置
    源碼:cn.bugstack.xfg.dev.tech.config.RouteConfiguration
@Bean
public RouteLocator route(RouteLocatorBuilder builder, UriConfiguration uriConfiguration) {String httpUri = uriConfiguration.getHttp();return builder.routes().route(p -> p.path("/baidu").uri("https://www.baidu.com/")).route(p -> p.path("/bugstack").uri("https://bugstack.cn/md/road-map/road-map.html")).route(p -> p.path("/error").uri("forward:/fallback")).route(p -> p.path("/get").filters(f -> f.addRequestHeader("Hello", "World")).uri(httpUri)).build();
}
  • 除了 yml 中的配置,還可以使用代碼配置。有代碼配置是非常重要的,這樣就可以根據寫到數據庫中的數據,以及提供一個管理后臺來操作網關的配置了,在網關啟動的時候從數據庫讀取數據來動態實例化所有的配置內容。
  1. 測試驗證
    啟動服務后,訪問地址:curl http://localhost:8090/gw/api/user/hi、curl http://localhost:8090/error
    在這里插入圖片描述
  • 訪問后,分別可以看到不通的響應結果。
    五、網關學習
    除了業務開發,自己也是非常感興趣于這樣的網關技術組件的實現,所以在日常的工作中也積累了很多網關的設計。
    在這里插入圖片描述

整個API網關設計核心內容分為這么五塊;

  • 第一塊:是關于通信的協議處理,也是網關最本質的處理內容。這里需要借助 NIO 框架 Netty 處理 HTTP 請求,并進行協議轉換泛化調用到 RPC 服務返回數據信息。
  • 第二塊:是關于注冊中心,這里需要把網關通信系統當做一個算力,每部署一個網關服務,都需要向注冊中心注冊一個算力。而注冊中心還需要接收 RPC 接口的注冊,這部分可以是基于 SDK 自動掃描注冊也可以是人工介入管理。當 RPC 注冊完成后,會被注冊中心經過AHP權重計算分配到一組網關算力上進行使用。
  • 第三塊:是關于路由服務,每一個注冊上來的Netty通信服務,都會與他對應提供的分組網關相關聯,例如:wg/(a/b/c)/user/… a/b/c 需要匹配到 Nginx 路由配置上,以確保不同的接口調用請求到對應的 Netty 服務上。PS:如果對應錯誤或者為啟動,可能會發生類似B站事故。
  • 第四塊:責任鏈下插件模塊的調用,鑒權、授信、熔斷、降級、限流、切量等,這些服務雖然不算是網關的定義下的內容,但作為共性通用的服務,它們通常也是被放到網關層統一設計實現和使用的。【這塊內容可以自行擴展】
  • 第五塊:管理后臺,作為一個網關項目少不了一個與之對應的管理后臺,用戶接口的注冊維護、mock測試、日志查詢、流量整形、網關管理等服務。

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

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

相關文章

隨機地址生成器 - Cloudflare Workers

分享一個完全開源免費部署在 Cloudflare Workers 上的隨機地址生成器&#xff0c;支持全球 24 個國家/地區。 &#x1f517; 工具地址: https://address.chat-tempmail.com ? 特性 &#x1f30d; 支持生成 24 個國家/地區的地址&#x1f4f1; 響應式設計&#xff0c;完美支持…

CNN不是一個模型?

CNN不是一個模型&#xff1f; 結論&#xff1a; CNN 是模型架構而非具體模型&#xff0c;其定位類似深度學習領域的 「設計框架」&#xff0c;而非 LSTM&#xff08;具體單元結構&#xff09;或決策樹&#xff08;具體算法實體&#xff09;。CNN 的 「具體模型」 需要結合網絡…

愛基百客與真邁生物達成戰略合作,共推多組學科研服務升級

近日&#xff0c;武漢愛基百客生物科技有限公司&#xff08;以下簡稱“愛基百客”&#xff09;與真邁生物正式簽署戰略合作協議。此次戰略合作將聚焦表觀組學、單細胞時空組學等前沿科研領域&#xff0c;聯合打造基于自主創新技術的多組學科研服務方案&#xff0c;為科研人員提…

吳恩達:從斯坦福到 Coursera,他的深度學習布道之路

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 吳恩達&#xff1a;從斯坦福到 Coursera&#xff0c;他的深度學習布道之路 在人工智能…

開疆智能CCLinkIE轉ModbusTCP網關連接測聯無紙記錄儀配置案例

本案例是通過CCLinkIE轉ModbusTCP網關將記錄儀數據傳送到三菱PLC&#xff0c;具體操作過程如下。 &#xff08;1&#xff09; 無紙記錄儀與PT100傳感器連接正確后&#xff0c;將無紙記錄儀和PC通過網線連接&#xff0c;給無紙記錄儀上電&#xff0c;設置無紙記錄儀的IP地址及網…

【軟考高級系統架構論文】# 論軟件設計方法及其應用

論文真題 軟件設計 (Software Design,SD) 根據軟件需求規格說明書設計軟件系統的整體結構、劃分功能模塊、確定每個模塊的實現算法以及程序流程等,形成軟件的具體設計方案。軟件設計把許多事物和問題按不同的層次和角度進行抽象,將問題或事物進行模塊化分解,以便更容易解決…

Spring Boot 3.x 項目搭建 (一)

以下是一個基礎 Spring Boot 項目的創建指南&#xff0c;整合了官方推薦方式和實用配置&#xff0c;幫助您快速搭建可運行的項目骨架。 &#x1f31f; 一、項目創建方式 1. 在線工具 Spring Initializr&#xff08;推薦&#xff09; 步驟&#xff1a; 訪問 Spring Initializr…

《天行數據查詢系統項目介紹》

一、項目概述 天行數據查詢系統是一款功能豐富的 Android 應用程序&#xff0c;旨在為用戶提供便捷的信息查詢服務。該系統集成了多個實用的查詢功能&#xff0c;包括空氣質量查詢、天氣預報查詢、垃圾分類查詢、新聞資訊瀏覽以及身份證信息查詢等&#xff0c;方便用戶一站式獲…

對于服務器企業該如何進行搭建?

企業搭建服務器能夠實現網絡服務、數據存儲和管理等功能&#xff0c;選擇大家服務器不僅能夠實現高效的資源管理和對數據信息進行安全保護&#xff0c;還可以滿足網站運行的需求&#xff0c;下面&#xff0c;小編就主要來為大家介紹一下企業該如何進行服務器搭建&#xff1f; 搭…

重定向攻擊與防御

一、重定向攻擊的主要類型與技術原理 ICMP重定向攻擊 原理&#xff1a;攻擊者偽造網關身份發送虛假ICMP重定向報文&#xff0c;誘導主機修改路由表&#xff0c;將流量導向攻擊者控制的節點。 利用工具&#xff1a;如netwox 86可構造惡意重定向包&#xff0c;源IP偽裝為網關地…

SAP/S4 MM模塊之主數據管理

目錄 一、主要功能 1. 主數據管理 2.采購管理 3. 庫存管理 二、業務價值 三、主數據常見問題 3.1. 物料主數據維護錯誤 3.2. 供應商數據不完整或錯誤 3.3. 數據錄入延遲或遺漏 四、最佳實踐 1. 物料主數據標準化 2. 供應商主數據優化 3.庫存管控精細化 SAP MM&…

Flink Oracle CDC 總結

官方文檔 https://nightlies.apache.org/flink/flink-cdc-docs-release-3.3/zh/docs/connectors/flink-sources/oracle-cdc/ 版本 Flink 1.15.3CDC 2.3.0Oracle 11G 12C &#xff08;官網說支持19&#xff0c;未測試&#xff09; Jar包 https://repo1.maven.org/maven2/co…

django request.data.get 判斷有沒有 某個參數

在 Django 的視圖函數中&#xff0c;當你想要判斷請求&#xff08;request&#xff09;中是否包含某個特定的參數&#xff0c;你可以使用 request.data.get() 方法。這種方法不僅適用于 POST 請求&#xff08;例如&#xff0c;在創建資源時&#xff09;&#xff0c;也適用于任何…

SD-WAN在可擴展性與未來發展靈活性方面的優勢探討

在企業數字化轉型的浪潮中&#xff0c;網絡基礎設施的靈活性和擴展性成為企業關注的核心議題之一。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;作為一種新興的網絡技術&#xff0c;因其靈活、智能、高效的特性&#xff0c;逐漸取代傳統WAN&#xff0c;成…

4.9. 環境和分布偏移

目錄 4.9. 環境和分布偏移1&#xff09;分布偏移的類型 4.9. 環境和分布偏移 機器學習應用常被忽視數據來源和模型輸出處理。許多模型在測試集上表現好&#xff0c;但數據分布改變時會部署失敗&#xff0c;甚至模型決策本身可能破壞數據分布&#xff08;如貸款模型基于“穿牛津…

UI前端與數字孿生融合:打造智能工廠的可視化監控平臺

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在工業 4.0 與智能制造的浪潮中&#xff0c;數字孿生技術正從概念走向大規模落地。據麥肯錫報…

【數據集】3D-GloBFP:全球首個三維建筑輪廓數據集

目錄 一、數據集介紹:《3D-GloBFP:全球首個三維建筑輪廓數據集》主要數據來源:模型方法:?? 二、數據下載方式方式1:Figshare方式2:下載亞洲建筑高度數據(完整版)參考?? 數據集概述: 3D-GloBFP 是全球首個在單體建筑層面估算建筑高度的三維建筑輪廓數據集,基于 20…

python基于協同過濾的動漫推薦系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

MySQL 中 DATE、DATETIME 和 TIMESTAMP 的區別

MySQL 中 DATE、DATETIME 和 TIMESTAMP 的區別 在 MySQL 中&#xff0c;DATE、DATETIME 和 TIMESTAMP 都是用于存儲日期和時間的數據類型&#xff0c;但它們在格式、范圍、存儲大小、時區處理和功能上存在顯著差異。以下將逐步對比這些區別&#xff0c;幫助您根據實際需求選擇…

面試 — 預進行 — 面試前準備

好記憶不如爛筆頭&#xff0c;能記下點東西&#xff0c;就記下點&#xff0c;有時間拿出來看看&#xff0c;也會發覺不一樣的感受. 書接上回&#xff0c;雖然我已經闡述過一下&#xff0c;詳見面試 — 預準備 — 面試前準備攻略&#xff0c;但是我還是想再說一次&#xff0c;畢…