SpringCloud-Gateway網(wǎng)關(guān)的使用實(shí)例教程
本文介紹如何在 SpringCloud 項(xiàng)目中引入 Gateway 網(wǎng)關(guān)并完成網(wǎng)關(guān)服務(wù)的調(diào)用。Gateway 網(wǎng)關(guān)是一個(gè)在微服務(wù)架構(gòu)中起到入口和路由控制的關(guān)鍵組件。它負(fù)責(zé)處理客戶端請(qǐng)求,進(jìn)行路由決策,并將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的微服務(wù)。Gateway 網(wǎng)關(guān)還可以實(shí)現(xiàn)負(fù)載均衡、安全認(rèn)證、日志記錄等功能,集中管理服務(wù)間的通信,提升整體系統(tǒng)的可維護(hù)性和安全性。通過(guò) Gateway 網(wǎng)關(guān),可以實(shí)現(xiàn)統(tǒng)一的訪問(wèn)點(diǎn),簡(jiǎn)化客戶端與后端微服務(wù)之間的交互,同時(shí)也能夠更靈活地進(jìn)行流量控制和監(jiān)控。
一、Gateway網(wǎng)關(guān)介紹
Gateway 網(wǎng)關(guān)是一個(gè)基于 Spring Cloud 的 API 網(wǎng)關(guān)服務(wù),它提供了路由、過(guò)濾、監(jiān)控、日志等功能,用于統(tǒng)一管理和轉(zhuǎn)發(fā)微服務(wù)的請(qǐng)求流量。作為微服務(wù)架構(gòu)中的入口點(diǎn),Gateway 網(wǎng)關(guān)可以實(shí)現(xiàn)負(fù)載均衡、安全認(rèn)證、請(qǐng)求轉(zhuǎn)發(fā)等功能,提高了系統(tǒng)的安全性、可用性和可維護(hù)性。
網(wǎng)關(guān)的作用:
- 對(duì)用戶請(qǐng)求做身份認(rèn)證、權(quán)限校驗(yàn)
- 將用戶請(qǐng)求路由到微服務(wù),并實(shí)現(xiàn)負(fù)載均衡
- 對(duì)用戶請(qǐng)求做限流
含 Gateway 網(wǎng)關(guān)項(xiàng)目結(jié)構(gòu)示意圖:

二、搭建Gateway網(wǎng)關(guān)
搭建Gateway網(wǎng)關(guān)需要以下步驟:
1、創(chuàng)建Gateway模塊
我們需要的開發(fā)環(huán)境中創(chuàng)建一個(gè)新的Spring Boot項(xiàng)目。
不會(huì)創(chuàng)建的可以參考我之前的文章:SpringCloud-創(chuàng)建多模塊項(xiàng)目
在SpringCloud項(xiàng)目上我們創(chuàng)建Gateway模塊,我命名為 springcloud-gateway。
2、引入SpringCloud-Gateway依賴
在 springcloud-gateway 項(xiàng)目的 pom.xml 文件中引入 Spring Cloud Gateway 的依賴。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>3、配置路由規(guī)則
編輯 applicatin.yml,配置 Gateway 網(wǎng)關(guān)的路由規(guī)則,包括定義路由路徑、目標(biāo)服務(wù)等信息。
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # 開啟自動(dòng)路由
routes: # 網(wǎng)關(guān)路由配置
- id: gateway-service # 路由id,自定義,唯一
uri: lb://target # 路由的目標(biāo)地址,lb表示負(fù)載均衡
predicates: # 路由斷言,判斷請(qǐng)求是否符合路由規(guī)則
- Path=/gateway/** # 要求請(qǐng)求路徑以/user/開頭,否則404
filters:
- StripPrefix=1 # 轉(zhuǎn)發(fā)請(qǐng)求時(shí)uri過(guò)濾掉/gateway我們添加了動(dòng)態(tài)路由,這里的動(dòng)態(tài)路由屬性可以自動(dòng)讓網(wǎng)關(guān)的轉(zhuǎn)發(fā)請(qǐng)求負(fù)載均衡。
這里我們用到了一個(gè) Path 斷言,要求請(qǐng)求路徑以 /user/ 開頭,否則請(qǐng)求會(huì)返回404 (未找到服務(wù)) 。這里我們還用到了一個(gè)過(guò)濾器,讓網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求時(shí),去掉前綴 /gateway。斷言工廠和過(guò)濾器的概念我們?cè)谙挛倪M(jìn)行詳細(xì)講解。
4、添加斷言
在Spring Cloud Gateway中,斷言(Predicate)用于定義請(qǐng)求匹配的條件,從而決定是否應(yīng)用某個(gè)過(guò)濾器鏈。以下是一些常見的Gateway斷言種類和相應(yīng)的示例:
| 斷言種類 | 匹配規(guī)則 | 示例 |
| Path | 根據(jù)請(qǐng)求的路徑進(jìn)行匹配。 | - Path=/api/** 匹配路徑為 "/api/**" 的請(qǐng)求。 |
| Method | 根據(jù)請(qǐng)求的HTTP方法進(jìn)行匹配。 | - Method=GET 匹配GET請(qǐng)求。 |
| Header | 根據(jù)請(qǐng)求的頭部信息進(jìn)行匹配。 | - Header=Authorization, \d+ 匹配包含 "Authorization" 頭部的請(qǐng)求。 |
| Host | 根據(jù)請(qǐng)求的主機(jī)名進(jìn)行匹配。 | - Host=example.com 匹配主機(jī)名為 "example.com" 的請(qǐng)求。 |
| Query | 根據(jù)請(qǐng)求的查詢參數(shù)進(jìn)行匹配。 | - Query=category, \w+ 匹配包含 "category" 參數(shù)的請(qǐng)求。 |
| Cookie | 根據(jù)請(qǐng)求的Cookie進(jìn)行匹配。 | - Cookie=sessionId, \d+ 匹配包含名為 "sessionId" 的Cookie的請(qǐng)求。 |
| Combining | 將多個(gè)斷言組合成一個(gè)邏輯條件, 實(shí)現(xiàn)更復(fù)雜的匹配。 | - Path=/api/** AND Method=GET 同時(shí)匹配路徑為 "/api/**" 且是GET請(qǐng)求的請(qǐng)求。 |
下面來(lái)舉個(gè)例子:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # 開啟自動(dòng)路由
routes:
- id: gateway-service
uri: lb://target
predicates:
- Header=Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE這里用到的最常用的 Header 斷言中的鑒權(quán)斷言,要求訪問(wèn)網(wǎng)關(guān)的請(qǐng)求必須在請(qǐng)求頭里帶有 <Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE> 的鑒權(quán)碼,如果沒有鑒權(quán)碼或者鑒權(quán)碼不匹配,則返回 404。
5、添加過(guò)濾器
Spring Cloud Gateway提供了豐富的過(guò)濾器種類,這些過(guò)濾器用于在請(qǐng)求進(jìn)入網(wǎng)關(guān)或響應(yīng)離開網(wǎng)關(guān)時(shí)執(zhí)行各種操作。以下是一些常見的Gateway過(guò)濾器種類:
| 過(guò)濾器種類 | 過(guò)濾器作用 |
| Pre Filters (前置過(guò)濾器) | AddRequestHeader: 添加請(qǐng)求頭。 |
| AddRequestParameter: 添加請(qǐng)求參數(shù)。 | |
| ModifyRequestBody: 修改請(qǐng)求體。 | |
| Route Filters (路由過(guò)濾器) | AddResponseHeader: 添加響應(yīng)頭。 |
| AddResponseParameter: 添加響應(yīng)參數(shù)。 | |
| Hystrix: 集成Hystrix斷路器,提供服務(wù)容錯(cuò)能力。 | |
| Post Filters (后置過(guò)濾器) | SetStatus: 設(shè)置響應(yīng)狀態(tài)碼。 |
| ModifyResponseBody: 修改響應(yīng)體。 | |
| Error Filters (錯(cuò)誤過(guò)濾器) | SendError: 處理請(qǐng)求發(fā)生錯(cuò)誤時(shí)的操作。 |
| ExceptionHandler: 自定義異常處理。 | |
| Global Filters (全局過(guò)濾器) | GlobalFilter: 全局過(guò)濾器,適用于所有路由。 |
| Ordered: 為過(guò)濾器設(shè)置順序。 | |
| Custom Filters (自定義過(guò)濾器) | 自定義實(shí)現(xiàn)GatewayFilter接口: 開發(fā)者可以通過(guò)實(shí)現(xiàn)該接口創(chuàng)建自定義的過(guò)濾器。 |
這些過(guò)濾器可以按照需求進(jìn)行組合和配置,使得開發(fā)者可以在Gateway中實(shí)現(xiàn)各種復(fù)雜的請(qǐng)求和響應(yīng)處理邏輯。通過(guò)合理配置過(guò)濾器,可以實(shí)現(xiàn)日志記錄、認(rèn)證授權(quán)、請(qǐng)求重試、熔斷器等功能,提高網(wǎng)關(guān)的靈活性和可擴(kuò)展性。
下面我們來(lái)舉個(gè)例子:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # 開啟自動(dòng)路由
routes:
- id: gateway-service
uri: lb://target
predicates:
- Path=/gateway/**
filters:
- StripPrefix=1
- AddRequestHeader=test_header, damon0806這里可以看到,我們?cè)?routes(網(wǎng)關(guān)路由)下配置了 filters(過(guò)濾器)。
- StripPrefix=1:表示從請(qǐng)求的URI中去除前綴的數(shù)量。在這里,1 表示去除兩級(jí)路徑的前綴。例如,如果原始請(qǐng)求是 /path1/rest-of-the-uri,使用此配置后,轉(zhuǎn)發(fā)到后端的請(qǐng)求 URI 將是 /rest-of-the-uri。
- AddRequestHeader=test_header, damon0806:表示在請(qǐng)求頭中添加一個(gè)自定義的頭部。具體來(lái)說(shuō),它添加了一個(gè)名為 test_header 的頭部,其值為 damon0806。這可以用于在請(qǐng)求發(fā)送到后端服務(wù)時(shí)傳遞額外的信息或標(biāo)識(shí)。
6、啟動(dòng)網(wǎng)關(guān)服務(wù)
編寫 springcloud-gateway 的啟動(dòng)類,啟動(dòng) Gateway 網(wǎng)關(guān)服務(wù),使其開始監(jiān)聽和轉(zhuǎn)發(fā)請(qǐng)求。
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、測(cè)試路由
可以使用 Postman 等接口測(cè)試工具發(fā)送請(qǐng)求,測(cè)試 Gateway 網(wǎng)關(guān)是否能夠正確轉(zhuǎn)發(fā)請(qǐng)求到相應(yīng)的微服務(wù),以及斷言工廠或者過(guò)濾器是否實(shí)現(xiàn)。
三、Gatway網(wǎng)關(guān)的作用
Gateway 網(wǎng)關(guān)作為微服務(wù)架構(gòu)中的入口點(diǎn),扮演著關(guān)鍵的角色。
其作用主要體現(xiàn)在以下幾個(gè)方面:
| 作用點(diǎn) | 詳細(xì)描述 |
| 路由 (Routing) | Gateway能夠根據(jù)請(qǐng)求的路徑,將請(qǐng)求路由到相應(yīng)的微服務(wù)實(shí)例上。簡(jiǎn)化了服務(wù)調(diào)用的過(guò)程,使得客戶端無(wú)需直接關(guān)注每個(gè)微服務(wù)的位置和細(xì)節(jié)。 |
| 負(fù)載均衡 (Load Balancing) | Gateway支持負(fù)載均衡,可將請(qǐng)求均勻地分發(fā)到多個(gè)微服務(wù)實(shí)例,提高系統(tǒng)的可用性和性能。有效避免了單一服務(wù)實(shí)例的過(guò)載,提高了整體系統(tǒng)的穩(wěn)定性。 |
| 過(guò)濾 (Filtering) | Gateway可以通過(guò)過(guò)濾器實(shí)現(xiàn)對(duì)請(qǐng)求和響應(yīng)進(jìn)行處理,如添加、修改請(qǐng)求頭、記錄日志、認(rèn)證、鑒權(quán)等操作。統(tǒng)一處理與安全、日志、性能等相關(guān)的邏輯,使得系統(tǒng)更加易于維護(hù)和管理。 |
| 熔斷器 (Circuit Breaker) | Gateway支持熔斷器機(jī)制,當(dāng)某個(gè)微服務(wù)出現(xiàn)故障或超時(shí)時(shí),能夠自動(dòng)切換到備用服務(wù),防止故障向下游傳遞。提高了系統(tǒng)的容錯(cuò)性,減少了因單一服務(wù)故障而導(dǎo)致整個(gè)系統(tǒng)不穩(wěn)定的風(fēng)險(xiǎn)。 |
| 統(tǒng)一異常處理 (Exception Handling) | Gateway可以統(tǒng)一處理微服務(wù)中的異常,提供友好的錯(cuò)誤提示,防止細(xì)節(jié)泄露給客戶端。提高了系統(tǒng)的安全性和用戶體驗(yàn),降低了對(duì)異常的不良影響。 |
| 協(xié)議轉(zhuǎn)換 (Protocol Transformation) | Gateway支持協(xié)議的轉(zhuǎn)換,可以將外部請(qǐng)求轉(zhuǎn)換成內(nèi)部微服務(wù)所需的協(xié)議。降低了微服務(wù)之間的耦合度,允許使用不同的協(xié)議進(jìn)行通信。 |
Gateway網(wǎng)關(guān)在微服務(wù)架構(gòu)中承擔(dān)了集中處理、管理和保護(hù)服務(wù)的責(zé)任,通過(guò)提供統(tǒng)一的入口和處理機(jī)制,使得微服務(wù)系統(tǒng)更加穩(wěn)定、靈活和易于維護(hù)。
四、Gateway網(wǎng)關(guān)服務(wù)的調(diào)用
下面是前端 Ajax 調(diào)用網(wǎng)關(guān)服務(wù)的實(shí)例:
前端 JavaScript 代碼:
$.ajax({
type: "POST",
url: "http://localhost:8090/gateway/getUserList",
data: {},
dataType: 'json'
});網(wǎng)關(guān)配置如下:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # 開啟自動(dòng)路由
routes:
- id: gateway-service
uri: lb://target
predicates:
- Path=/gateway/**
filters:
- StripPrefix=1
- AddRequestHeader=test_header, damon0806當(dāng)我們執(zhí)行上述 Ajax 請(qǐng)求時(shí),請(qǐng)求會(huì)被網(wǎng)關(guān)轉(zhuǎn)發(fā)到 lb://target/getUserList 上。
五、Gateway網(wǎng)關(guān)總結(jié)
Gateway網(wǎng)關(guān)作為微服務(wù)架構(gòu)中的關(guān)鍵組件,承擔(dān)著諸多重要任務(wù),為整個(gè)系統(tǒng)提供了一種高效、可靠的服務(wù)入口。以下是對(duì)Gateway網(wǎng)關(guān)的總結(jié):
| 要點(diǎn) | 要點(diǎn)詳細(xì)內(nèi)容 |
| 統(tǒng)一入口 | Gateway網(wǎng)關(guān)為微服務(wù)提供了一個(gè)統(tǒng)一的入口,客戶端通過(guò)與網(wǎng)關(guān)交互,無(wú)需直接訪問(wèn)每個(gè)微服務(wù),簡(jiǎn)化了服務(wù)調(diào)用的復(fù)雜性。 |
| 路由與負(fù)載均衡 | Gateway能夠根據(jù)路由規(guī)則將請(qǐng)求動(dòng)態(tài)轉(zhuǎn)發(fā)到不同的微服務(wù)實(shí)例,同時(shí)支持負(fù)載均衡,提高了系統(tǒng)的可用性和性能。 |
| 過(guò)濾器與攔截 | 通過(guò)過(guò)濾器,Gateway網(wǎng)關(guān)能夠在請(qǐng)求進(jìn)入網(wǎng)關(guān)或響應(yīng)離開網(wǎng)關(guān)時(shí)執(zhí)行一系列操作,如鑒權(quán)、認(rèn)證、日志記錄等,增強(qiáng)了系統(tǒng)的安全性和可維護(hù)性。 |
| 熔斷與異常處理 | Gateway網(wǎng)關(guān)支持熔斷器機(jī)制,能夠處理微服務(wù)的異常情況,避免故障的擴(kuò)散。統(tǒng)一的異常處理機(jī)制提高了系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)。 |
| 協(xié)議轉(zhuǎn)換與透明性 | Gateway網(wǎng)關(guān)允許協(xié)議的轉(zhuǎn)換,為微服務(wù)提供了透明的通信機(jī)制。這使得微服務(wù)之間可以使用不同的通信協(xié)議,提高了系統(tǒng)的靈活性。 |
| 集中式管理 | Gateway網(wǎng)關(guān)提供了集中管理微服務(wù)的能力,可以在一個(gè)地方配置和管理所有微服務(wù)的路由規(guī)則和過(guò)濾器,降低了系統(tǒng)的維護(hù)成本。 |
| 性能監(jiān)控與日志記錄 | Gateway網(wǎng)關(guān)可以通過(guò)集成性能監(jiān)控工具和記錄詳細(xì)日志,幫助開發(fā)人員更好地了解系統(tǒng)的運(yùn)行狀況,方便進(jìn)行性能優(yōu)化和故障排查。 |
綜上所述,Gateway網(wǎng)關(guān)在微服務(wù)架構(gòu)中扮演了不可或缺的角色,通過(guò)集中化管理、智能路由和強(qiáng)大的過(guò)濾器機(jī)制,為構(gòu)建高效、可擴(kuò)展的微服務(wù)系統(tǒng)提供了有力支持。其優(yōu)勢(shì)在于簡(jiǎn)化了開發(fā)、提高了系統(tǒng)的可維護(hù)性,并在面對(duì)復(fù)雜的微服務(wù)架構(gòu)時(shí)提供了一種優(yōu)雅的解決方案。
到此這篇關(guān)于SpringCloud-Gateway網(wǎng)關(guān)的使用的文章就介紹到這了,更多相關(guān)SpringCloud Gateway網(wǎng)關(guān)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springcloud GateWay網(wǎng)關(guān)配置過(guò)程圖解
- 詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)
- spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問(wèn)題
- 詳解Spring Cloud Zuul 服務(wù)網(wǎng)關(guān)
- SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
- springcloud gateway網(wǎng)關(guān)服務(wù)啟動(dòng)報(bào)錯(cuò)的解決
- SpringCloud的Gateway網(wǎng)關(guān)詳解
- 淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul
- SpringCLoud搭建Zuul網(wǎng)關(guān)集群過(guò)程解析
- Spring Cloud 2026 網(wǎng)關(guān)模式實(shí)現(xiàn)示例
相關(guān)文章
Spring內(nèi)存緩存Caffeine的基本使用教程分享
Caffeine作為當(dāng)下本地緩存的王者被大量的應(yīng)用再實(shí)際的項(xiàng)目中,可以有效的提高服務(wù)吞吐率、qps,降低rt,本文就來(lái)簡(jiǎn)單介紹下Caffeine的使用姿勢(shì)吧2023-03-03
解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題
這篇文章主要介紹了解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Java多線程場(chǎng)景解析volatile和AtomicLong區(qū)別原理
這篇文章主要為大家介紹了Java中volatile和AtomicLong的區(qū)別原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
springboot+vue2+elementui實(shí)現(xiàn)時(shí)間段查詢方法
這篇文章主要介紹了springboot+vue2+elementui實(shí)現(xiàn)時(shí)間段查詢方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
基于Java + OpenClaw搭建本地大模型私有化的方案
數(shù)據(jù)不出內(nèi)網(wǎng)、模型本地跑、代碼自己控——本文這套方案教你用Java+OpenClaw搭建企業(yè)級(jí)私有AI中樞,告別數(shù)據(jù)裸奔,讓核心資料安心喂給AI,需要的朋友可以參考下2026-03-03
Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)詳解
這篇文章主要為大家詳細(xì)介紹了Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

