日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

SpringCloud-服务网关

發(fā)布時(shí)間:2023/12/20 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud-服务网关 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

服務(wù)網(wǎng)關(guān)

GateWay

核心簡(jiǎn)介

上一代zuul 1.x官網(wǎng)

Gateway官網(wǎng)

概述

Cloud全家桶中有個(gè)很重要的組件就是網(wǎng)關(guān),在1.x版本中都是采用的Zuul網(wǎng)關(guān);

但在2.x版本中,zuul的升級(jí)一直跳票,SpringCloud最后自己研發(fā)了一個(gè)網(wǎng)關(guān)替代Zuul,那就是SpringCloud Gateway—句話:gateway是原zuul1.x版的替代

Gateway是在Spring生態(tài)系統(tǒng)之上構(gòu)建的API網(wǎng)關(guān)服務(wù),基于Spring 5,Spring Boot 2和Project Reactor等技術(shù)。

Gateway旨在提供一種簡(jiǎn)單而有效的方式來(lái)對(duì)API進(jìn)行路由,以及提供一些強(qiáng)大的過(guò)濾器功能,例如:熔斷、限流、重試等。

SpringCloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供—種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。

SpringCloud Gateway作為Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān),目標(biāo)是替代Zuul,在Spring Cloud 2.0以上版本中,沒(méi)有對(duì)新版本的Zul 2.0以上最新高性能版本進(jìn)行集成,仍然還是使用的Zuul 1.x非Reactor模式的老版本。而為了提升網(wǎng)關(guān)的性能,SpringCloud Gateway是基于WebFlux框架實(shí)現(xiàn)的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty。

Spring Cloud Gateway的目標(biāo)提供統(tǒng)一的路由方式且基于 Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/指標(biāo),和限流。

作用

  • 方向代理
  • 鑒權(quán)
  • 流量控制
  • 熔斷
  • 日志監(jiān)控

微服務(wù)架構(gòu)中網(wǎng)關(guān)的位置

有Zuul 1了怎么又出來(lái)Gateway?

我們?yōu)槭裁催x擇Gateway?

1.netflix不太靠譜,zuul2.0一直跳票,遲遲不發(fā)布。

  • 一方面因?yàn)閆uul1.0已經(jīng)進(jìn)入了維護(hù)階段,而且Gateway是SpringCloud團(tuán)隊(duì)研發(fā)的,是親兒子產(chǎn)品,值得信賴。而且很多功能Zuul都沒(méi)有用起來(lái)也非常的簡(jiǎn)單便捷。
  • Gateway是基于異步非阻塞模型上進(jìn)行開(kāi)發(fā)的,性能方面不需要擔(dān)心。雖然Netflix早就發(fā)布了最新的Zuul 2.x,但Spring Cloud貌似沒(méi)有整合計(jì)劃。而且Netflix相關(guān)組件都宣布進(jìn)入維護(hù)期;不知前景如何?
  • 多方面綜合考慮Gateway是很理想的網(wǎng)關(guān)選擇。

2.SpringCloud Gateway具有如下特性

  • 基于Spring Framework 5,Project Reactor和Spring Boot 2.0進(jìn)行構(gòu)建;
  • 動(dòng)態(tài)路由:能夠匹配任何請(qǐng)求屬性;
  • 可以對(duì)路由指定Predicate (斷言)和Filter(過(guò)濾器);
  • 集成Hystrix的斷路器功能;
  • 集成Spring Cloud 服務(wù)發(fā)現(xiàn)功能;
  • 易于編寫的Predicate (斷言)和Filter (過(guò)濾器);
  • 請(qǐng)求限流功能;
  • 支持路徑重寫。

3.SpringCloud Gateway與Zuul的區(qū)別

  • 在SpringCloud Finchley正式版之前,Spring Cloud推薦的網(wǎng)關(guān)是Netflix提供的Zuul。
  • Zuul 1.x,是一個(gè)基于阻塞I/O的API Gateway。
  • Zuul 1.x基于Servlet 2.5使用阻塞架構(gòu)它不支持任何長(zhǎng)連接(如WebSocket)Zuul的設(shè)計(jì)模式和Nginx較像,每次I/О操作都是從工作線程中選擇一個(gè)執(zhí)行,請(qǐng)求線程被阻塞到工作線程完成,但是差別是Nginx用C++實(shí)現(xiàn),Zuul用Java實(shí)現(xiàn),而JVM本身會(huì)有第-次加載較慢的情況,使得Zuul的性能相對(duì)較差。
  • Zuul 2.x理念更先進(jìn),想基于Netty非阻塞和支持長(zhǎng)連接,但SpringCloud目前還沒(méi)有整合。Zuul .x的性能較Zuul 1.x有較大提升。在性能方面,根據(jù)官方提供的基準(zhǔn)測(cè)試,Spring Cloud Gateway的RPS(每秒請(qǐng)求數(shù))是Zuul的1.6倍。
  • Spring Cloud Gateway建立在Spring Framework 5、Project Reactor和Spring Boot2之上,使用非阻塞API。
  • Spring Cloud Gateway還支持WebSocket,并且與Spring緊密集成擁有更好的開(kāi)發(fā)體驗(yàn)
Zuul1.x模型

Springcloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是傳統(tǒng)的Serviet IO處理模型。

Servlet的生命周期?servlet由servlet container進(jìn)行生命周期管理。

  • container啟動(dòng)時(shí)構(gòu)造servlet對(duì)象并調(diào)用servlet init()進(jìn)行初始化;
  • container運(yùn)行時(shí)接受請(qǐng)求,并為每個(gè)請(qǐng)求分配一個(gè)線程(一般從線程池中獲取空閑線程)然后調(diào)用service);
  • container關(guān)閉時(shí)調(diào)用servlet destory()銷毀servlet。

上述模式的缺點(diǎn):

Servlet是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)IO模型,當(dāng)請(qǐng)求進(jìn)入Servlet container時(shí),Servlet container就會(huì)為其綁定一個(gè)線程,在并發(fā)不高的場(chǎng)景下這種模型是適用的。但是一旦高并發(fā)(如抽風(fēng)用Jmeter壓),線程數(shù)量就會(huì)上漲,而線程資源代價(jià)是昂貴的(上線文切換,內(nèi)存消耗大)嚴(yán)重影響請(qǐng)求的處理時(shí)間。在一些簡(jiǎn)單業(yè)務(wù)場(chǎng)景下,不希望為每個(gè)request分配一個(gè)線程,只需要1個(gè)或幾個(gè)線程就能應(yīng)對(duì)極大并發(fā)的請(qǐng)求,這種業(yè)務(wù)場(chǎng)景下servlet模型沒(méi)有優(yōu)勢(shì)。

所以Zuul 1.X是基于servlet之上的一個(gè)阻塞式處理模型,即Spring實(shí)現(xiàn)了處理所有request請(qǐng)求的一個(gè)servlet (DispatcherServlet)并由該servlet阻塞式處理處理。所以SpringCloud Zuul無(wú)法擺脫servlet模型的弊端。

Gateway模型

WebFlux是什么?官方文檔

傳統(tǒng)的Web框架,比如說(shuō): Struts2,SpringMVC等都是基于Servlet APl與Servlet容器基礎(chǔ)之上運(yùn)行的。

但是在Servlet3.1之后有了異步非阻塞的支持。而WebFlux是一個(gè)典型非阻塞異步的框架,它的核心是基于Reactor的相關(guān)API實(shí)現(xiàn)的。相對(duì)于傳統(tǒng)的web框架來(lái)說(shuō),它可以運(yùn)行在諸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函數(shù)式編程(Spring 5必須讓你使用Java 8)。

Spring WebFlux是Spring 5.0 引入的新的響應(yīng)式框架,區(qū)別于Spring MVC,它不需要依賴Servlet APl,它是完全異步非阻塞的,并且基于Reactor來(lái)實(shí)現(xiàn)響應(yīng)式流規(guī)范。

Spring Cloud Gateway requires the Netty runtime provided by Spring Boot and Spring Webflux. It does not work in a traditional Servlet Container or when built as a WAR.link

三大核心概念

Route(路由)

路由是構(gòu)建網(wǎng)關(guān)的基本模塊,它由ID,目標(biāo)URI,一系列的斷言和過(guò)濾器組成,如斷言為true則匹配該路由;

Predicate(斷言)

參考的是Java8的java.util.function.Predicate,開(kāi)發(fā)人員可以匹配HTTP請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭或請(qǐng)求參數(shù)),如果請(qǐng)求與斷言相匹配則進(jìn)行路由;

Filter(過(guò)濾)

指的是Spring框架中GatewayFilter的實(shí)例,使用過(guò)濾器,可以在請(qǐng)求被路由前或者之后對(duì)請(qǐng)求進(jìn)行修改。

總體

web請(qǐng)求,通過(guò)一些匹配條件,定位到真正的服務(wù)節(jié)點(diǎn)。并在這個(gè)轉(zhuǎn)發(fā)過(guò)程的前后,進(jìn)行一些精細(xì)化控制。

predicate就是我們的匹配條件;而fliter,就可以理解為一個(gè)無(wú)所不能的攔截器。有了這兩個(gè)元素,再加上目標(biāo)uri,就可以實(shí)現(xiàn)一個(gè)具體的路由了

Gateway工作流程

官網(wǎng)總結(jié)

Clients make requests to Spring Cloud Gateway. If the Gateway Handler Mapping determines that a request matches a route, it is sent to the Gateway Web Handler. This handler runs the request through a filter chain that is specific to the request. The reason the filters are divided by the dotted line is that filters can run logic both before and after the proxy request is sent. All “pre” filter logic is executed. Then the proxy request is made. After the proxy request is made, the “post” filter logic is run. link

客戶端向Spring Cloud Gateway發(fā)出請(qǐng)求。然后在Gateway Handler Mapping 中找到與請(qǐng)求相匹配的路由,將其發(fā)送到GatewayWeb Handler。

Handler再通過(guò)指定的過(guò)濾器鏈來(lái)將請(qǐng)求發(fā)送到我們實(shí)際的服務(wù)執(zhí)行業(yè)務(wù)邏輯,然后返回。

過(guò)濾器之間用虛線分開(kāi)是因?yàn)檫^(guò)濾器可能會(huì)在發(fā)送代理請(qǐng)求之前(“pre”)或之后(“post")執(zhí)行業(yè)務(wù)邏輯。

Filter在“pre”類型的過(guò)濾器可以做參數(shù)校驗(yàn)、權(quán)限校驗(yàn)、流量監(jiān)控、日志輸出、協(xié)議轉(zhuǎn)換等,在“post”類型的過(guò)濾器中可以做響應(yīng)內(nèi)容、響應(yīng)頭的修改,日志的輸出,流量監(jiān)控等有著非常重要的作用。

核心邏輯:路由轉(zhuǎn)發(fā) + 執(zhí)行過(guò)濾器鏈。

入門配置

1.新建模塊

名字:cloud-gateway-gateway9527

2.POM

網(wǎng)關(guān)這不需要引入web和actuator

<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入自己定義的api通用包,可以使用Payment支付Entity --><dependency><groupId>org.example</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><!--一般基礎(chǔ)配置類--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

3.YML

server:port: 9527spring:application:name: cloud-gatewayeureka:instance:hostname: cloud-gateway-serviceclient: #服務(wù)提供者provider注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

4.主啟動(dòng)類

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient public class GateWayMain9527{public static void main(String[] args) {SpringApplication.run(GateWayMain9527.class, args);} }

5.業(yè)務(wù)類

無(wú)

6.9527網(wǎng)關(guān)如何做路由映射?

cloud-provider-payment8001看看controller的訪問(wèn)地址

  • get
  • lb

我們目前不想暴露8001端口,希望在8001外面套一層9527

7.YML新增網(wǎng)關(guān)配置

server:port: 9527spring:application:name: cloud-gateway #############################新增網(wǎng)關(guān)配置###########################cloud:gateway:routes:- id: payment_routh #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址#uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/get/** # 斷言,路徑相匹配的進(jìn)行路由- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址#uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由 ####################################################################eureka:instance:hostname: cloud-gateway-serviceclient: #服務(wù)提供者provider注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

8.測(cè)試

啟動(dòng)7001

啟動(dòng)8001-cloud-provider-payment8001

啟動(dòng)9527網(wǎng)關(guān)

訪問(wèn)說(shuō)明

  • 添加網(wǎng)關(guān)前 - http://localhost:8001/payment/get/31
  • 添加網(wǎng)關(guān)后 - http://localhost:9527/payment/get/31
  • 兩者訪問(wèn)成功,返回相同結(jié)果

9.YML配置說(shuō)明

Gateway網(wǎng)關(guān)路由有兩種配置方式

在配置文件yml中配置,見(jiàn)上一章節(jié)

代碼中注入RouteLocator的Bean

官方案例 - link

RemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1);....route("direct-route",r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24").uri("https://downstream1") .route("proxied-route",r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24").uri("https://downstream2") )

百度國(guó)內(nèi)新聞網(wǎng)址,需要外網(wǎng) - http://news.baidu.com/guonei

自己寫一個(gè)

業(yè)務(wù)需求 - 通過(guò)9527網(wǎng)關(guān)訪問(wèn)到外網(wǎng)的百度新聞網(wǎng)址

編碼

cloud-gateway-gateway9527 業(yè)務(wù)實(shí)現(xiàn)

import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class GateWayConfig{@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_atguigu",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();} }

測(cè)試

瀏覽器輸入http://localhost:9527/guonei,返回http://news.baidu.com/guonei相同的頁(yè)面。

通過(guò)微服務(wù)名實(shí)現(xiàn)動(dòng)態(tài)路由

默認(rèn)情況下Gateway會(huì)根據(jù)注冊(cè)中心注冊(cè)的服務(wù)列表,以注冊(cè)中心上微服務(wù)名為路徑創(chuàng)建動(dòng)態(tài)路由進(jìn)行轉(zhuǎn)發(fā),從而實(shí)現(xiàn)動(dòng)態(tài)路由的功能(不寫死一個(gè)地址)。

啟動(dòng)

  • eureka7001
  • payment8001/8002

POM

<!--eureka-client--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>

YML

需要注意的是uri的協(xié)議為lb,表示啟用Gateway的負(fù)載均衡功能。

lb://serviceName是spring cloud gateway在微服務(wù)中自動(dòng)為我們創(chuàng)建的負(fù)載均衡uri。

server:port: 9527spring:application:name: cloud-gateway #############################新增網(wǎng)關(guān)配置###########################cloud:gateway:discovery:locator:enabled: true #開(kāi)啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: payment_routh #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/get/** # 斷言,路徑相匹配的進(jìn)行路由- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由 ####################################################################eureka:instance:hostname: cloud-gateway-serviceclient: #服務(wù)提供者provider注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

測(cè)試

瀏覽器輸入 - http://localhost:9527/payment/lb

結(jié)果

不停刷新頁(yè)面,8001/8002兩個(gè)端口切換。

Predicate的使用

官方文檔

Route Predicate Factories這個(gè)是什么

Spring Cloud Gateway matches routes as part of the Spring WebFlux HandlerMapping infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logical and statements. link

Spring Cloud Gateway將路由匹配作為Spring WebFlux HandlerMapping基礎(chǔ)架構(gòu)的一部分。

Spring Cloud Gateway包括許多內(nèi)置的Route Predicate工廠。所有這些Predicate都與HTTP請(qǐng)求的不同屬性匹配。多個(gè)RoutePredicate工廠可以進(jìn)行組合。

Spring Cloud Gateway創(chuàng)建Route 對(duì)象時(shí),使用RoutePredicateFactory 創(chuàng)建 Predicate對(duì)象,Predicate 對(duì)象可以賦值給Route。Spring Cloud Gateway包含許多內(nèi)置的Route Predicate Factories。
所有這些謂詞都匹配HTTP請(qǐng)求的不同屬性。多種謂詞工廠可以組合,并通過(guò)邏輯and。

predicate

美: ['pred?ke?t] 英: ['pred?k?t]

v. 斷言;使基于;使以…為依據(jù);表明

adj. 述語(yǔ)的;謂項(xiàng)的

n. 謂語(yǔ)(句子成分,對(duì)主語(yǔ)加以陳述,如 John went home 中的 went home)

常用的Route Predicate Factory

  • The After Route Predicate Factory
  • The Before Route Predicate Factory
  • The Between Route Predicate Factory
  • The Cookie Route Predicate Factory
  • The Header Route Predicate Factory
  • The Host Route Predicate Factory
  • The Method Route Predicate Factory
  • The Path Route Predicate Factory
  • The Query Route Predicate Factory
  • The RemoteAddr Route Predicate Factory
  • The weight Route Predicate Factory
  • 討論幾個(gè)Route Predicate Factory

    The After Route Predicate Factory

    spring:application:name: cloud-gateway#############################新增網(wǎng)關(guān)配置###########################cloud:gateway:discovery:locator:enabled: true #開(kāi)啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由- After=2022-07-19T12:12:00.736+08:00[Asia/Shanghai]

    可以通過(guò)下述方法獲得上述格式的時(shí)間戳字符串

    import java.time.ZonedDateTime;public class T2{public static void main(String[] args){ZonedDateTime zbj = ZonedDateTime.now(); // 默認(rèn)時(shí)區(qū)System.out.println(zbj);//2022-07-19T11:12:00.736+08:00[Asia/Shanghai]} }

    The Between Route Predicate Factory

    spring:application:name: cloud-gateway#############################新增網(wǎng)關(guān)配置###########################cloud:gateway:discovery:locator:enabled: true #開(kāi)啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由- Between=2022-07-19T12:12:00.736+08:00[Asia/Shanghai],2022-07-20T12:12:00.736+08:00[Asia/Shanghai]

    The Cookie Route Predicate Factory

    spring:application:name: cloud-gateway#############################新增網(wǎng)關(guān)配置###########################cloud:gateway:discovery:locator:enabled: true #開(kāi)啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由- Cookie=username,jay

    The cookie route predicate factory takes two parameters, the cookie name and a regular expression.

    This predicate matches cookies that have the given name and whose values match the regular expression.

    測(cè)試:

    # 該命令相當(dāng)于發(fā)get請(qǐng)求,且沒(méi)帶cookie curl http://localhost:9527/payment/lb# 帶cookie的 curl http://localhost:9527/payment/lb --cookie "username=jay"

    The Header Route Predicate Factory

    spring:application:name: cloud-gateway#############################新增網(wǎng)關(guān)配置###########################cloud:gateway:discovery:locator:enabled: true #開(kāi)啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: payment_routh2 #payment_route #路由的ID,沒(méi)有固定規(guī)則但要求唯一,建議配合服務(wù)名#uri: http://localhost:8001 #匹配后提供服務(wù)的路由地址uri: lb://cloud-payment-service #匹配后提供服務(wù)的路由地址predicates:- Path=/payment/lb/** # 斷言,路徑相匹配的進(jìn)行路由- Header=X-Request-Id,\d+ #請(qǐng)求頭要有X-Request-Id 屬性并且值為整數(shù)的正則表達(dá)式

    The header route predicate factory takes two parameters, the header name and a regular expression.

    This predicate matches with a header that has the given name whose value matches the regular expression.

    測(cè)試

    # 帶指定請(qǐng)求頭的參數(shù)的CURL命令 curl http://localhost:9527/payment/lb -H "X-Request-Id:123"

    其它的,舉一反三。

    小結(jié)

    說(shuō)白了,Predicate就是為了實(shí)現(xiàn)一組匹配規(guī)則,讓請(qǐng)求過(guò)來(lái)找到對(duì)應(yīng)的Route進(jìn)行處理。

    Filter的使用

    官方文檔

    Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular route. Spring Cloud Gateway includes many built-in GatewayFilter Factories.

    路由過(guò)濾器可用于修改進(jìn)入的HTTP請(qǐng)求和返回的HTTP響應(yīng),路由過(guò)濾器只能指定路由進(jìn)行使用。Spring Cloud Gateway內(nèi)置了多種路由過(guò)濾器,他們都由GatewayFilter的工廠類來(lái)產(chǎn)生。

    Spring Cloud Gateway的Filter:

    生命周期:

    • pre
    • post

    種類(具體看官方文檔):

    • GatewayFilter - 有31種

    • GlobalFilter - 有10種

    常用的GatewayFilter:AddRequestParameter GatewayFilter

    自定義全局GlobalFilter:

    兩個(gè)主要接口介紹:

  • GlobalFilter

  • Ordered

  • 能干什么:

  • 全局日志記錄

  • 統(tǒng)一網(wǎng)關(guān)鑒權(quán)

  • 代碼案例:

    GateWay9527項(xiàng)目添加MyLogGateWayFilter類:

    import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;import java.util.Date;@Slf4j @Component public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("***********come in MyLogGateWayFilter: "+new Date());String uname = exchange.getRequest().getQueryParams().getFirst("uname");if(uname == null) {log.info("*******用戶名為null,非法用戶,o(╥﹏╥)o");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;} }

    測(cè)試:

    啟動(dòng):

    • EurekaMain7001
    • PaymentMain8001
    • GateWayMain9527
    • PaymentMain8002

    瀏覽器輸入:

    • http://localhost:9527/payment/lb - 反問(wèn)異常
    • http://localhost:9527/payment/lb?uname=abc - 正常反問(wèn)

    總結(jié)

    以上是生活随笔為你收集整理的SpringCloud-服务网关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。