專門做淘寶特價的網站網站模板免費下載
本文介紹如何再 SpringCloud 項目中引入 Gateway 網關并完成網關服務的調用。Gateway 網關是一個在微服務架構中起到入口和路由控制的關鍵組件。它負責處理客戶端請求,進行路由決策,并將請求轉發(fā)到相應的微服務。Gateway 網關還可以實現(xiàn)負載均衡、安全認證、日志記錄等功能,集中管理服務間的通信,提升整體系統(tǒng)的可維護性和安全性。通過 Gateway 網關,可以實現(xiàn)統(tǒng)一的訪問點,簡化客戶端與后端微服務之間的交互,同時也能夠更靈活地進行流量控制和監(jiān)控。
一、Gateway網關介紹
Gateway 網關是一個基于 Spring Cloud 的 API 網關服務,它提供了路由、過濾、監(jiān)控、日志等功能,用于統(tǒng)一管理和轉發(fā)微服務的請求流量。作為微服務架構中的入口點,Gateway 網關可以實現(xiàn)負載均衡、安全認證、請求轉發(fā)等功能,提高了系統(tǒng)的安全性、可用性和可維護性。
網關的作用:
- 對用戶請求做身份認證、權限校驗
- 將用戶請求路由到微服務,并實現(xiàn)負載均衡
- 對用戶請求做限流
含 Gateway 網關項目結構示意圖:
二、搭建Gateway網關
搭建Gateway網關需要以下步驟:
1、創(chuàng)建Gateway模塊
我們需要的開發(fā)環(huán)境中創(chuàng)建一個新的Spring Boot項目。
不會創(chuàng)建的可以參考我之前的文章:SpringCloud-創(chuàng)建多模塊項目
在SpringCloud項目上我們創(chuàng)建Gateway模塊,我命名為 springcloud-gateway。
2、引入SpringCloud-Gateway依賴
在 springcloud-gateway 項目的 pom.xml 文件中引入 Spring Cloud Gateway 的依賴。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3、配置路由規(guī)則
編輯 applicatin.yml,配置 Gateway 網關的路由規(guī)則,包括定義路由路徑、目標服務等信息。
server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 開啟自動路由routes: # 網關路由配置- id: gateway-service # 路由id,自定義,唯一uri: lb://target # 路由的目標地址,lb表示負載均衡predicates: # 路由斷言,判斷請求是否符合路由規(guī)則- Path=/gateway/** # 要求請求路徑以/user/開頭,否則404filters:- StripPrefix=1 # 轉發(fā)請求時uri過濾掉/gateway
我們添加了動態(tài)路由,這里的動態(tài)路由屬性可以自動讓網關的轉發(fā)請求負載均衡。
這里我們用到了一個 Path 斷言,要求請求路徑以 /user/ 開頭,否則請求會返回404 (未找到服務) 。這里我們還用到了一個過濾器,讓網關轉發(fā)請求時,去掉前綴 /gateway。斷言工廠和過濾器的概念我們在下文進行詳細講解。
4、添加斷言
在Spring Cloud Gateway中,斷言(Predicate)用于定義請求匹配的條件,從而決定是否應用某個過濾器鏈。以下是一些常見的Gateway斷言種類和相應的示例:
斷言種類 | 匹配規(guī)則 | 示例 |
Path | 根據請求的路徑進行匹配。 | - Path=/api/** 匹配路徑為 "/api/**" 的請求。 |
Method | 根據請求的HTTP方法進行匹配。 | - Method=GET 匹配GET請求。 |
Header | 根據請求的頭部信息進行匹配。 | - Header=Authorization, \d+ 匹配包含 "Authorization" 頭部的請求。 |
Host | 根據請求的主機名進行匹配。 | - Host=example.com 匹配主機名為 "example.com" 的請求。 |
Query | 根據請求的查詢參數進行匹配。 | - Query=category, \w+ 匹配包含 "category" 參數的請求。 |
Cookie | 根據請求的Cookie進行匹配。 | - Cookie=sessionId, \d+ 匹配包含名為 "sessionId" 的Cookie的請求。 |
Combining | 將多個斷言組合成一個邏輯條件, 實現(xiàn)更復雜的匹配。 | - Path=/api/** AND Method=GET 同時匹配路徑為 "/api/**" 且是GET請求的請求。 |
下面來舉個例子:
server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 開啟自動路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Header=Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE
這里用到的最常用的 Header 斷言中的鑒權斷言,要求訪問網關的請求必須在請求頭里帶有 <Authorization,?Bearer 831B175-D251501-31A3F301-711636-9CAE>?的鑒權碼,如果沒有鑒權碼或者鑒權碼不匹配,則返回 404。
5、添加過濾器
Spring Cloud Gateway提供了豐富的過濾器種類,這些過濾器用于在請求進入網關或響應離開網關時執(zhí)行各種操作。以下是一些常見的Gateway過濾器種類:
過濾器種類 | 過濾器作用 |
Pre Filters (前置過濾器) | AddRequestHeader: 添加請求頭。 |
AddRequestParameter: 添加請求參數。 | |
ModifyRequestBody: 修改請求體。 | |
Route Filters (路由過濾器) | AddResponseHeader: 添加響應頭。 |
AddResponseParameter: 添加響應參數。 | |
Hystrix: 集成Hystrix斷路器,提供服務容錯能力。 | |
Post Filters (后置過濾器) | SetStatus: 設置響應狀態(tài)碼。 |
ModifyResponseBody: 修改響應體。 | |
Error Filters (錯誤過濾器) | SendError: 處理請求發(fā)生錯誤時的操作。 |
ExceptionHandler: 自定義異常處理。 | |
Global Filters (全局過濾器) | GlobalFilter: 全局過濾器,適用于所有路由。 |
Ordered: 為過濾器設置順序。 | |
Custom Filters (自定義過濾器) | 自定義實現(xiàn)GatewayFilter接口:?開發(fā)者可以通過實現(xiàn)該接口創(chuàng)建自定義的過濾器。 |
這些過濾器可以按照需求進行組合和配置,使得開發(fā)者可以在Gateway中實現(xiàn)各種復雜的請求和響應處理邏輯。通過合理配置過濾器,可以實現(xiàn)日志記錄、認證授權、請求重試、熔斷器等功能,提高網關的靈活性和可擴展性。
下面我們來舉個例子:
server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 開啟自動路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Path=/gateway/**filters:- StripPrefix=1- AddRequestHeader=test_header, damon0806
這里可以看到,我們在 routes(網關路由)下配置了 filters(過濾器)。
- StripPrefix=1:表示從請求的URI中去除前綴的數量。在這里,1 表示去除兩級路徑的前綴。例如,如果原始請求是 /path1/rest-of-the-uri,使用此配置后,轉發(fā)到后端的請求 URI 將是 /rest-of-the-uri。
- AddRequestHeader=test_header, damon0806:表示在請求頭中添加一個自定義的頭部。具體來說,它添加了一個名為 test_header 的頭部,其值為 damon0806。這可以用于在請求發(fā)送到后端服務時傳遞額外的信息或標識。
6、啟動網關服務
編寫 springcloud-gateway 的啟動類,啟動 Gateway 網關服務,使其開始監(jiān)聽和轉發(fā)請求。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringcloudGatewayApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudGatewayApplication.class, args);}
}
7、測試路由
可以使用 Postman 等接口測試工具發(fā)送請求,測試 Gateway 網關是否能夠正確轉發(fā)請求到相應的微服務,以及斷言工廠或者過濾器是否實現(xiàn)。
三、Gatway網關的作用
Gateway 網關作為微服務架構中的入口點,扮演著關鍵的角色。
其作用主要體現(xiàn)在以下幾個方面:
作用點 | 詳細描述 |
路由 (Routing) | Gateway能夠根據請求的路徑,將請求路由到相應的微服務實例上。簡化了服務調用的過程,使得客戶端無需直接關注每個微服務的位置和細節(jié)。 |
負載均衡 (Load Balancing) | Gateway支持負載均衡,可將請求均勻地分發(fā)到多個微服務實例,提高系統(tǒng)的可用性和性能。有效避免了單一服務實例的過載,提高了整體系統(tǒng)的穩(wěn)定性。 |
過濾 (Filtering) | Gateway可以通過過濾器實現(xiàn)對請求和響應進行處理,如添加、修改請求頭、記錄日志、認證、鑒權等操作。統(tǒng)一處理與安全、日志、性能等相關的邏輯,使得系統(tǒng)更加易于維護和管理。 |
熔斷器 (Circuit Breaker) | Gateway支持熔斷器機制,當某個微服務出現(xiàn)故障或超時時,能夠自動切換到備用服務,防止故障向下游傳遞。提高了系統(tǒng)的容錯性,減少了因單一服務故障而導致整個系統(tǒng)不穩(wěn)定的風險。 |
統(tǒng)一異常處理 (Exception Handling) | Gateway可以統(tǒng)一處理微服務中的異常,提供友好的錯誤提示,防止細節(jié)泄露給客戶端。提高了系統(tǒng)的安全性和用戶體驗,降低了對異常的不良影響。 |
協(xié)議轉換 (Protocol Transformation) | Gateway支持協(xié)議的轉換,可以將外部請求轉換成內部微服務所需的協(xié)議。降低了微服務之間的耦合度,允許使用不同的協(xié)議進行通信。 |
Gateway網關在微服務架構中承擔了集中處理、管理和保護服務的責任,通過提供統(tǒng)一的入口和處理機制,使得微服務系統(tǒng)更加穩(wěn)定、靈活和易于維護。
四、Gateway網關服務的調用
下面是前端 Ajax 調用網關服務的實例:
前端 JavaScript 代碼:
$.ajax({type: "POST",url: "http://localhost:8090/gateway/getUserList",data: {},dataType: 'json'
});
網關配置如下:
server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 開啟自動路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Path=/gateway/**filters:- StripPrefix=1- AddRequestHeader=test_header, damon0806
當我們執(zhí)行上述 Ajax 請求時,請求會被網關轉發(fā)到 lb://target/getUserList 上。
五、Gateway網關總結
Gateway網關作為微服務架構中的關鍵組件,承擔著諸多重要任務,為整個系統(tǒng)提供了一種高效、可靠的服務入口。以下是對Gateway網關的總結:
要點 | 要點詳細內容 |
統(tǒng)一入口 | Gateway網關為微服務提供了一個統(tǒng)一的入口,客戶端通過與網關交互,無需直接訪問每個微服務,簡化了服務調用的復雜性。 |
路由與負載均衡 | Gateway能夠根據路由規(guī)則將請求動態(tài)轉發(fā)到不同的微服務實例,同時支持負載均衡,提高了系統(tǒng)的可用性和性能。 |
過濾器與攔截 | 通過過濾器,Gateway網關能夠在請求進入網關或響應離開網關時執(zhí)行一系列操作,如鑒權、認證、日志記錄等,增強了系統(tǒng)的安全性和可維護性。 |
熔斷與異常處理 | Gateway網關支持熔斷器機制,能夠處理微服務的異常情況,避免故障的擴散。統(tǒng)一的異常處理機制提高了系統(tǒng)的穩(wěn)定性和用戶體驗。 |
協(xié)議轉換與透明性 | Gateway網關允許協(xié)議的轉換,為微服務提供了透明的通信機制。這使得微服務之間可以使用不同的通信協(xié)議,提高了系統(tǒng)的靈活性。 |
集中式管理 | Gateway網關提供了集中管理微服務的能力,可以在一個地方配置和管理所有微服務的路由規(guī)則和過濾器,降低了系統(tǒng)的維護成本。 |
性能監(jiān)控與日志記錄 | Gateway網關可以通過集成性能監(jiān)控工具和記錄詳細日志,幫助開發(fā)人員更好地了解系統(tǒng)的運行狀況,方便進行性能優(yōu)化和故障排查。 |
綜上所述,Gateway網關在微服務架構中扮演了不可或缺的角色,通過集中化管理、智能路由和強大的過濾器機制,為構建高效、可擴展的微服務系統(tǒng)提供了有力支持。其優(yōu)勢在于簡化了開發(fā)、提高了系統(tǒng)的可維護性,并在面對復雜的微服務架構時提供了一種優(yōu)雅的解決方案。