Spring Gateway的入門概述及主要功能
1. 為什么要有網(wǎng)關(guān)
在微服務(wù)中,一般都會把相對獨立的業(yè)務(wù)或者功能劃分成一個獨立的服務(wù),做到業(yè)務(wù)或者功能之間的隔離,分開部署。但是在請求到這些正式的服務(wù)的時候一般會有一些預(yù)前的處理,比如:權(quán)限校驗,流量控制,灰度發(fā)布等。如果這些都在各自的服務(wù)中去做,勢必會增加這些基礎(chǔ)功能的維護成本??傊褪切枰幸环N前置的組件去做公共的功能邏輯。
2. Spring Gateway
Spring Gateway 是 Spring Cloud 微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,網(wǎng)絡(luò)層使用了基于非阻塞的 Netty使用異步IO增加了系統(tǒng)的性能。Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,本質(zhì)上是一個 Spring Boot 應(yīng)用。
主要功能
- 請求路由-最主要的功能
根據(jù)請求本身的屬性把請求轉(zhuǎn)發(fā)到不同的微服務(wù),使網(wǎng)關(guān)能夠根據(jù)請求的 header、路徑、參數(shù)、協(xié)議等屬性將其轉(zhuǎn)發(fā)到對應(yīng)的服務(wù)。
- 服務(wù)發(fā)現(xiàn)-基礎(chǔ)功能
網(wǎng)關(guān)是微服務(wù)環(huán)境的請求入口。支持服務(wù)發(fā)現(xiàn)能使網(wǎng)關(guān)在轉(zhuǎn)發(fā)請求到目標服務(wù)時充分利用服務(wù)注冊中心動態(tài)管理服務(wù)實例的優(yōu)勢,在配置路由轉(zhuǎn)發(fā)的目標地址時也會更加方便
- 修改請求響應(yīng)
網(wǎng)關(guān)在收到外部請求,將其轉(zhuǎn)發(fā)到目標服務(wù)之前,可以根據(jù)需求對請求進行修改,比如果更改請求 header、參數(shù)等。類似地,也可以在獲取到業(yè)務(wù)服務(wù)響應(yīng)之后,返回給用戶前對響應(yīng)進行修改。
- 前置業(yè)務(wù)處理-權(quán)限校驗
某些業(yè)務(wù)場景在處理用戶請求時需要先對用戶進行權(quán)限校驗,這部分邏輯也可以由網(wǎng)關(guān)來負責。請求在到達網(wǎng)關(guān)時,由網(wǎng)關(guān)根據(jù)請求要訪問的業(yè)務(wù)接口先對用戶鑒權(quán),只有校驗通過的請求才會轉(zhuǎn)發(fā)到對應(yīng)的服務(wù),而校驗不通過的請求會被網(wǎng)關(guān)直接拒絕。這樣做能夠把拒絕無效請求這一步提前到網(wǎng)關(guān)這一層,減少無效的流量進入到業(yè)務(wù)服務(wù)。
- 限流熔斷
網(wǎng)關(guān)可以通過添加限流、熔斷等機制來對業(yè)務(wù)服務(wù)起保護作用,提升系統(tǒng)整體的可用性。根據(jù)業(yè)務(wù)服務(wù)的吞吐量,網(wǎng)關(guān)可以限制轉(zhuǎn)發(fā)到該服務(wù)的請求數(shù)量,超出限制的請求直接拒絕或降級,這樣可以避免因為過多的請求導(dǎo)致業(yè)務(wù)服務(wù)負載過高的情況。當業(yè)務(wù)服務(wù)異常時,還可以通過熔斷的方式到達快速失敗的效果。
- 請求重試
對于一些冪等的請求,當網(wǎng)關(guān)轉(zhuǎn)發(fā)目標服務(wù)失敗時,可以在網(wǎng)關(guān)層做自動重試。對于一些多實例部署服務(wù),重試時還可以考慮把請求轉(zhuǎn)發(fā)到不同的實例,以提高請求成功的概率。
- 響應(yīng)緩存
當用戶請求獲取的是一些靜態(tài)的或更新不頻繁的數(shù)據(jù)時,一段時間內(nèi)多次請求獲取到的數(shù)據(jù)很可能是一樣的。對于這種情況可以將響應(yīng)緩存起來。這樣用戶請求可以直接在網(wǎng)關(guān)層得到響應(yīng)數(shù)據(jù),無需再去訪問業(yè)務(wù)服務(wù),減輕業(yè)務(wù)服務(wù)的負擔。
- 響應(yīng)聚合
某些情況下用戶請求要獲取的響應(yīng)內(nèi)容可能會來自于多個業(yè)務(wù)服務(wù)。網(wǎng)關(guān)作為業(yè)務(wù)服務(wù)的調(diào)用方,可以把多個服務(wù)的響應(yīng)整合起來,再一并返回給用戶。
- 監(jiān)控統(tǒng)計
因為網(wǎng)關(guān)是請求入口,所以在網(wǎng)關(guān)這一層可以方便地對外部的訪問請求做監(jiān)控和統(tǒng)計,同時還可以對業(yè)務(wù)服務(wù)的響應(yīng)做監(jiān)控,方便發(fā)現(xiàn)異常情況。
- 灰度發(fā)布
網(wǎng)關(guān)可以用來做服務(wù)流量的灰度切換。比如某個業(yè)務(wù)服務(wù)上線了新版本,那可以在網(wǎng)關(guān)這一層按照灰度策略,把一部分請求流量切換到新版本服務(wù)上,以達到驗證新版本業(yè)務(wù)服務(wù)的功能和性能的效果。
- 異常響應(yīng)處理
對于業(yè)務(wù)服務(wù)返回的異常響應(yīng),可以在網(wǎng)關(guān)層在返回給用戶之前做轉(zhuǎn)換處理。這樣可以把一些業(yè)務(wù)側(cè)返回的異常細節(jié)隱藏,轉(zhuǎn)換成用戶友好的錯誤提示返回。
3. 路由配置
路由是 Gateway 的核心構(gòu)件,不同的路由根據(jù)匹配條件可以處理不同類型的請求,并轉(zhuǎn)發(fā)到對應(yīng)的目標服務(wù)。一個路由由以下幾個屬性組成
Id: 路由 ID。
Uri: 轉(zhuǎn)發(fā)請求的目標地址。
Order: 順序(優(yōu)先級)。
Predicate: 匹配條件。
Metadata: 額外的元數(shù)據(jù)。
多個 Predicates 會合并成一個聚合的條件。Filters: 路由過濾器。這些過濾器最終會和全局過濾器一起排序處理匹配成功的請求。
Spring Cloud Gateway 本身提供了很多 Predicate 和 Filter 的實現(xiàn),一些基本的功能可以通過這些現(xiàn)成的 Predicate 和 Filter 配置實現(xiàn)。
4. 實操
代碼配置:
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
//第一個配置
.route(r -> r.host("**.abc.org").and().path("/image/png")
.filters(f ->
f.addResponseHeader("X-TestHeader", "foobar"))
.uri("http://foo.org:80")
)
// 第二個配置
.route(r -> r.path("/image/webp")
.filters(f -> f
.addRequestHeader("X-TestHeader", "baz")
.addRequestParameter("test-param", "value"))
.uri("http://bar.org:80")
.metadata("key", "value")
)
.build();
}配置文件配置
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: activity-route
uri: lb://activity
predicates:
- Path=/activity/**
filters:
- StripPrefix=1注意: Gateway默認轉(zhuǎn)發(fā)是全路徑的,設(shè)置StripPrefix=1表示從二級url路徑轉(zhuǎn)發(fā),即http://localhost:port/activity/test將會轉(zhuǎn)發(fā)到http://{activity}/test
4. 總結(jié)
Spring Cloud Gateway 是 Spring Cloud 微服務(wù)生態(tài)中的 Gateway 組件。作為 Spring Cloud Zuul 的替代,Gateway 采用了性能的更高的 Netty 作為網(wǎng)絡(luò)層服務(wù)器。Gateway 本身提供了很多常用的 Predicates 和 Filters 實現(xiàn),能滿足大部分常見需求。同時 Gateway 也支持 Spring Cloud 生態(tài)下其他組件如 Eureka 等的交互,使用起來非常方便。
參考資料:
https://blog.csdn.net/Extraordinarylife/article/details/115168526
到此這篇關(guān)于Spring Gateway的入門概述簡介的文章就介紹到這了,更多相關(guān)Spring Gateway入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)溫度單位轉(zhuǎn)換(攝氏度和華氏度)
在軟件開發(fā)中,溫度轉(zhuǎn)換是測量與控制系統(tǒng),氣象應(yīng)用,物聯(lián)網(wǎng)終端,科學(xué)計算等場景的基礎(chǔ)功能之一,所以本文將使用java實現(xiàn)溫度單位轉(zhuǎn)換功能,需要的可以了解下2025-07-07
深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機制
本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對象、集合等類型的綁定方式,以及如何處理參數(shù)校驗和異常。同時,本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。2023-06-06
struts2如何使用攔截器進行用戶權(quán)限控制實例
本篇文章主要介紹了struts2如何使用攔截器進行用戶權(quán)限控制實例,非常具有實用價值,需要的朋友可以參考下2017-05-05
Spring Cloud GateWay 路由轉(zhuǎn)發(fā)規(guī)則介紹詳解
這篇文章主要介紹了Spring Cloud GateWay 路由轉(zhuǎn)發(fā)規(guī)則介紹詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
MybatisPlus實現(xiàn)真正批量插入的詳細步驟
在數(shù)據(jù)庫操作中,批量插入是提升效率的重要手段,MyBatis-Plus提供了多種批量插入方法,但默認的saveBatch方法效率并不高,文章介紹了通過手動拼接SQL、使用IService接口以及自定義insertBatchSomeColumn方法進行優(yōu)化,以實現(xiàn)更高效的批量插入,并給出了性能優(yōu)化建議2024-10-10
Hadoop 使用IntelliJ IDEA 進行遠程調(diào)試代碼的配置方法
這篇文章主要介紹了Hadoop 使用IntelliJ IDEA 進行遠程調(diào)試代碼的配置方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解
這篇文章主要介紹了Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解,Exchanger是一個用于線程間協(xié)作的工具類,Exchanger用于進行線程間的數(shù)據(jù)交 換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下2023-12-12

