閘道器請求謂詞
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 路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
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 路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
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 路由謂詞工廠接受兩個引數:datetime1 和 datetime2,它們都是 Java ZonedDateTime 物件。此謂詞匹配在 datetime1 之後且在 datetime2 之前發生的請求。引數 datetime2 必須在 datetime1 之後。以下示例配置了一個 Between 路由謂詞。
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]
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 路由謂詞工廠接受兩個引數:Cookie name 和一個 regexp(一個 Java 正則表示式)。此謂詞匹配具有給定名稱且其值與正則表示式匹配的 Cookie。以下示例配置了一個 Cookie 路由謂詞工廠。
spring:
cloud:
gateway:
mvc:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=chocolate, ch.p
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 路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
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 路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.org
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.org 或 beta.somehost.org 或 www.anotherhost.org,則此路由匹配。
此謂詞將 URI 模板變數(例如上例中定義的 sub)提取為名稱和值的對映,並將其放置在 ServerRequest.attributes() 中,其鍵由 MvcUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE 定義。這些值隨後可供閘道器處理器過濾函式使用。
Method 請求謂詞
Method 請求謂詞接受一個 methods 引數,該引數是一個或多個 HTTP 方法,用於匹配。以下示例配置了一個方法路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
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();
}
}
如果請求方法是 GET 或 POST,則此路由匹配。
GatewayRequestPredicates.method 是 RequestPredicates.methods 的簡單別名。此外,RouterFunctions.Builder API 包含組合 method 和 path RequestPredicates 的便捷方法。
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() 作為底層實現。以下示例配置了一個路徑路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
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 正則表示式)。以下示例配置了一個查詢路由謂詞。
spring:
cloud:
gateway:
mvc:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=green
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 查詢引數,則上述路由匹配。
spring:
cloud:
gateway:
mvc:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=red, gree.
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. 正則表示式匹配,例如 green 和 greet,則上述路由匹配。
Weight 請求謂詞
Weight 路由謂詞工廠接受兩個引數:group 和 weight(一個 int)。權重按組計算。以下示例配置了一個權重路由謂詞。
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
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。