Java之Springcloud Gateway內(nèi)置路由案例講解
Spring Cloud Gateway路由匹配是Spring WebFlux基礎(chǔ)功能的一部分,在Spring Cloud Gateway中內(nèi)置了很多路由斷言工廠類。不同的斷言工廠類針對(duì)HTTP請(qǐng)求的不同屬性。多個(gè)斷言工廠類可以使用邏輯“and”進(jìn)行組合使用。
4.1 After Route Predicate Factory
這個(gè)Predicate工廠的實(shí)現(xiàn)類是AfterRoutePredicateFactory,使用一個(gè)時(shí)間參數(shù),如果當(dāng)前請(qǐng)求的時(shí)間在配置的趕時(shí)間之后,此斷言才會(huì)返回true。在application.yml中如下配置所示:
spring: cloud: gateway: routes: - id: after_route uri: http://www.test111.com # 如果斷言返回true,路由到的URI predicates: - After=2017-01-20T17:42:47.789-07:00[America/Denver]
注意這個(gè)類使用的時(shí)間類是ZonedDateTime,表示ISO-8601日歷系統(tǒng)中具有時(shí)區(qū)的日期時(shí)間,所以在application.yml中的時(shí)間配置格式只能是:2017-01-20T17:42:47.789-07:00[America/Denver],字符串的時(shí)間格式轉(zhuǎn)化為ZonedDateTime使用的是StringToZonedDateTimeConverter類。如果想使用其它的時(shí)間格式,得需要自己實(shí)現(xiàn)一個(gè)單獨(dú)的轉(zhuǎn)化類了。通過(guò)源碼中的測(cè)試?yán)涌梢钥吹?,如果?qǐng)求在配置的時(shí)間之前,網(wǎng)關(guān)會(huì)返回404,如果在配置的時(shí)間之后,網(wǎng)關(guān)路由成功到www.test111.com 網(wǎng)站。
這里簡(jiǎn)單說(shuō)一下spring.cloud.gateway.routes的配置,它對(duì)應(yīng)的是一個(gè)List列表,List列表存儲(chǔ)的對(duì)象類型是RouteDefinition,這是一個(gè)路由的定義類。id是在這個(gè)List列表中所有的路由定義中必須唯一,可以隨便定義。在RouteDefinition聲明的字段,在application.yml中的spring.cloud.gateway.routes中都可以配置。
4.2 Before Route Predicate Factory
這個(gè)Predicate工廠的實(shí)現(xiàn)類是BeforeRoutePredicateFactory,它和AfterRoutePredicateFactory的實(shí)現(xiàn)基本上是一致的,在application.yml中的配置如下所示:
spring: cloud: gateway: routes: - id: before_route uri: http://www.test111.com # 路由到的URI predicates: - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
如果當(dāng)前請(qǐng)求的時(shí)間在配置的時(shí)間之前,此斷言返回true,網(wǎng)關(guān)將請(qǐng)求路由到www.test111.com網(wǎng)站。否則,返回404。
4.3 Between Route Predicate Factory
這個(gè)Predicate的工廠實(shí)現(xiàn)類是BetweenRoutePredicateFactory,它有兩個(gè)參數(shù),datatime1,datetime2,在application.yml中的配置如下:
spring: cloud: gateway: routes: - id: between_route uri: http://www.test111.com predicates: - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
當(dāng)請(qǐng)求網(wǎng)關(guān)的時(shí)間在datatime1之后,在datetim2之前時(shí),這個(gè)斷言返回true,會(huì)將請(qǐng)求路由到www.test111.com網(wǎng)站。這個(gè)斷言對(duì)于維護(hù)一個(gè)時(shí)間窗口很有用。比如限制在基某段時(shí)間內(nèi)開(kāi)啟的活動(dòng),非這個(gè)時(shí)間段不可以訪問(wèn)等。
4.4 Cookie Route Predicate Factory
這個(gè)Predicate工廠的實(shí)現(xiàn)類是CookieRoutePredicateFactory,它有兩個(gè)參數(shù),一個(gè)是name,另一個(gè)是正則表達(dá)式。在application.,yml中的配置如下所示:
spring: cloud: gateway: routes: - id: cookie_route uri: http://www.test111.com predicates: - Cookie=username, wgslcuky
如果請(qǐng)求的Cookie中有name的值,并且根據(jù)name取出的值都匹配配置的正則表達(dá)式,這個(gè)斷方就返回true,會(huì)將請(qǐng)求路由到http://www.test111.com網(wǎng)站。上面的配置就是表示Cookie中username的值是wgslucky時(shí),斷言返回true.
4.5 Header Route Predicate Factory
這個(gè)Predicate工廠的實(shí)現(xiàn)類是HeaderRoutePredicateFactory,它有兩個(gè)參數(shù),一個(gè)是name,另一個(gè)是正則表達(dá)式。在application.yml中的配置如下所示:
spring: cloud: gateway: routes: - id: header_route uri: http://www.test111.com predicates: - Header=X-Request-Id, \d+
如果請(qǐng)求的Header里面有name的值,并且它的值與配置的正則表達(dá)式匹配,則斷言返回true,如果沒(méi)有配置正則表達(dá)式的值,斷言也是返回true(斷方只檢測(cè)帶正則表達(dá)式的配置),將會(huì)把請(qǐng)求路由到http://www.test111.com網(wǎng)站。上面的配置示例表示Header中必須有X-Request-Id,且它的值必須是數(shù)字。
4.6 Host Route Predicate Factory
這個(gè)Predicate的工廠的實(shí)現(xiàn)類是HostRoutePredicateFactory,這有一個(gè)參數(shù),這個(gè)參數(shù)是一人List列表,它可以包含多個(gè)主機(jī)名字匹配的樣式。它遵循Ant的樣式風(fēng)格,以點(diǎn)(.)分隔。在application.yml中的配置如下所示:
spring: cloud: gateway: routes: - id: host_route uri: http://www.test111.com predicates: - Host=**.somehost.org,**.anotherhost.org,{sub}.myhost.org
上面示例中Host對(duì)應(yīng)的URI模板變量同樣也支持{sub}.myhost.org格式的配置。如果請(qǐng)求的Header中的Host的值是www.sonmehost.org,abc.somehost.org,api.anotherhost.org,這個(gè)斷言就會(huì)返回true,將請(qǐng)求路由到http://www.test111.com網(wǎng)站。
在斷方工廠中會(huì)提取上面配置中Host對(duì)應(yīng)的URI模板變量(比如上面的sub),把匹配的URI放到一個(gè)Map中,這個(gè)Map會(huì)被添加到ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)的屬性集中??梢栽诤竺娴腉ateway Filter工廠類使用。
注意,在配置Host的時(shí)候,如果Host不是80端口,在配置的時(shí)候也需要添加上端口。如:localhost:8080
4.7 Method Route Predicate Factory
這個(gè)Predicate的實(shí)現(xiàn)類是MethodRoutePredicateFactory,它有一個(gè)參數(shù):指定的Http方法名。在application.yml中的配置如下所示:
spring: cloud: gateway: routes: - id: method_route uri: http://www.test111.com predicates: - Method=GET
如果這個(gè)請(qǐng)求的方法名是GET,斷言將返回true,將請(qǐng)求路由到http://www.test111.com網(wǎng)站。
4.8 Path Route Predicate Factory
這個(gè)Predicate的實(shí)現(xiàn)類是PathRoutePredicateFactory,它有兩個(gè)參數(shù),一個(gè)是匹配樣式列表,另一個(gè)是boolean值,表示是否匹配分隔線。在application.yml中的配置好下所示:
spring: cloud: gateway: routes: - id: path_route uri: http://www.test111.com predicates: - Path=/foo/{segment},/bar/{segment}
如果請(qǐng)求的URI中的路徑是/foo/1,/foo/bar或/bar/baz,這個(gè)斷言將返回true,會(huì)將請(qǐng)求路由到http://www.test111.com網(wǎng)站。這個(gè)斷言工廠將會(huì)提取配置的URI格式中的變量(比如上面配置的segment),并將它轉(zhuǎn)化為Map,替換掉ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)中的值。這個(gè)值可以在GatewayFilter工廠中使用。有一個(gè)方法可以方便的訪問(wèn)這些值,如下面代碼所示:
Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); String segment = uriVariables.get("segment");
4.9 Query Route Predicate Factory
這個(gè)是參數(shù)路由斷言工廠,它的實(shí)現(xiàn)類是QueryRoutePredicateFactory,它有兩個(gè)參數(shù),一個(gè)是參數(shù)(param),這個(gè)是必須的,另一個(gè)是可選參數(shù),是一個(gè)正則表達(dá)式。在application.yml中不帶正則的配置如下所示:
spring: cloud: gateway: routes: - id: query_route uri: http://www.test111.com predicates: - Query=baz
如果請(qǐng)求的參數(shù)中包含baz參數(shù),斷言將返回true,并將請(qǐng)求路由到http://www.test111.com網(wǎng)站。帶正則表達(dá)式的配置如下所示:
spring: cloud: gateway: routes: - id: query_route uri: http://example.org predicates: - Query=foo, ba.
如果請(qǐng)求的參數(shù)中包含foo,且它的值匹配ba.,斷言將返回true,并將請(qǐng)求路徑到http://www.test111.com網(wǎng)著。
4.10 RemoteAddr Route Predicate Factory
這個(gè)是遠(yuǎn)程地址路由斷言工廠,它的實(shí)現(xiàn)類是RemoteAddrRoutePredicateFactory,它有一個(gè)List列表的參數(shù),這些參數(shù)是CIDR-notation(IPv4和IPv6)的地址字符串,比如192.168.0.1/16(192.168.0.1是ip地址,16是一個(gè)子網(wǎng)掩碼)。在application.yml中的配置如下所示:
spring: cloud: gateway: routes: - id: remoteaddr_route uri: http://www.test111.com predicates: - RemoteAddr=192.168.1.1/24
如果請(qǐng)求的客戶端的ip地址是192.168.1.1到192.168.1.24的范圍,此斷言返回true,并將請(qǐng)求路由到http://www.test111.com網(wǎng)站。比如192.168.1.10。
4.10.1修改遠(yuǎn)程地址的解析方式
默認(rèn)情況下,RemoteAddrRoutePredicateFactory中用到的遠(yuǎn)程客戶端的IP地址是從請(qǐng)求中獲取的,但是,如果Spring Cloud Gateway是部署在一個(gè)代理服務(wù)之后的話,這可能就匹配不到真實(shí)的客戶端IP地址。這樣的話,你可以實(shí)現(xiàn)RemoteAddressResolver接口,自定義一個(gè)IP地址的解析方式。在Spring Cloud Gateway中有一個(gè)非默認(rèn)的遠(yuǎn)程IP地址解析器XForwardedRemoteAddressResolver,它是基于X-Forwarded-For header實(shí)現(xiàn)的。XForwardedRemoteAddressResolver有兩個(gè)靜態(tài)的構(gòu)造方法,可以用于不同的安全策略:XForwardedRemoteAddressResolver::trustAll方法返回一個(gè)RemoteAddressResolver實(shí)例,它返回從X-Forwarded-For header獲取到的第一個(gè)IP地址。這種方式容易受到欺騙攻擊,惡意的客戶端可以給X-Forwarded-For設(shè)置一個(gè)初始化的值,這個(gè)值對(duì)于解析器來(lái)說(shuō)是可以接受的。XForwardedRemoteAddressResolver::maxTrustedIndex需要一個(gè)索引值做為參數(shù),這個(gè)值和Spring Cloud Gateway前面受信任的代理設(shè)備數(shù)量相關(guān)。比如,如果Spring Cloud Gateway只可以通過(guò)HAPoxy訪問(wèn),那么maxTrustedIndex應(yīng)該設(shè)置為1,如果需要通過(guò)兩個(gè)受信任的設(shè)備訪問(wèn),那么這個(gè)值應(yīng)該設(shè)置為2。比如在Header中的X-Forwarded-For值如下所示:
X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3
那么maxTrustedIndex的值與下面的遠(yuǎn)程相對(duì)應(yīng):
maxTrustedIndex | result |
[Integer.MIN_VALUE,0] | (invalid, IllegalArgumentException during initialization |
1 | 0.0.0.3 |
2 | 0.0.0.2 |
3 | 0.0.0.1 |
[4, Integer.MAX_VALUE] | 0.0.0.1 |
如下面代碼所示:
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") )
項(xiàng)目源碼地址:https://gitee.com/wgslucky/SpringCloud
到此這篇關(guān)于Java之Springcloud Gateway內(nèi)置路由案例講解的文章就介紹到這了,更多相關(guān)Java之Springcloud Gateway內(nèi)置路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java學(xué)生信息管理系統(tǒng)設(shè)計(jì)(2)
這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)設(shè)計(jì),學(xué)生信息添加進(jìn)入數(shù)據(jù)庫(kù)的事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Java 精煉解讀數(shù)據(jù)結(jié)構(gòu)邏輯控制
在程序開(kāi)發(fā)的過(guò)程之中一共會(huì)存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對(duì)于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行2022-03-03SSM使用mybatis分頁(yè)插件pagehepler實(shí)現(xiàn)分頁(yè)示例
本篇文章主要介紹了SSM使用mybatis分頁(yè)插件pagehepler實(shí)現(xiàn)分頁(yè)示例,使用分頁(yè)插件的原因,簡(jiǎn)化了sql代碼的寫法,實(shí)現(xiàn)較好的物理分頁(yè),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-03-03ReadWriteLock接口及其實(shí)現(xiàn)ReentrantReadWriteLock方法
下面小編就為大家?guī)?lái)一篇ReadWriteLock接口及其實(shí)現(xiàn)ReentrantReadWriteLock方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Java 實(shí)戰(zhàn)項(xiàng)目之疫情人員流動(dòng)管理系統(tǒng)詳解
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)疫情人員流動(dòng)管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Java調(diào)用商品詳情API的項(xiàng)目實(shí)踐
在現(xiàn)代電子商務(wù)網(wǎng)站中,商品詳情API是一個(gè)重要的組件,本文就來(lái)介紹一下Java調(diào)用商品詳情API的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因
這篇文章主要介紹了淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04基于XML的MyBatis的環(huán)境搭建過(guò)程詳解(IDEA)
這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過(guò)程詳解(IDEA),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11