微服務的網關配置

微服務的網關配置

1. 網關路由

1.1 網關

1.1.1 存在問題

單體架構時我們只需要完成一次用戶登錄、身份校驗,就可以在所有業務中獲取到用戶信息。而微服務拆分后,每個微服務都獨立部署,這就存在一些問題:每個微服務都需要編寫身份校驗、用戶信息獲取的接口,非常麻煩

用戶身份校驗最好放在一個統一的地方,例如:網關。

1.1.2 認識網關

顧明思議,網關就是絡的口。數據在網絡間傳輸,從一個網絡傳輸到另一網絡時就需要經過網關來做數據的路由和轉發以及數據安全的校驗

實現 java 微服務網關的技術:

  • Netflix Zuul:早期實現,目前已經淘汰
  • Spring Cloud Gateway:基于 Spring 的 WebFlux 技術,完全支持響應式編程,吞吐能力更強

Spring Cloud Gateway 使用參考官網

使用 Spring Cloud Gateway 實現網關,如下圖:

前端請求網關根據請求路徑路由到微服務,網關從 nacos 獲取微服務實例地址將請求轉發到具體的微服務實例上。

生產環境中網關也是集群部署,在網關前邊通過 nginx 進行負載均衡,如下圖:

1.2 實現網關路由

1.2.1 配置

創建網關工程;

引入依賴

<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies><!-- common:通用工具服務,有則添加 --><dependency><groupId>com.hmall</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!-- 網關 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- nacos discovery --><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>

創建啟動類

package com.hmall.gateway;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

修改配置文件

server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.101.68:8848gateway:routes:- id: item # 以 item-service 舉例,根據實際修改uri: lb://item-servicepredicates:- Path=/items/**

路由規則 routes 包括四個屬性,定義語法如下:

  • id:路由的唯一標示
  • predicates:路由斷言,Predicates 是用于判斷請求是否滿足特定條件的組件。
  • filters:路由過濾條件,稍后講解。
  • uri:路由目標地址,lb://代表負載均衡,從注冊中心獲取目標微服務的實例列表,并且負載均衡選擇一個訪問。
  • -:用于表示數組
1.2.2 配置項

predicates 屬性,也就是路由斷言。Spring Cloud Gateway 中支持的斷言類型有很多:

名稱說明
Cookie請求必須包含某些 cookie
Header請求必須包含某些 header
Host請求必須是訪問某個host(域名)
Method請求方式必須是指定方式
Path請求路徑必須符合指定規則
weight權重處理

常用的類型就是 Header、Path,Header 的使用如 - Header=X-Request-Id, \d+,說明請求頭中包含屬性 X-Request-Id,且對應的值為數字。

2. 網關鑒權

2.1 認識網關鑒權

單體架構時我們只需要完成一次用戶登錄、身份校驗,就可以在所有業務中獲取到用戶信息。而微服務拆分后,每個微服務都獨立部署,不再共享數據。也就意味著每個微服務都需要做身份校驗,這顯然不可取。

我們的登錄是基于 JWT 來實現的,校驗 JWT 的算法復雜,而且需要用到密鑰。如果每個微服務都去做身份校驗,這就存在著兩大問題:

  1. 每個微服務都需要知道 JWT 的密鑰,不安全。
  2. 每個微服務重復編寫身份校驗代碼、權限校驗代碼,代碼重復不易維護。

網關鑒權是指在網關對請求進行身份驗證的過程。這個過程確保只有經過授權的用戶或設備才能訪問特定的服務或資源。

流程如下:

  1. 用戶登錄成功生成 token 并存儲在前端
  2. 前端攜帶 token 訪問網關
  3. 網關解析 token 中的用戶信息,網關將請求轉發到微服務,轉發時攜帶用戶信息
  4. 微服務從 http 頭信息獲取用戶信息
  5. 微服務之間遠程調用使用內部接口(無狀態接口

2.2 網關內置過濾器

網關過濾器鏈中的過濾器有兩種:

  1. GatewayFilter:路由過濾器,作用范圍比較靈活,可以是任意指定的路由 Route
  2. GlobalFilter:全局過濾器,作用范圍是所有路由,不可配置。

FilteringWebHandler 在處理請求時,會將 GlobalFilter 裝飾為 GatewayFilter,然后放到過濾器鏈中,排序以后依次執行。

Gateway 中內置了很多的 GatewayFilter,詳情可以參考官方文檔:

常用的過濾器:StripPrefix

router- id: producturi: lb://item-servicepredicates:- Path=/product/**filters:- StripPrefix=1

StripPrefix=1 表示去除一級路徑前綴,使用 StripPrefix=1

請求:http://localhost:8080/product/items

經過網關轉換后,實際請求路徑:http://localhost:8081/items

2.3 自定義過濾器

2.3.1 GlobalFilter 過濾器
package com.hmall.gateway.filter;@Component
@Slf4j
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 編寫過濾器邏輯log.info("打印全局過濾器");// 放行return chain.filter(exchange);// 攔截// ServerHttpResponse response = exchange.getResponse();// 修改狀態碼// response.setRawStatusCode(401);// return response.setComplete();}@Overridepublic int getOrder() {// 過濾器執行順序,值越小,優先級越高return 0;}
}

全局過濾器不用在路由中配置。

package com.hmall.gateway.config;// 配置攔截路徑
@Data
@ConfigurationProperties(prefix = "hm.auth")
public class AuthProperties {private List<String> includePaths;private List<String> excludePaths;
}
2.3.2 GatewayFilter 過濾器

自定義 GatewayFilter 不是直接實現 GatewayFilter,而是繼承 AbstractGatewayFilterFactory

注意:該類的名稱一定要以 GatewayFilterFactory 為后綴!

package com.hmall.gateway.filter;@Component
@Slf4j
public class FirstFilterGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();log.info("請求路徑:{}",request.getPath());log.info("網關過濾器FirstFilterGatewayFilterFactory執行啦...");// 放行return chain.filter(exchange);// 攔截 返回401狀態碼// exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// return exchange.getResponse().setComplete();}};}
}

路由過濾器需要在配置中配置過濾器:

- id: producturi: lb://item-servicepredicates:- Path=/product/**filters:- StripPrefix=1- FirstFilter # 此處直接以自定義的 GatewayFilterFactory 類名稱前綴類聲明過濾器
2.3.3 總結

兩種自定義過濾器的方式:

  1. GatewayFilter:路由過濾器

    作用范圍比較靈活,可以是任意指定的路由 Route.

    繼承 AbstractGatewayFilterFactory ,并在路由配置中指定過濾器。

    過濾器的名稱規則:以 GatewayFilterFactory 作為后綴。

  2. GlobalFilter:全局過濾器

    作用范圍是所有路由,不可配置。

    實現 GlobalFilter 接口。

    實現 Ordered 接口可以指定過濾器順序,實現 getOrder() 方法,返回值越小優先級越好。

2.4 身份校驗過濾器

2.4.1 引入 JWT 工具類

參考資料

./
│
├── com.*.gateway/
│    │
│    ├── config/
│    │    ├── AuthProperties.java   # 配置身份校驗需要攔截的路徑
│    │    ├── JwtProperties.java   # 定義與JWT工具有關的屬性,比如秘鑰文件位置
│    │    └── SecurityConfig.java   # 工具的自動裝配
│    │
│    └── util/
│         └── JwtTool.java   # JWT工具,其中包含了校驗和解析 token 的功能
│
└── resources/│└── hmall.jks   # 秘鑰文件
2.4.2 配置白名單

其中 AuthPropertiesJwtProperties 所需的屬性要在 application.yaml 中配置

hm:jwt:location: classpath:hmall.jks # 秘鑰地址alias: hmall # 秘鑰別名password: hmall123 # 秘鑰文件密碼tokenTTL: 30m # 登錄有效期auth:excludePaths: # 無需身份校驗的路徑- /search/**- /users/login- /items/**

excludePaths 配置白名單地址,即無需身份校驗的路徑。

2.4.3 身份校驗過濾器
./
│
└── com.*.gateway/└── filter/└── AuthGlobalFilter.java

2.5 總結

網關身份校驗過濾器怎么實現?

我們項目中網關身份校驗過濾器使用 Spring cloud Gateway 的 GlobalFilter 實現,GlobalFilter 是一種全局過濾器。實現過程如下:

  1. 配置密鑰、白名單 等相關信息。
  2. 編寫身份校驗過濾器,實現 GlobalFilter 接口。
  3. 首先判斷請求地址是否是白名單地址,如果是則放行
  4. 取出 http 頭中的 token,然后校驗 token 的合法性
  5. 如果 token 合法則將 token 中的用戶信息向下傳給微服務
  6. 如果 token 不合法則拒絕訪問。

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

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

相關文章

【硬核實戰】ETCD+AI智能調度深度整合!從架構設計到調優避坑,手把手教你打造高可用調度系統!

一、核心架構設計&#xff1a;ETCD如何賦能AI調度&#xff1f; &#x1f525; 架構圖&#xff1a; [AI調度引擎] ← 實時數據 → [ETCD集群] ↓ 決策指令 [執行層&#xff08;車輛/物流/交通設備&#xff09;] 核心角色&#xff1a; ETCD&#xff1a;存儲調度策略、節點狀…

區間震蕩指標

區間震蕩指標的邏輯如下&#xff1a; 一、函數注解 1. Summation函數 功能&#xff1a; 計算給定價格序列Price的前Length個數據點的和&#xff0c;或在數據點數量超過Length時&#xff0c;計算滾動窗口內的價格和。 參數&#xff1a; Price(1)&#xff1a;價格序列&#…

C語言-數組指針和指針數組

指針 數組指針與指針數組 數組指針 定義 概念&#xff1a;數組指針是指向數組的指針&#xff0c;本質上還是指針 特點&#xff1a; ①先有數組&#xff0c;后有指針 ②它指向的是一個完整的數組 一維數組指針 語法&#xff1a; 數據類型 (*指針變量名)[容量]; 案例&a…

31天Python入門——第5天:循環那些事兒

你好&#xff0c;我是安然無虞。 文章目錄 1. while循環1.1 while循環的嵌套1.2 補充學習:print函數 2. for循環2.1 range函數2.2 for循環2.3 continue和break以及return2.4 for循環的嵌套 3. 補充學習3.1 enumerate函數3.2 zip函數3.3 不要在遍歷列表的過程中刪除元素 循環 是…

T3 出行:網約車全棧分布式數據庫升級實踐

現今&#xff0c;網約車已成為民眾日常出行不可或缺的選擇。伴隨“互聯網出行”模式的快速推進&#xff0c;龐大的出行數據應運而生&#xff0c;如同構建了城市交通系統的數字神經脈絡。與此同時&#xff0c;對高效數據存儲與深入數據分析的需求也在持續攀升。 T3 出行于2019年…

區塊鏈技術在供應鏈管理中的應用與創新

在當今全球化的商業環境中&#xff0c;供應鏈管理的復雜性與日俱增。從原材料采購到最終產品交付&#xff0c;涉及眾多環節和參與者&#xff0c;信息的透明度、準確性和安全性至關重要。區塊鏈技術的出現&#xff0c;為供應鏈管理帶來了全新的解決方案&#xff0c;正在逐步改變…

藍橋每日打卡--打家劫舍4

#藍橋#JAVA#打家劫舍4 題目描述 沿街有一排連續的房屋。每間房屋內都藏有一定的現金。現在有一位小偷計劃從這些房屋中竊取現金。 由于相鄰的房屋裝有相互連通的防盜系統&#xff0c;所以小偷 不會竊取相鄰的房屋 。 小偷的 竊取能力 定義為他在竊取過程中能從單間房屋中竊…

c#難點整理

1.何為托管代碼&#xff0c;何為非托管代碼 托管代碼就是.net框架下的代碼 非托管代碼&#xff0c;就是非.net框架下的代碼 2.委托的關鍵知識點 將方法作為參數進行傳遞 3.多維數組 4.鋸齒數組 5.多播委托的使用 6.is運算符 相當于邏輯運算符是 7.as 起到轉換的作用 8.可…

Nginx代理本機的443到本機的8080端口

1. 準備工作 確認已生成 IP 的 HTTPS 證書 假設你已通過 mkcert 生成證書&#xff08;如 192.168.199.191.pem 和 192.168.199.191-key.pem&#xff09;&#xff0c;并已安裝 CA 證書&#xff08;運行過 mkcert -install&#xff09;。 Nginx 安裝 ? 若未安裝 Nginx&#…

善用批處理的for命令倍增效率(附彩蛋:windows官方bug)

前言 在我們工作中,如果使用Windows系統,善用批處理命令,特別是在批量的文件處理,文本處理時能幫助我們極大地提升工作效率,起到事半功倍的效果! 但很多同學,對批處理的使用更多還停留在可以將多個command命令組合到一起執行,省去重復敲命令和等待的時間。這個其實只…

數據結構之棧的2種實現方式(順序棧+鏈棧,附帶C語言完整實現源碼)

對于邏輯關系為“一對一”的數據&#xff0c;除了用順序表和鏈表存儲外&#xff0c;還可以用棧結構存儲。 棧是一種“特殊”的線性存儲結構&#xff0c;它的特殊之處體現在以下兩個地方&#xff1a; 1、元素進棧和出棧的操作只能從一端完成&#xff0c;另一端是封閉的&#xf…

Camera2 API拍照失敗問題實錄:從錯誤碼到格式轉換的排坑之旅

一、問題背景 在開發基于Camera2 API的相機應用時&#xff0c;我們遇到了一個棘手的問題&#xff1a;預覽功能在所有設備上工作正常&#xff0c;但在某特定安卓設備上點擊拍照按鈕后無任何響應。值得注意的是&#xff0c;使用舊版Camera API時該設備可以正常拍照。本文記錄了完…

Jmeter舊版本如何下載

1.Jmeter最新版本下載位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter舊版本下載位置 https://archive.apache.org/dist/jmeter/binaries穩定版本&#xff1a;5.4.1

css-grid布局

文章目錄 1、布局2、網格軌道3、間距Gap4、網格線5、網格別名 當一個 HTML 元素將 display 屬性設置為 grid 或 inline-grid 后&#xff0c;它就變成了一個網格容器&#xff0c;這個元素的所有直系子元素將成為網格元素。 1、布局 啟用grid布局類似與flex布局&#xff0c;不過g…

SolidWorks使用顯卡教程

操作步驟&#xff1a; 打開注冊表編輯器 按下鍵盤上的 Win R 組合鍵&#xff0c;輸入 regedit 并按回車鍵&#xff0c;打開注冊表編輯器。 導航到顯卡信息路徑 在注冊表中依次展開以下路徑&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

【C++11】左值引用、右值引用、移動語義和完美轉發

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:C ??操作環境:Visual Studio 2022 目錄 &#x1f4cc;左值引用和右值引用 &#x1f38f;左值和左值引用 &#x1f38f;右值和右值引用 &#x1f4cc;左值引用和右值引用比較 &#x1f38f;左值引用 &#x1f38f;右值…

麒麟系列Linux發行版探秘

以下內容摘自《銀河麒麟操作系統進階應用》一書。 銀河麒麟操作系統&#xff08;Kylin&#xff09; 銀河麒麟&#xff08;Kylin&#xff09;操作系統是中國自主研發的一款基于Linux內核的操作系統。它的發展歷程可以追溯到2002年&#xff0c;最初由國防科技大學主導研發&…

【機密計算頂會解讀】11:ACAI——使用 Arm 機密計算架構保護加速器執行

導讀&#xff1a;本文介紹ACAI&#xff0c;其構建一個基于CCA的解決方案&#xff0c;使得機密虛擬機能夠安全地使用加速器&#xff0c;同時保持與現有應用程序的兼容性和安全性&#xff0c;能夠實現對加速器的安全訪問。 原文鏈接&#xff1a;ACAI: Protecting Accelerator Ex…

第一天 UnityShader的結構

Shader初學者的學習筆記 第一天 Unity Shader的結構 文章目錄 Shader初學者的學習筆記前言一、Unity Shader結構二、Unity Shader結構解析① Properties② Tags③ RenderSetup(可選狀態)④ Name⑤ [Tags]⑥ [RenderSetup]⑦ 頂點著色器和片元著色器的代碼 (Unity最聰明的孩子)…

VL開源模型實現文本生成圖片

一、 基礎知識 根據描述生成圖片的視覺-語言模型&#xff08;Vision-Language Models, VL 模型&#xff09;是近年來多模態生成領域的熱點研究方向。這些模型能夠根據自然語言描述生成高質量的圖像&#xff0c;廣泛應用于藝術創作、設計輔助、虛擬場景構建等領域。 1 根據描述…