Spring Cloud Gateway 網關的基礎使用

1. 什么是網關?網關有什么用?

????????在微服務架構中,網關就是一個提供統一訪問地址的組件,它解決了內部微服務與外部的交互問題。網關主要負責流量的路由和轉發,將外部請求引到對應的微服務實例上。同時提供身份認證、授權、限流、監控以及日志記錄等功能。

????????從上圖就能看出網關的作用了,它就是充當客戶端與內部微服務之間的橋梁的。前端雖然可以發送ajax,但是它沒有健康檢測、沒有負載均衡,所以需要使用網關來充當一個統一的入口。當前端的請求來到了網關,網關再去分發,因為網關是用 Java 代碼來寫的,所以可以在網關這里引入Nacos進行健康檢測,引入LoadBalancer進行負載均衡。而且它還有超時重試等高級功能。

🍁網關的主要作用

  1. 提供統一的訪問入口點:網關作為唯一的網絡流量入口和出口,簡化了客戶端的訪問。
  2. 安全控制:網關能夠提供安全檢查,例如統一登錄和授權。
  3. 協議轉換:網關可以在不同網絡協議之間轉換數據,例如處理HTTPS和HTTP之間的轉換。
  4. 網絡地址的轉換:它允許局域網內的多個設備共享一個公共IP地址與外部網絡通信,這樣做可以提高安全性,節省IP地址,并使內部網絡結構對外部不可見。
  5. 數據的過濾和處理:網關可以對流經的數據進行過濾和必要的處理。

2. Spring Cloud Gateway 的基礎使用

2.1 Spring Cloud Gateway 的組成

  1. 路由定義訪問的目標地址。
  2. 斷言:定義一組規則,讓匹配到當前路由的請求去調用某個目標。
  3. 過濾器:對請求進行特殊處理。

2.2 Spring Cloud Gateway 最基礎的使用

準備工作:

  1. 創建SpringBoot多模塊項目
  2. 創建三個模塊:網關、訂單、用戶

假設訂單、用戶模塊在內網中,不能直接訪問,需要通過網關路由到對應的服務上面。

準備相關模塊中的 controller:

@RestController
@RequestMapping("/order")
public class OrderController {@RequestMapping("/getcount")public int getCount() {return new Random().nextInt(1000);}
}
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext context; // 獲取動態端口@RequestMapping("/getname")public String getName() {return context.getWebServer().getPort() +"--UserService:name=java-"+new Random().nextInt(100);}
}

以上兩個某塊只需要添加 Spring Web 依賴即可。

使用網關又分為兩步:

  1. 添加依賴
  2. 配置規則

1. 添加依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

將其添加到網關模塊中,不能添加到父模塊中,因為 Spring Cloud Gateway 底層是響應式的 Reactor Web。(會沖突)

2. 配置路由規則

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 斷言- Path=/user/**     // 滿足斷言,就會去走對應的路由- id: orderserviceuri: http://localhost:9091predicates:- Path=/order/**server:port: 10086

在實際業務中,路由 uri 這里肯定不能直接寫死,但是此處主要演示最基礎的使用。

????????完成以上兩步之后,運行訂單服務、用戶服務,網關,使用10086端口去訪問兩個內網中的服務,都能訪問的到,這樣就實現了統一入口!

2.3 單服務中的多路徑配置

????????在上述示例中,每個服務只有一個controller,所以在配置網關路由規則的時候,直接寫就行了,假如說,單個服務中有多個controller呢?路由規則該如何去寫?

在user-service模塊中創建日志controller:

@RestController
@RequestMapping("/userlog")
public class UserLogController {@RequestMapping("/getlog")public String getLog() {return "UserLogService:log=java-"+new Random().nextInt(1000);}
}

多路徑配置:

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 斷言- Path=/user/**,/userlog/getlog  # 單服務多路徑配置- id: orderserviceuri: http://localhost:9091predicates:- Path=/order/**server:port: 10086

????????如果需要在單服務中完成多路徑配置,那么這個時候只需要在Path后面寫多個匹配規則,用英文的逗號隔開即可。不能在predicates下面在搞一個Path,因為同一個predicates下面不能出現相同類型的斷言。

2.4 更多的斷言類型

1.根據時間匹配 (3種類型)

  • After:請求在指定時間之后才匹配。
  • Before:請求在指定時間之前才匹配。
  • Between:請求在指定時間中間才匹配。

2. Cookie:配置請求中的 Cookie 值。

3. Header:配置請求中的 Header?值。

4. Host:配置請求頭中的 Host 值。

5. Method:匹配請求頭中?Method 的值。

6. Path:匹配請求路徑。

7. Query:匹配請求參數。

8. RemoteAddr:匹配請求的?IP 地址,支持 IPV4 和 IPV6.

9. Weight:根據權重來分發請求,權重根據 group 來計算。

10. XForwardedRemoteAddr:根據 X-Forwarded-For 匹配。

參考官方文檔:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

【示例】演示 Header

spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:9090  # 路由predicates:  # 斷言- Path=/user/**,/userlog/getlog  # 單服務多路徑配置- Header=X-Header-Flag, \d+  server:port: 10086

使用 postman 構造 header:

① 正常訪問

② 異常訪問

?

???????上述例子中,”X-Header-Flag“ 表示 Header 中的 key,”\d+“ 是一個正則表達式,表示 key 的值,此處表示匹配 1 個或多個數字,才能訪問的到。

其他正則表達式:

  1. \w+:匹配一個或多個字母、數字、下劃線字符。
  2. \s+:匹配一個或多個空白字符(空格、制表符、換行符)。
  3. .*:匹配任意字符0次或多次。
  4. .+:匹配除了換行符之外的任意字符一次或多次。
  5. [abc]:匹配字符集中的任意一個字符,例如 [abc] 可以匹配 a、b、或 c。
  6. [^abc]:匹配除了字符集中的任意字符之外的任意字符。
  7. ^:匹配字符串的開始位置。
  8. &:匹配字符串的結束位置。
  9. |:用于匹配多個模式中的任意一個。
  10. ():用于分組,,可以將一組字符作為一個整體進行匹配。

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

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

相關文章

Spring-Boot---配置文件

文章目錄 配置文件的作用配置文件的格式PropertiesProperties基本語法讀取Properties配置文件 ymlyml基本語法讀取yml配置文件 Properties VS Yml 配置文件的作用 整個項目中所有重要的數據都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 數據庫的…

230. 二叉搜索樹中第K小的元素 --力扣 --JAVA

題目 給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 個最小元素&#xff08;從 1 開始計數&#xff09;。 解題思路 利用List存儲數據&#xff1b;遍歷整個樹&#xff0c;讀取數各個節點的value&#xff1b;對value進行…

Python繪制多分類ROC曲線

目錄 1 數據集介紹 1.1 數據集簡介 1.2 數據預處理 2隨機森林分類 2.1 數據加載 2.2 參數尋優 2.3 模型訓練與評估 3 繪制十分類ROC曲線 第一步&#xff0c;計算每個分類的預測結果概率 第二步&#xff0c;畫圖數據準備 第三步&#xff0c;繪制十分類ROC曲線 1 數據集…

【數據結構】——排序篇(上)

前言&#xff1a;前面我們已經學過了許許多多的排序方法&#xff0c;如冒泡排序&#xff0c;選擇排序&#xff0c;堆排序等等&#xff0c;那么我們就來將排序的方法總結一下。 我們的排序方法包括以下幾種&#xff0c;而快速排序和歸并排序我們后面進行詳細的講解。 直接插入…

Qt實現二維碼生成和識別

一、簡介 QZxing開源庫: 生成和識別條碼和二維碼 下載地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、編譯與使用 1.下載并解壓&#xff0c;解壓之后如圖所示 2.編譯 打開src目錄下的QZXing.pro&#xff0c;選擇合適的編譯器進行編譯 最后生…

util.js

一、util.js是什么&#xff1f; 1、util.js是Node.js提供的一個工具庫&#xff0c;主要用于輔助實現JavaScript代碼的通用功能。 2、除了Node.js中內置的模塊外&#xff0c;util.js是Node.js中最核心的模塊之一。 3、通過util.js&#xff0c;開發者可以輕松實現JavaScript常…

Unity 資源管理之StreamingAssets

StreamingAssets也是Unity中特殊的文件夾&#xff0c;用于存放運行時可以直接訪問的資源。StreamingAssets一般存放數據或配置文件、圖片、視頻資源等。 StreamingAssets的文件路徑可以通過Application.streamingAssetsPath來獲取。 加載或訪問使用WWW類或UnityWebRequest類。…

MIT6S081-Lab2總結

大家好&#xff0c;我叫徐錦桐&#xff0c;個人博客地址為www.xujintong.com&#xff0c;github地址為https://github.com/xjintong。平時記錄一下學習計算機過程中獲取的知識&#xff0c;還有日常折騰的經驗&#xff0c;歡迎大家訪問。 Lab2就是了解一下xv6的系統調用流程&…

Java - Synchronized的鎖升級之路

Synchronized鎖 Synchronized在Java JVM里的實現是基于進入和退出Monitor對象來實現方法同步和代碼塊同步的 monitor enter指令是在編譯后插入到同步代碼塊的開始位置 而monitor exit是插入到方法結束處和異常處 JVM要保證每個monitor enter必須有對應的monitor exit與之配對。…

解決服務端渲染程序SSR運行時報錯: ReferenceError: document is not defined

現象&#xff1a; 原因&#xff1a; 該錯誤表明在服務端渲染 (SSR) 過程中&#xff0c;有一些代碼嘗試在沒有瀏覽器環境的情況下執行與瀏覽器相關的操作。這在服務端渲染期間是一個常見的問題&#xff0c;因為在服務端渲染期間是沒有瀏覽器 API。 解決辦法&#xff1a; 1. 修…

bat腳本之while

在批處理&#xff08;BAT&#xff09;腳本中&#xff0c;while循環是一種常用的控制流結構&#xff0c;用于在滿足特定條件的情況下重復執行一段代碼。 while循環的基本語法如下&#xff1a; while [ condition ] do command1 command2 ... commandN done這里的 cond…

【2023傳智杯-新增場次】第六屆傳智杯程序設計挑戰賽AB組-DEF題復盤解題分析詳解【JavaPythonC++解題筆記】

本文僅為【2023傳智杯-第二場】第六屆傳智杯程序設計挑戰賽-題目解題分析詳解的解題個人筆記,個人解題分析記錄。 本文包含:第六屆傳智杯程序設計挑戰賽題目、解題思路分析、解題代碼、解題代碼詳解 文章目錄 一.前言二.賽題題目D題題目-E題題目-F題題目-二.賽題題解D題題解-…

深入理解Sentinel系列-1.初識Sentinel

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛吃芝士的土豆倪&#xff0c;24屆校招生Java選手&#xff0c;很高興認識大家&#x1f4d5;系列專欄&#xff1a;Spring源碼、JUC源碼、Kafka原理、分布式技術原理&#x1f525;如果感覺博主的文章還不錯的話&#xff…

待做-待補充-每個節點做事,時間,以及與角度的關系

文章目錄 待定內容紅黑樹應用場景限制什么是二叉樹遍歷遞歸遍歷1.前序遍歷 進入節點時2.中序遍歷 遍歷完左子樹回到節點。此操作需要等到所有左樹節點做完后才會做3.后序遍歷 遍歷完左右子樹回到節點。左右子樹的所有節點都做完操作后&#xff0c;回到當前節點才會做此操作 …

如何搭建自己的直播電商系統?

當下&#xff0c;傳統的圖文電商模式已經走向沒落&#xff0c;視頻電商備受追捧。抖音、快手、小紅書、京東、淘寶、拼多多都在發力直播電商業務&#xff0c;尤其是以抖音為首的直播電商備受用戶歡迎&#xff0c;它具有實時直播和強互動的特點&#xff0c;是傳統電商所不具備的…

<HarmonyOS第一課>保存應用數據【課后考核】

【習題】保存應用數據 判斷題 首選項是關系型數據庫。 錯誤(False) 應用中涉及到Student信息&#xff0c;如包含姓名&#xff0c;性別&#xff0c;年齡&#xff0c;身高等信息可以用首選項來存儲。 錯誤(False) 同一應用或進程中每個文件僅存在一個Preferences實例。 正確(T…

最長子串問題(LCS)--動態規劃解法

題目描述&#xff1a; 如果Z既是X的子串&#xff0c;又是Y的子串&#xff0c;則稱Z為X和Y的公共子串。 如果給定X、Y&#xff0c;求出最長Z及其長度。 注意&#xff1a;這里求的不是子序列&#xff0c;兩者的意思并不相同。子串要求連續&#xff0c;子序列并不需要。 如果想…

simulinkveristandlabview聯合仿真環境搭建

目錄 開篇廢話 軟件版本 明確需求 軟件安裝 matlab2020a veristand2020 R4 VS2017 VS2010 軟件安裝驗證 軟件資源分享 開篇廢話 推免之后接到的第一個讓人難繃的活&#xff0c;網上開源的軟件資料和成功的案例很少&#xff0c;查來查去就那么幾篇&#xff0c;而且版本…

SpringData

1.為什么要學習SpringData&#xff1f; 是因為對數據存儲的框架太多了&#xff0c;全部都要學習成本比較高&#xff0c;SpringData對這些數據存儲層做了一個統一&#xff0c;學習成本大大降低。

SQL命令---修改字段的數據類型

介紹 使用sql語句修改字段的數據類型。 命令 alter table 表明 modify 字段名 數據類型;例子 有一張a表&#xff0c;表里有一個id字段&#xff0c;長度為11。使用命令將長度修改為12 下面使用命令進行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…