網(wǎng)關(guān)概述
整體來(lái)看,網(wǎng)關(guān)有點(diǎn)類似于門面,所有的外部請(qǐng)求都會(huì)先經(jīng)過(guò)網(wǎng)關(guān)這一層。
網(wǎng)關(guān)不僅只是做一個(gè)請(qǐng)求的轉(zhuǎn)發(fā)及服務(wù)的整合,有了網(wǎng)關(guān)這個(gè)統(tǒng)一的入口之后,它還能提供以下功能。
- 針對(duì)所有請(qǐng)求進(jìn)行統(tǒng)一鑒權(quán)、限流、熔斷、日志。
- 協(xié)議轉(zhuǎn)化。針對(duì)后端多種不同的協(xié)議,在網(wǎng)關(guān)層統(tǒng)一處理后以HTTP對(duì)外提供服務(wù)。譬如針對(duì)Dubbo服務(wù)還需要提供一個(gè)Web應(yīng)用來(lái)進(jìn)行協(xié)議轉(zhuǎn)化,此時(shí)可以在API網(wǎng)關(guān)層轉(zhuǎn)換協(xié)議。
- 統(tǒng)一錯(cuò)誤碼處理。
- 灰度發(fā)布
- 請(qǐng)求轉(zhuǎn)發(fā),并且可以基于網(wǎng)關(guān)實(shí)現(xiàn)內(nèi)、外網(wǎng)隔離。
常用的解決方案場(chǎng)景如下:
Spring Cloud Gateway
Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它不僅提供了統(tǒng)一的路由請(qǐng)求的方式,還基于過(guò)濾鏈的方式提供了網(wǎng)關(guān)最基本的功能;解決了Spring Cloud Zuul的性能問(wèn)題:
- Zuul 1.x采用的是傳統(tǒng)的thread per connection方式來(lái)處理請(qǐng)求,也就是針對(duì)每一個(gè)請(qǐng)求,會(huì)為這個(gè)請(qǐng)求專門分配一個(gè)線程來(lái)進(jìn)行處理,直到這個(gè)請(qǐng)求完成之后才會(huì)釋放線程,一旦后臺(tái)服務(wù)器響應(yīng)較慢,就會(huì)使得該線程被阻塞,所以它的性能不是很好。
Spring WebFlux基于Project Reactor響應(yīng)式框架實(shí)現(xiàn)了完全無(wú)阻塞的、響應(yīng)式的、高并發(fā)性能的、網(wǎng)絡(luò)請(qǐng)求響應(yīng);解決了如上的Zuul性能問(wèn)題。
個(gè)人覺得,其實(shí)就是類似Nginx、Redis等基于Reactor模式的實(shí)現(xiàn);也是非阻塞IO(Epoll)的另一種體現(xiàn)。
請(qǐng)求過(guò)程及關(guān)鍵概念
Spring Cloud Gateway的請(qǐng)求處理過(guò)程如圖所示,其中有幾個(gè)非常重要的概念。
-
路由(Route):它是網(wǎng)關(guān)的基本組件,由ID、目標(biāo)URI、Predicate集合、Filter集合組成。
-
謂語(yǔ)(Predicate):它是Java 8中引入的函數(shù)式接口,提供了斷言的功能。它可以匹配HTTP請(qǐng)求中的任何內(nèi)容。如果Predicate的聚合判斷結(jié)果為true,則意味著該請(qǐng)求會(huì)被當(dāng)前Router進(jìn)行轉(zhuǎn)發(fā)。
Spring Cloud Gateway啟動(dòng)時(shí)基于Netty Server監(jiān)聽一個(gè)指定的端口(該端口可以通過(guò)server.port屬性自定義)。當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求到網(wǎng)關(guān)時(shí),網(wǎng)關(guān)會(huì)根據(jù)一系列Predicate的匹配結(jié)果來(lái)決定訪問(wèn)哪個(gè)Route路由,然后根據(jù)過(guò)濾器鏈進(jìn)行請(qǐng)求的處理。過(guò)濾器鏈可以在請(qǐng)求發(fā)送到后端服務(wù)器之前和之后執(zhí)行,也就是首先執(zhí)行Pre過(guò)濾器鏈,然后將請(qǐng)求轉(zhuǎn)發(fā)到后端的微服務(wù)執(zhí)行具體的業(yè)務(wù),最后執(zhí)行Post過(guò)濾器鏈。
Route Predicate Factories
Predicate是Java 8提供的一個(gè)函數(shù)式接口,它允許接收一個(gè)參數(shù)并返回一個(gè)布爾值,可以用于條件過(guò)濾、請(qǐng)求參數(shù)的校驗(yàn)。
在Spring Cloud Gateway中,Predicate提供了路由規(guī)則的匹配機(jī)制。比如:
意思是通過(guò)Path屬性來(lái)匹配URL前綴是/gateway/的請(qǐng)求。
如下,Spring Cloud Gateway默認(rèn)提供了很多Route Predicate Factory,這些Predicate會(huì)分別匹配HTTP請(qǐng)求的不同屬性,并且多個(gè)Predicate可以通過(guò)and邏輯進(jìn)行組合。
Gateway Filter Factories
Filter分為Pre類型的過(guò)濾器和Post類型的過(guò)濾器。
-
Pre類型的過(guò)濾器在請(qǐng)求轉(zhuǎn)發(fā)到后端微服務(wù)之前執(zhí)行,在Pre類型過(guò)濾器鏈中可以做鑒權(quán)、限流等操作。
-
Post類型的過(guò)濾器在請(qǐng)求執(zhí)行完之后、將結(jié)果返回給客戶端之前執(zhí)行。
在Spring Cloud Gateway中內(nèi)置了很多Filter,F(xiàn)ilter有兩種實(shí)現(xiàn),分別是GatewayFilter和GlobalFilter。GlobalFilter會(huì)應(yīng)用到所有的路由上,而GatewayFilter只會(huì)應(yīng)用到單個(gè)路由或者一個(gè)分組的路由上。
GatewayFilter
Spring提供了一些內(nèi)置的GatewayFilter,如:
-
AddRequestParameter GatewayFilter Factory:該過(guò)濾器的功能是對(duì)所有匹配的請(qǐng)求添加一個(gè)查詢參數(shù)。
-
AddResponseHeader GatewayFilter Factory:該過(guò)濾器會(huì)對(duì)所有匹配的請(qǐng)求,在返回結(jié)果給客戶端之前,在Header中添加相應(yīng)的數(shù)據(jù)。
在上面這段配置中,會(huì)在Response中添加Header頭,
在上面這段配置中,會(huì)在Response中添加Header頭,key=X-Response-Foo,Value=Bar。 -
RequestRateLimiter GatewayFilter Factory:該過(guò)濾器會(huì)對(duì)訪問(wèn)到當(dāng)前網(wǎng)關(guān)的所有請(qǐng)求執(zhí)行限流過(guò)濾,如果被限流,默認(rèn)情況下會(huì)響應(yīng)HTTP 429-Too Many Requests。
RequestRateLimiterGatewayFilterFactory默認(rèn)提供了RedisRateLimiter的限流實(shí)現(xiàn),它采用令牌桶算法來(lái)實(shí)現(xiàn)限流功能。
redis-rate-limiter過(guò)濾器有兩個(gè)配置屬性: -
Retry GatewayFilter Factory:Retry GatewayFilter Factory為請(qǐng)求重試過(guò)濾器,當(dāng)后端服務(wù)不可用時(shí),網(wǎng)關(guān)會(huì)根據(jù)配置參數(shù)來(lái)發(fā)起重試請(qǐng)求。
RetryGatewayFilter提供4個(gè)參數(shù)來(lái)控制重試請(qǐng)求,參數(shù)說(shuō)明如下。
GlobalFilter
GlobalFilter和GatewayFilter的作用是相同的,只是GlobalFilter針對(duì)所有的路由配置生效。Spring Cloud Gateway內(nèi)置的全局過(guò)濾器也有很多,比如:
全局過(guò)濾鏈的執(zhí)行順序是,當(dāng)Gateway接收到請(qǐng)求時(shí),F(xiàn)iltering Web Handler處理器會(huì)將所有的GlobalFilter實(shí)例及所有路由上所配置的GatewayFilter實(shí)例添加到一條過(guò)濾器鏈中。該過(guò)濾器鏈里的所有過(guò)濾器都會(huì)按照@Order注解所指定的數(shù)字大小進(jìn)行排序。
-
LoadBalancerClientFilter:LoadBalancerClientFilter是用于實(shí)現(xiàn)請(qǐng)求負(fù)載均衡的全局過(guò)濾器,配置如下。
如果URI配置的是lb://example_service,那么這個(gè)過(guò)濾器會(huì)識(shí)別到lb://,并且使用Spring Cloud LoadBalancerClient將example_service名稱解析成實(shí)際訪問(wèn)的主機(jī)和端口地址。 -
GatewayMetricsFilter:GatewayMetricsFilter是網(wǎng)關(guān)指標(biāo)過(guò)濾器,這個(gè)過(guò)濾器會(huì)添加name=gateway.requests的timer metrics,其中包含以下數(shù)據(jù)。
這些指標(biāo)通過(guò)http://ip:port/actuator/metrics/gateway.requests獲得,前提是需要添加Spring Boot Actuator依賴。
自定義過(guò)濾器
Spring Cloud Gateway提供了過(guò)濾器的擴(kuò)展功能,開發(fā)者可以根據(jù)實(shí)際業(yè)務(wù)需求來(lái)自定義過(guò)濾器。同樣,自定義過(guò)濾器也支持GlobalFilter和GatewayFilter兩種。
-
自定義GatewayFilter:自定義過(guò)濾器類GpDefineGatewayFilterFactory,繼承AbstractGatewayFilterFactory。
-
自定義GlobalFilter:GlobalFilter的實(shí)現(xiàn)比較簡(jiǎn)單,它不需要額外的配置,只需要實(shí)現(xiàn)GlobalFilter接口,自動(dòng)會(huì)過(guò)濾所有的Route。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-469902.html
集成
Spring Cloud Gateway支持與其他解決方案集成,實(shí)現(xiàn)更強(qiáng)大的功能,比如Spring Cloud Alibaba系列。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469902.html
到了這里,關(guān)于聊聊Spring Cloud Gateway的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!