欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之Springcloud Gateway內置路由案例講解

 更新時間:2021年08月10日 10:20:45   作者:王廣帥  
這篇文章主要介紹了Java之Springcloud Gateway內置路由案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

Spring Cloud Gateway路由匹配是Spring WebFlux基礎功能的一部分,在Spring Cloud Gateway中內置了很多路由斷言工廠類。不同的斷言工廠類針對HTTP請求的不同屬性。多個斷言工廠類可以使用邏輯“and”進行組合使用。

4.1 After Route Predicate Factory

       這個Predicate工廠的實現(xiàn)類是AfterRoutePredicateFactory,使用一個時間參數(shù),如果當前請求的時間在配置的趕時間之后,此斷言才會返回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]

注意這個類使用的時間類是ZonedDateTime,表示ISO-8601日歷系統(tǒng)中具有時區(qū)的日期時間,所以在application.yml中的時間配置格式只能是:2017-01-20T17:42:47.789-07:00[America/Denver],字符串的時間格式轉化為ZonedDateTime使用的是StringToZonedDateTimeConverter類。如果想使用其它的時間格式,得需要自己實現(xiàn)一個單獨的轉化類了。通過源碼中的測試例子可以看到,如果請求在配置的時間之前,網(wǎng)關會返回404,如果在配置的時間之后,網(wǎng)關路由成功到www.test111.com 網(wǎng)站。

      這里簡單說一下spring.cloud.gateway.routes的配置,它對應的是一個List列表,List列表存儲的對象類型是RouteDefinition,這是一個路由的定義類。id是在這個List列表中所有的路由定義中必須唯一,可以隨便定義。在RouteDefinition聲明的字段,在application.yml中的spring.cloud.gateway.routes中都可以配置。

4.2 Before Route Predicate Factory

       這個Predicate工廠的實現(xiàn)類是BeforeRoutePredicateFactory,它和AfterRoutePredicateFactory的實現(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]

如果當前請求的時間在配置的時間之前,此斷言返回true,網(wǎng)關將請求路由到www.test111.com網(wǎng)站。否則,返回404。

4.3 Between Route Predicate Factory

       這個Predicate的工廠實現(xiàn)類是BetweenRoutePredicateFactory,它有兩個參數(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]

當請求網(wǎng)關的時間在datatime1之后,在datetim2之前時,這個斷言返回true,會將請求路由到www.test111.com網(wǎng)站。這個斷言對于維護一個時間窗口很有用。比如限制在基某段時間內開啟的活動,非這個時間段不可以訪問等。

4.4 Cookie Route Predicate Factory

       這個Predicate工廠的實現(xiàn)類是CookieRoutePredicateFactory,它有兩個參數(shù),一個是name,另一個是正則表達式。在application.,yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: http://www.test111.com
        predicates:
        - Cookie=username, wgslcuky

如果請求的Cookie中有name的值,并且根據(jù)name取出的值都匹配配置的正則表達式,這個斷方就返回true,會將請求路由到http://www.test111.com網(wǎng)站。上面的配置就是表示Cookie中username的值是wgslucky時,斷言返回true.

4.5 Header Route Predicate Factory

       這個Predicate工廠的實現(xiàn)類是HeaderRoutePredicateFactory,它有兩個參數(shù),一個是name,另一個是正則表達式。在application.yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: http://www.test111.com
        predicates:
        - Header=X-Request-Id, \d+

如果請求的Header里面有name的值,并且它的值與配置的正則表達式匹配,則斷言返回true,如果沒有配置正則表達式的值,斷言也是返回true(斷方只檢測帶正則表達式的配置),將會把請求路由到http://www.test111.com網(wǎng)站。上面的配置示例表示Header中必須有X-Request-Id,且它的值必須是數(shù)字。

4.6 Host Route Predicate Factory

       這個Predicate的工廠的實現(xiàn)類是HostRoutePredicateFactory,這有一個參數(shù),這個參數(shù)是一人List列表,它可以包含多個主機名字匹配的樣式。它遵循Ant的樣式風格,以點(.)分隔。在application.yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.test111.com
        predicates:
        - Host=**.somehost.org,**.anotherhost.org,{sub}.myhost.org

上面示例中Host對應的URI模板變量同樣也支持{sub}.myhost.org格式的配置。如果請求的Header中的Host的值是www.sonmehost.org,abc.somehost.org,api.anotherhost.org,這個斷言就會返回true,將請求路由到http://www.test111.com網(wǎng)站

在斷方工廠中會提取上面配置中Host對應的URI模板變量(比如上面的sub),把匹配的URI放到一個Map中,這個Map會被添加到ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)的屬性集中??梢栽诤竺娴腉ateway Filter工廠類使用。

注意,在配置Host的時候,如果Host不是80端口,在配置的時候也需要添加上端口。如:localhost:8080

4.7 Method Route Predicate Factory

       這個Predicate的實現(xiàn)類是MethodRoutePredicateFactory,它有一個參數(shù):指定的Http方法名。在application.yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: http://www.test111.com
        predicates:
        - Method=GET

如果這個請求的方法名是GET,斷言將返回true,將請求路由到http://www.test111.com網(wǎng)站。

4.8 Path Route Predicate Factory

       這個Predicate的實現(xiàn)類是PathRoutePredicateFactory,它有兩個參數(shù),一個是匹配樣式列表,另一個是boolean值,表示是否匹配分隔線。在application.yml中的配置好下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: http://www.test111.com
        predicates:
        - Path=/foo/{segment},/bar/{segment}

如果請求的URI中的路徑是/foo/1,/foo/bar或/bar/baz,這個斷言將返回true,會將請求路由到http://www.test111.com網(wǎng)站。這個斷言工廠將會提取配置的URI格式中的變量(比如上面配置的segment),并將它轉化為Map,替換掉ServerWebExchange.getAttributes(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)中的值。這個值可以在GatewayFilter工廠中使用。有一個方法可以方便的訪問這些值,如下面代碼所示:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);

String segment = uriVariables.get("segment");

4.9 Query Route Predicate Factory

    這個是參數(shù)路由斷言工廠,它的實現(xiàn)類是QueryRoutePredicateFactory,它有兩個參數(shù),一個是參數(shù)(param),這個是必須的,另一個是可選參數(shù),是一個正則表達式。在application.yml中不帶正則的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://www.test111.com
        predicates:
        - Query=baz

如果請求的參數(shù)中包含baz參數(shù),斷言將返回true,并將請求路由到http://www.test111.com網(wǎng)站。帶正則表達式的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://example.org
        predicates:
        - Query=foo, ba.

如果請求的參數(shù)中包含foo,且它的值匹配ba.,斷言將返回true,并將請求路徑到http://www.test111.com網(wǎng)著。

4.10 RemoteAddr Route Predicate Factory

    這個是遠程地址路由斷言工廠,它的實現(xiàn)類是RemoteAddrRoutePredicateFactory,它有一個List列表的參數(shù),這些參數(shù)是CIDR-notation(IPv4和IPv6)的地址字符串,比如192.168.0.1/16(192.168.0.1是ip地址,16是一個子網(wǎng)掩碼)。在application.yml中的配置如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: http://www.test111.com
        predicates:
        - RemoteAddr=192.168.1.1/24

如果請求的客戶端的ip地址是192.168.1.1到192.168.1.24的范圍,此斷言返回true,并將請求路由到http://www.test111.com網(wǎng)站。比如192.168.1.10。

4.10.1修改遠程地址的解析方式

    默認情況下,RemoteAddrRoutePredicateFactory中用到的遠程客戶端的IP地址是從請求中獲取的,但是,如果Spring Cloud Gateway是部署在一個代理服務之后的話,這可能就匹配不到真實的客戶端IP地址。這樣的話,你可以實現(xiàn)RemoteAddressResolver接口,自定義一個IP地址的解析方式。在Spring Cloud Gateway中有一個非默認的遠程IP地址解析器XForwardedRemoteAddressResolver,它是基于X-Forwarded-For header實現(xiàn)的。XForwardedRemoteAddressResolver有兩個靜態(tài)的構造方法,可以用于不同的安全策略:XForwardedRemoteAddressResolver::trustAll方法返回一個RemoteAddressResolver實例,它返回從X-Forwarded-For header獲取到的第一個IP地址。這種方式容易受到欺騙攻擊,惡意的客戶端可以給X-Forwarded-For設置一個初始化的值,這個值對于解析器來說是可以接受的。XForwardedRemoteAddressResolver::maxTrustedIndex需要一個索引值做為參數(shù),這個值和Spring Cloud Gateway前面受信任的代理設備數(shù)量相關。比如,如果Spring Cloud Gateway只可以通過HAPoxy訪問,那么maxTrustedIndex應該設置為1,如果需要通過兩個受信任的設備訪問,那么這個值應該設置為2。比如在Header中的X-Forwarded-For值如下所示:

X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3

那么maxTrustedIndex的值與下面的遠程相對應:

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")
)

項目源碼地址:https://gitee.com/wgslucky/SpringCloud

到此這篇關于Java之Springcloud Gateway內置路由案例講解的文章就介紹到這了,更多相關Java之Springcloud Gateway內置路由內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 線程死鎖的問題解決辦法

    Java 線程死鎖的問題解決辦法

    這篇文章主要介紹了 Java 線程死鎖的問題解決辦法的相關資料,希望通過本大家能幫助到大家,遇到類似問題能夠解決,需要的朋友可以參考下
    2017-09-09
  • java學生信息管理系統(tǒng)設計(2)

    java學生信息管理系統(tǒng)設計(2)

    這篇文章主要為大家詳細介紹了java學生信息管理系統(tǒng)設計,學生信息添加進入數(shù)據(jù)庫的事務,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java 精煉解讀數(shù)據(jù)結構邏輯控制

    Java 精煉解讀數(shù)據(jù)結構邏輯控制

    在程序開發(fā)的過程之中一共會存在有三種程序邏輯:順序結構、分支結構、循環(huán)結構,對于之前所編寫的代碼大部分都是順序結構的定義,即:所有的程序將按照定義的代碼順序依次執(zhí)行
    2022-03-03
  • SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例

    SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例

    本篇文章主要介紹了SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例,使用分頁插件的原因,簡化了sql代碼的寫法,實現(xiàn)較好的物理分頁,非常具有實用價值,需要的朋友可以參考下
    2018-03-03
  • ReadWriteLock接口及其實現(xiàn)ReentrantReadWriteLock方法

    ReadWriteLock接口及其實現(xiàn)ReentrantReadWriteLock方法

    下面小編就為大家?guī)硪黄猂eadWriteLock接口及其實現(xiàn)ReentrantReadWriteLock方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java 實戰(zhàn)項目之疫情人員流動管理系統(tǒng)詳解

    Java 實戰(zhàn)項目之疫情人員流動管理系統(tǒng)詳解

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個疫情人員流動管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • java線程的run()沒有返回值怎么辦?

    java線程的run()沒有返回值怎么辦?

    java線程的run()沒有返回值怎么辦?本文給出了java線程的run()返回值為空的解決辦法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Java調用商品詳情API的項目實踐

    Java調用商品詳情API的項目實踐

    在現(xiàn)代電子商務網(wǎng)站中,商品詳情API是一個重要的組件,本文就來介紹一下Java調用商品詳情API的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    這篇文章主要介紹了淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)

    基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)

    這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論