Spring Cloud ------ Gateway

一、什么是網關

經常面試的人肯定知道,在去公司面試時,通常不會直接去面試官那里面試,而是先去前臺進行詢問面試官的所在地,并進行一些相關登記。而網關對于一個微服務項目來說,就類似于一個前臺,打到微服務中的請求通常都需要先到網關,由網關進行一些處理后,再打到相關服務上。

網關的處理具體包括以下幾個方面:

  • 權限控制:對請求進行權限校驗,校驗失敗則直接將請求進行攔截。
  • 動態路由:根據請求信息將請求轉發到對應的微服務上。
  • 負載均衡:當請求的目標服務有多個時,根據情況進行負載均衡
  • 限流:將請求按照設定的最大流量進行限流,以免各服務壓力過大?

目前市面上大多數都是使用Gateway來作為微服務的網關。

二、Gateway的使用
Gateway服務的搭建

1.在微服務中使用Gateway網關,首先我們得在微服務項目中創建一個新的模塊。

2.然后我們需要引入依賴,具體如下:

 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>

3.然后我們需要創建一個啟動類

此時,一個網關模塊就創建好了,但當前網關還沒有設置任何處理請求的功能,下面我們來看一下如何設置網關的功能。

Route Predicate Factories

在Java8中提供了一個函數式接口Predicate,這個接口能夠校驗請求中的參數,具體為通過接受一個字符串,根據字符串的特點返回一個布爾值,用來進行條件過濾。下面我們來具體使用一下這個接口。

1.首先我們來創建一個該接口的實現類

2.然后重寫其中的test方法

在test中我們可以定義一些邏輯來進行條件判斷,例如我們這里定義成字符串為空返回false,不為空返回true。

然后我們就可以使用這個類來進行一些參數判斷了

在Predicate中還包含了許多其它方法,例如and方法,它的參數為Predicate類型 ,返回值為一個新的Predicate,這個新的Predicate的test方法返回的則是前兩個Predicate的test返回值取”&&“的結果。其它方法可以參考下面的內容:

  • isEqual(Object targetRef):?較兩個對象是否相等,參數可以為Null
  • and(Predicate other):短路與操作,返回?個組成Predicate
  • or(Predicate other):短路或操作,返回?個組成Predicate
  • test(T t):傳??個Predicate參數,?來做判斷?
  • negate():返回表?此Predicate邏輯否定的Predicate

Gateway給我們提供了一個 Route Predicate Factories(路由斷言工廠),里面包含了很多的Predicate來對路由進行一些規則匹配,例如Path,它能匹配指定規則的路徑,Methond能夠匹配指定的請求方法,還有其它的一些Predicate,大家可以去下面這個鏈接進行查詢:

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloudgateway/request-predicates-factories.html

我們可以在我們創建的Gateway模塊的配置文件中來使用這些Predicate,具體使用的配置如下:

gateway:routes: # ?關路由配置- id: product-service #路由ID, ?定義, 唯?即可uri: lb://product-service #?標服務地址predicates: #路由條件- Path=/product/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**

配置好之后,當請求的url與predicates中對于的路由規則path匹配時,就會依據id中的服務名稱,去注冊中心獲取對應的服務地址,然后負載均衡出一個地址并構建對應的請求去訪問目標服務。

例如我們去訪問下面這個地址:

http://127.0.0.1:8080/order/1

此時請求就會來到網關,在網關中進行predicate的條件判斷,判斷通過后去Nacos獲取服務信息并負載均衡嗎,然后去訪問目標服務。上面地址的訪問結果如下:

可以發現成功返回了數據,由此可以推斷,請求成功通過網關訪問到了目標服務。

如果我們的請求不符合定義的匹配規則,則不會訪問到目標服務,例如我們訪問下面這個?路徑http://127.0.0.1:8080/feign/1(也是order-service里面的)

我們也可以配置多個predicate,例如我們再配置 一個Method,用來匹配請求的方法

此時只要請求同時匹配這兩個規則才能夠去訪問對應的服務。?

Gateway Filter Factories?
Filter

Predicate能夠設置一些請求的匹配規則,而Filter則能在請求被目標服務處理前后,添加一些邏輯。例如,我們可以在請求發送到目標服務之前,讓請求新增一個參數。Filter在生效時機上可以分為Post類型和Pre類型,

Pre類型的Filter中定義的邏輯在請求處理前執行,而Post類型的則是在請求處理完成之后,數據返回給用戶之前執行。在生效范圍上,又可以把Filter分為GatewayFilter(作用于單個路由或者同一個分組的路由上,也就是匹配到的id是一樣的)、GlobalFilter(對于每一個路由都生效,也就是每一個請求都生效)。

Gateway Filter Factories(路由過濾工廠)中為我們提供了很多的Filter,例如AddRequestParameter,它能在請求被處理之前在請求中添加一個參數,下面我們來具體使用以下。

Filter和Predicate一樣,也是需要在配置文件中進行配置,具體如下:

server:port: 10030
gateway:routes: # ?關路由配置- id: product-service #路由ID, ?定義, 唯?即可uri: lb://product-service #?標服務地址predicates: #路由條件- Path=/product/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**filters:- AddRequestParameter=userName, bite

這里我們配置了AddRequestParameter,他在請求中添加了一個username字段,值為bite。

下面我們通過一個接口來測試一下是否真的添加了該參數

我們啟動對應的服務來訪問一下這個接口,打印的日志如下:

可以發現成功獲取到Filter添加的參數了。在路由過濾工廠中還有許多其他的Filter,如果大家想了解更多,可以訪問如下地址:

GatewayFilter Factories :: Spring Cloud Gateway

前面我們配置的Filter只能對當前的單一路由生效,如果我們想對所有路由都生效,就需要配置default-Filter,具體配置項如下:

server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 182.92.242.181:8848gateway:metrics:enabled: trueroutes:- id: order-service   #路由規則id, 隨便起, 不重復即可uri: lb://order-service/ #目標服務地址predicates:   #路由條件- Path=/order/**- After=2024-03-20T00:00:22.370856700+08:00[Asia/Shanghai]filters:- AddRequestParameter=userName, bite- name: Custom    #過濾器名稱args:name: test_custom- id: product-serviceuri: lb://product-service/predicates:- Path=/product/**default-filters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY

?此時配置的Filter就對對所有路徑都生效了。

GlobalFilter

在Gateway中提供了很多全局過濾器(GlobalFilter),用來實現安全監控,日志記錄等功能。常見的有

?? Gateway Metrics Filter: ?關指標,提供監控指標

?? Forward Routing Filter:?于本地forword,請求不轉發到下游服務器

?? LoadBalancer Client Filter: 針對下游服務, 實現負載均衡.

使用GlobalFilter?進行監控等功能需要引入下面這個依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后在配置文件中進行配置,具體配置項如下:

spring:cloud:gateway:metrics:enabled: true #開啟監控相關的全局過濾器
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true

此時我們訪問下面這個鏈接就能得到請求的監控信息:

網關地址/actuator

Filter的執行順序

在一個路由下,可能會有多個Filter,他們的執行順序如何呢?我們來看一下。

在請求發送到對應的服務之前,網關會去獲取當前請求需要使用到的所有Filter,并將其按照Order值排序(每個Filter都必須指定一個Order值,Order值越大,執行的順序則越靠前,反之則越靠后,路由過濾工廠給我們提供的Filter都是已經設置好Order值了),根據順序執行Filter。如果Order值一樣,則按照,defaultFilter>GatewayFilter>GlobalFilter的順序執行。

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

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

相關文章

Go初級之九:Select 與并發控制

在Go語言中&#xff0c;select語句是處理并發編程的核心工具之一。它讓我們能夠優雅地管理多個通道操作&#xff0c;實現高效的并發控制。 1. Select 語句基礎 1.1 Select 的基本語法 package mainimport ("fmt""time" )func main() {ch1 : make(chan stri…

使用 Acme.sh 獲取和管理免費 SSL 證書

Acme.sh 是一個開源的 Shell 腳本工具&#xff0c;支持從 Let’s Encrypt 等證書頒發機構獲取免費的 SSL/TLS 證書。它支持多種驗證方式&#xff0c;并能自動續期證書&#xff0c;適合個人網站或企業使用。 目標 同時支持&#xff0c;主域名和泛域名 安裝 Acme.sh獲取源碼 git …

docker-compose跨節點部署Elasticsearch 9.X集群

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 例如:第一章 Python 機器學習入門之pandas的使用 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 系列文章目錄 前言 一、環境準備 二、遇到的問題與分析 三、配…

【面試場景題】spring應用啟動時出現內存溢出怎么排查

文章目錄一、定位 OOM 類型二、基礎排查&#xff1a;調整 JVM 參數與日志三、堆內存溢出&#xff08;Heap Space&#xff09;排查1. 分析堆轉儲文件2. 典型場景與解決四、元空間溢出&#xff08;Metaspace&#xff09;排查1. 分析類加載情況2. 典型場景與解決五、直接內存溢出&…

2025年經濟學專業女生必考證書指南:打造差異化競爭力

在數字經濟快速發展的2025年&#xff0c;經濟學專業女生面臨著諸多機遇與挑戰。單純的理論知識已經難以滿足職場需求&#xff0c;企業更看重解決實際問題的能力&#xff0c;特別是將數據轉化為商業洞察的專業技能。各類專業資質認證可以成為系統提升能力的途徑之一&#xff0c;…

【CAN通信】AUTOSAR架構下TC3xx芯片是如何將一幀CAN報文接收上來的

目錄 前言 正文 1.背景介紹 2.CAN報文硬件原理 3.CAN接收軟件實現 3.1. vCan_30_Mcan_Interrupt 3.2. vCan_30_Mcan_RxInterrupt 3.3. vCan_30_Mcan_RxBasicCanHandling 4.總結 前言 在《【CAN通信】AUTOSAR架構下TC3xx芯片是如何將一幀CAN報文發送出去的》一文中我們…

STM32H750 RTC介紹及應用

第十一章 RTC介紹及應用 1. RTC 簡介 RTC&#xff08;Real-Time Clock&#xff0c;實時時鐘&#xff09;是 STM32H750VBT6 中用于提供日歷和時鐘功能的低功耗外設&#xff0c;即使主電源關閉&#xff0c;只要 VBAT&#xff08;備份電源&#xff09;供電&#xff0c;RTC 仍能持續…

飛網自適應通信:IPv4 與 IPv6 環境下的高效互聯

一、網絡連接的難題與飛網的解決方案 在日常生活中&#xff0c;我們常常會碰到這樣的場景&#xff1a;在家用手機訪問公司電腦里的重要文件&#xff0c;或者遠程連接家里的NAS設備查看照片和視頻。這些操作都需要設備之間建立起安全又穩定的連接。然而&#xff0c;現實中的網絡…

拉格朗日多項式

最近打的幾個比賽沒意思&#xff0c;不是不會就是不會。不過比賽完后看到別人的WP&#xff0c;感覺受益匪淺。先看一個多項式&#xff1a;當輸入Xi時會得到一個Si,要求輸入一定數量的xi 來求[c] 當可以輸入的x個數與c的個數相同時&#xff0c;可以用矩陣直接求解。&#xff08;…

Vue3 + TypeScript 實現文件拖拽上傳

應用效果&#xff1a;實例代碼&#xff1a;CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 選擇文件列表 const selectedFiles ref<FileList | null>(null); // 通過 FormData 對象實現文件…

2025全國大學生數學建模C題保姆級思路模型(持續更新):NIPT 的時點選擇與胎兒的異常判定

2025全國大學生數學建模C題保姆級思路模型&#xff08;持續更新&#xff09;&#xff1a;NIPT 的時點選擇與胎兒的異常判定&#xff0c;完整持續更新內容見文末名片 胎兒遺傳信息檢測與臨床決策數學建模分析講義 問題一&#xff1a;Y染色體濃度的影響因素探索——線性回歸的“偵…

【筆記】Software Engineering at Google

聚焦核心原則&#xff0c;挑取最讓我眼前一亮的實踐點&#xff0c;特別是那些能直接啟發或解決我當前工作中痛點的部分。0. 序言 最近集中精力速讀了關于 ?Google 軟件工程實踐? 的諸多資料&#xff08;包括官方出版物、工程博客、技術演講以及社區討論&#xff09;。面對 G…

無人機防風技術難點解析

防風防御模塊的技術難點主要體現在以下幾個方面風場感知與精準建模1.復雜風場的實時感知&#xff1a;風&#xff0c;尤其是近地面的風&#xff0c;常常是無規則、瞬息萬變的陣風、湍流或風切變。無人機需要通過各種傳感器&#xff08;如空速計、慣性測量單元&#xff08;IMU&am…

HarmonyOS 應用開發深度解析:ArkTS 聲明式 UI 與精細化狀態管理

好的&#xff0c;請看這篇關于 HarmonyOS 應用開發中聲明式 UI 狀態管理的技術文章。 HarmonyOS 應用開發深度解析&#xff1a;ArkTS 聲明式 UI 與精細化狀態管理 引言 隨著 HarmonyOS 4、5 的廣泛應用和 HarmonyOS NEXT 的發布&#xff0c;基于 API 12 及以上的應用開發已成為…

機器學習入門,第一個MCP示例

前面我們已經搭建了屬于自己的AI大模型&#xff1a;詳情見 https://blog.csdn.net/hl_java/article/details/150591424?spm1001.2014.3001.5501 近期MCP概念這么火&#xff0c;那么它到底是什么呢&#xff0c;借一個例子為你講解 第一步&#xff1a;理解MCP的核心價值 MCP (Mo…

flutter 中間組件自適應寬度

使用Flexible IntrinsicWidth Row(children: [Text(第一個text),IntrinsicWidth(child: ConstrainedBox(constraints: BoxConstraints(maxWidth: 200), // 最大寬度限制child: Text(中間的text可能很長也可能很短,overflow: TextOverflow.ellipsis,maxLines: 1,),),),Text(第三…

TDengine 時間函數 DAYOFWEEK 用戶手冊

DAYOFWEEK 函數使用手冊 函數描述 DAYOFWEEK 函數用于返回指定日期是一周中的第幾天。該函數遵循標準的星期編號約定&#xff0c;返回值范圍為 1-7&#xff0c;其中&#xff1a; 1 星期日 (Sunday)2 星期一 (Monday)3 星期二 (Tuesday)4 星期三 (Wednesday)5 星期四 (T…

【STM32】貪吃蛇 [階段 3] 增強模塊結構(架構優化)

這篇博客是 承接&#xff1a;【項目思維】貪吃蛇&#xff08;嵌入式進階方向&#xff09;中 聚焦于 &#x1f9f1; 階段 3&#xff1a;增強模塊結構&#xff08;架構優化&#xff09; 中的 菜單系統&#xff08;Menu System&#xff09;&#xff0c;這部分的結構優化可以學到的…

江協科技STM32學習筆記補充之004

STM32 ISP 一鍵下載電路&#xff08;按功能、邏輯與時序拆解&#xff09;

數據庫小冊(1)

1. 關系型數據庫主要考點關系型數據庫&#xff1a;架構索引鎖語法理論規范2. 如何設計一個關系型數據庫設計即模塊劃分。數據庫最主要的功能是存儲我們的數據&#xff0c;所以需要一個存儲的文件系統。我們要把涉及到的物流數據提供邏輯的形式給組織和表示出來&#xff0c;這是…