閘道器請求謂詞

Spring Cloud Gateway MVC 將路由作為 Spring WebMvc.fn HandlerMapping 基礎設施的一部分進行匹配。Spring Cloud Gateway 重用了 WebMvc.fn 的許多 RequestPredicate 實現,幷包含了其他自定義的 RequestPredicate 實現。所有這些謂詞都匹配 HTTP 請求的不同屬性。您可以將多個路由謂詞工廠與 RequestPredicate.and()RequestPredicate.or() 方法結合使用。

After 請求謂詞

After 路由謂詞工廠接受一個引數,即 datetime(一個 Java ZonedDateTime)。此謂詞匹配在指定日期時間之後發生的請求。以下示例配置了一個 After 路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: after_route
          uri: https://example.org
          predicates:
          - After=2017-01-20T17:42:47.789-07:00[America/Denver]
GatewaySampleApplication.java
import java.time.ZonedDateTime;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.after;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsAfter() {
        return route("after_route")
            .route(after(ZonedDateTime.parse("2017-01-20T17:42:47.789-07:00[America/Denver]")), http())
            .before(uri("https://example.org"))
            .build();
    }
}

此路由匹配在 2017 年 1 月 20 日 17:42(丹佛山區時間)之後發出的任何請求。

Before 請求謂詞

Before 路由謂詞工廠接受一個引數,即 datetime(一個 Java ZonedDateTime)。此謂詞匹配在指定 datetime 之前發生的請求。以下示例配置了一個 Before 路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: before_route
          uri: https://example.org
          predicates:
          - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
GatewaySampleApplication.java
import java.time.ZonedDateTime;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.before;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsBefore() {
        return route("before_route")
            .route(before(ZonedDateTime.parse("2017-01-20T17:42:47.789-07:00[America/Denver]")), http()
            .before(uri("https://example.org"))
            .build();
    }
}

此路由匹配在 2017 年 1 月 20 日 17:42(丹佛山區時間)之前發出的任何請求。

Between 請求謂詞

Between 路由謂詞工廠接受兩個引數:datetime1datetime2,它們都是 Java ZonedDateTime 物件。此謂詞匹配在 datetime1 之後且在 datetime2 之前發生的請求。引數 datetime2 必須在 datetime1 之後。以下示例配置了一個 Between 路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: between_route
          uri: https://example.org
          predicates:
          - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
GatewaySampleApplication.java
import java.time.ZonedDateTime;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.between;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsBetween() {
        return route("between_route")
            .route(between(ZonedDateTime.parse("2017-01-20T17:42:47.789-07:00[America/Denver]"),
                ZonedDateTime.parse("2017-01-21T17:42:47.789-07:00[America/Denver]")), http())
            .before(uri("https://example.org"))
            .build();
    }
}

此路由匹配在 2017 年 1 月 20 日 17:42(丹佛山區時間)之後且在 2017 年 1 月 21 日 17:42(丹佛山區時間)之前發出的任何請求。這可能對維護視窗有用。

Cookie 路由謂詞工廠接受兩個引數:Cookie name 和一個 regexp(一個 Java 正則表示式)。此謂詞匹配具有給定名稱且其值與正則表示式匹配的 Cookie。以下示例配置了一個 Cookie 路由謂詞工廠。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          - Cookie=chocolate, ch.p
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.cookie;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsCookie() {
        return route("cookie_route")
            .route(cookie("chocolate", "ch.p"), http())
            .before(uri("https://example.org"))
            .build();
    }
}

此路由匹配具有名為 chocolate 的 Cookie 且其值與 ch.p 正則表示式匹配的請求。

Header 請求謂詞

Header 路由謂詞工廠接受兩個引數:header 和一個 regexp(一個 Java 正則表示式)。此謂詞匹配具有給定名稱且其值與正則表示式匹配的 Header。以下示例配置了一個 Header 路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: header_route
          uri: https://example.org
          predicates:
          - Header=X-Request-Id, \d+
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.header;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsHeader() {
        return route("header_route")
            .route(header("X-Request-Id", "\\d+"), http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求具有名為 X-Request-Id 的 Header 且其值與 \d+ 正則表示式(即,其值為一個或多個數字)匹配,則此路由匹配。

Host 請求謂詞

Host 路由謂詞工廠接受一個引數:主機名 patterns 列表。該模式是一個以 . 作為分隔符的 Ant 風格模式。此謂詞匹配與模式匹配的 Host Header。以下示例配置了一個 Host 路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: host_route
          uri: https://example.org
          predicates:
          - Host=**.somehost.org,**.anotherhost.org
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.host;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsHost() {
        return route("host_route")
            .route(host("**.somehost.org", "**.anotherhost.org"), http())
            .before(uri("https://example.org"))
            .build();
    }
}

URI 模板變數(例如 {sub}.myhost.org)也受支援。

如果請求具有 Host Header,其值為 www.somehost.orgbeta.somehost.orgwww.anotherhost.org,則此路由匹配。

此謂詞將 URI 模板變數(例如上例中定義的 sub)提取為名稱和值的對映,並將其放置在 ServerRequest.attributes() 中,其鍵由 MvcUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE 定義。這些值隨後可供閘道器處理器過濾函式使用。

Method 請求謂詞

Method 請求謂詞接受一個 methods 引數,該引數是一個或多個 HTTP 方法,用於匹配。以下示例配置了一個方法路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: method_route
          uri: https://example.org
          predicates:
          - Method=GET,POST
GatewaySampleApplication.java
import org.springframework.http.HttpMethod;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.method;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsMethod() {
        return route("method_route")
            .route(method(HttpMethod.GET, HttpMethod.POST), http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求方法是 GETPOST,則此路由匹配。

GatewayRequestPredicates.methodRequestPredicates.methods 的簡單別名。此外,RouterFunctions.Builder API 包含組合 methodpath RequestPredicates 的便捷方法。

GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsMethodAndPath() {
        return route("method_and_path_route")
            .GET("/mypath", http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求方法是 GET 且路徑是 /mypath,則此路由匹配。

Path 請求謂詞

Path 請求謂詞接受兩個引數:Spring PathPattern patterns 列表。此請求謂詞使用 RequestPredicates.path() 作為底層實現。以下示例配置了一個路徑路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: path_route
          uri: https://example.org
          predicates:
          - Path=/red/{segment},/blue/{segment}
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.path;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsPath() {
        return route("path_route")
            .route(path("/red/{segment}", "/blue/{segment}"), http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求路徑是例如:/red/1/red/1//red/blue/blue/green,則此路由匹配。

此謂詞將 URI 模板變數(例如上例中定義的 segment)提取為名稱和值的對映,並將其放置在 ServerRequest.attributes() 中,其鍵由 RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE 定義。這些值隨後可供閘道器處理器過濾函式使用。

提供了一個實用方法(稱為 get)以便更容易地訪問這些變數。以下示例展示瞭如何使用 get 方法。

Map<String, Object> uriVariables = MvcUtils.getUriTemplateVariables(request);

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

Query 請求謂詞

Query 路由謂詞工廠接受兩個引數:一個必需的 param 和一個可選的 regexp(一個 Java 正則表示式)。以下示例配置了一個查詢路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: query_route
          uri: https://example.org
          predicates:
          - Query=green
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.query;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsQuery() {
        return route("query_route")
            .route(query("green"), http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求包含 green 查詢引數,則上述路由匹配。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: query_route
          uri: https://example.org
          predicates:
          - Query=red, gree.
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.query;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsQuery() {
        return route("query_route")
            .route(query("red", "gree."), http())
            .before(uri("https://example.org"))
            .build();
    }
}

如果請求包含 red 查詢引數,且其值與 gree. 正則表示式匹配,例如 greengreet,則上述路由匹配。

Weight 請求謂詞

Weight 路由謂詞工廠接受兩個引數:groupweight(一個 int)。權重按組計算。以下示例配置了一個權重路由謂詞。

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: weight_high
          uri: https://weighthigh.org
          predicates:
          - Weight=group1, 8
        - id: weight_low
          uri: https://weightlow.org
          predicates:
          - Weight=group1, 2
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.path;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.weight;

@Configuration
class RouteConfiguration {

	@Bean
	public RouterFunction<ServerResponse> gatewayRouterFunctionsWeights() {
        return route("weight_high")
                .route(weight("group1", 8).and(path("/**")), http())
                .before(uri("https://weighthigh.org"))
                .build().and(
            route("weight_low")
                .route(weight("group1", 2).and(path("/**")), http())
                .before(uri("https://weightlow.org"))
                .build());
	}
}

此路由會將約 80% 的流量轉發到 weighthigh.org,將約 20% 的流量轉發到 weightlow.org

© . This site is unofficial and not affiliated with VMware.