文章目录
前言
对应版本3.1.7对应SpringCloud版本2021.0.7
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.7</version>
</dependency>
一、内置断言
- AfterRoutePredicateFactory
- 作用:判断当请求时间是否在指定配置时间之后
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=After=2019-04-20T17:42:47.789+08:00[Asia/Shanghai] #也可以用下面的方式配置 #spring.cloud.gateway.routes[0].predicates[0].name=After #spring.cloud.gateway.routes[0].predicates[0].args.datetime=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]
- 使用场景:当上线一新服务时在未来某个时间提供服务
两种配置方式的区别:
第一种便捷方式配置的值是按逗号分隔,再按shortcutFieldOrder方法返回的字段顺序最后绑定的配置对象上。
第二种配置方式即标准配置方式,会把整个map作为配置对象绑定源
区别就是第一种最多只会绑定指定的字段尽管可能配置类字段有其它字段!
- BeforeRoutePredicateFactory
- 作用:与AfterRoutePredicateFactory正好相反,判断当请求时间是否在指定配置时间之前
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=Before=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]
- 使用场景:指定服务在指定时间以内访问
- BetweenRoutePredicateFactory
- 作用:判断当请求时间是否在指定配置时间之间
- 使用方式
spring.cloud.gateway.routes[0].predicates[0].name=Between #在datetime1后面即请求时间大于该时间 spring.cloud.gateway.routes[0].predicates[0].args.datetime1=2029-04-20T17:42:47.789+08:00[Asia/Shanghai] #在datetime2前面即请求时间小于该时间 spring.cloud.gateway.routes[0].predicates[0].args.datetime2=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]
- 使用场景:指定服务在指定时间范围内访问
- CloudFoundryRouteServiceRoutePredicateFactory
- 作用:判断请求是否针对 Cloud Foundry 路由服务(通过判断请求头中是否有X-CF-Forwarded-Url、X-CF-Proxy-Signature、X-CF-Proxy-Metadata这个三个配置)
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=CloudFoundryRouteService
- CookieRoutePredicateFactory
- 作用:判断请求中cookie是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)
- 使用方式
# cookie中id的值必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Cookie=id, \\d+
- HeaderRoutePredicateFactory
- 作用:判断请求头中是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)
- 使用方式
# header中X-Request-Id的值必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Header=X-Request-Id, \\d+
- HostRoutePredicateFactory
- 作用:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=Host=api1.hiboot.cn,api2.hiboot.cn
- MethodRoutePredicateFactory
- 作用:判断请求方法类型是否跟指定的类型匹配
- 使用方式
#指定路由只接受post和get请求 spring.cloud.gateway.routes[0].predicates[0]=Method=POST,GET
- PathRoutePredicateFactory
- 作用:判断请求的URI部分是否满足路径规则。使用PathContainer解析
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=Path=/web/**
- QueryRoutePredicateFactory
- 作用: 判断请求参数(QueryParams)是否具有给定名称且值与正则表达式匹配
- 使用方式
#指定请求参数age必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Query=age,\\d+
- ReadBodyRoutePredicateFactory
- 作用:读取请求体并缓存,后续调用谓词不需要再次反序列化
- 使用方式
spring.cloud.gateway.routes[0].predicates[0].name=ReadBody spring.cloud.gateway.routes[0].predicates[0].args.inClass=java.lang.String spring.cloud.gateway.routes[0].predicates[0].args.predicate=#{@testRequestBody}
- RemoteAddrRoutePredicateFactory
- 作用:判断请求访问者的地址是否在指定指定ip/mask内
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=RemoteAddr=192.168.1.0/24
- 使用场景:配置服务只允许指定ip可访问
- WeightRoutePredicateFactory
- 作用:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=Weight=group1,1
- XForwardedRemoteAddrRoutePredicateFactory
- 作用:判断是否允许根据“ X-Forward-For” HTTP标头过滤请求
- 使用方式
spring.cloud.gateway.routes[0].predicates[0]=XForwardedRemote=192.168.1.0/24,192.168.4.0/24
- 使用场景:与反向代理一起使用,例如负载平衡器或Web应用程序防火墙仅当请求来自可信赖的IP地址列表时,才允许该请求反向代理。
二、内置过滤器
1.GlobalFilter
- RemoveCachedBodyFilter
- AdaptCachedBodyGlobalFilter
- NettyWriteResponseFilter
- GatewayMetricsFilter
- RouteToRequestUrlFilter
- ReactiveLoadBalancerClientFilter
- LoadBalancerServiceInstanceCookieFilter
- WebsocketRoutingFilter
- NettyRoutingFilter
- ForwardRoutingFilter
2.GatewayFilter
- AddRequestHeaderGatewayFilterFactory
- MapRequestHeaderGatewayFilterFactory
- AddRequestParameterGatewayFilterFactory
- AddResponseHeaderGatewayFilterFactory
- ModifyRequestBodyGatewayFilterFactory
- DedupeResponseHeaderGatewayFilterFactory
- ModifyResponseBodyGatewayFilterFactory
- CacheRequestBodyGatewayFilterFactory
- PrefixPathGatewayFilterFactory
- PreserveHostHeaderGatewayFilterFactory
- RedirectToGatewayFilterFactory
- RemoveRequestHeaderGatewayFilterFactory
- RemoveRequestParameterGatewayFilterFactory
- RemoveResponseHeaderGatewayFilterFactory
- RequestRateLimiterGatewayFilterFactory
- RewritePathGatewayFilterFactory
- RetryGatewayFilterFactory
- SetPathGatewayFilterFactory
- SecureHeadersGatewayFilterFactory
- SetRequestHeaderGatewayFilterFactory
- SetRequestHostHeaderGatewayFilterFactory
- SetResponseHeaderGatewayFilterFactory
- RewriteResponseHeaderGatewayFilterFactory
- RewriteLocationResponseHeaderGatewayFilterFactory
- SetStatusGatewayFilterFactory
- SaveSessionGatewayFilterFactory
- StripPrefixGatewayFilterFactory
- RequestHeaderToRequestUriGatewayFilterFactory
- RequestSizeGatewayFilterFactory
- RequestHeaderSizeGatewayFilterFactory
三、配置参数解析模式
1.DEFAULT
配置的默认处理方式 :如果是便捷配置方式会根据接口中shortcutFieldOrder方法返回的字段顺序注入
例如:spring.cloud.gateway.routes[1].predicates[2]=Header=X-Request-Id, \\d+,则会将Header=X-Request-Id设置name,\\d+设置给regex
default List<String> shortcutFieldOrder() {
return Arrays.asList("header", "regexp");
}
public static class Config {
@NotEmpty
private String header;
private String regexp;
...
}
2.GATHER_LIST
该解析方式的条件必须是一个字段,将配置参数解析成集合
例如:spring.cloud.gateway.routes[1].predicates[2]=Method=post,get
default List<String> shortcutFieldOrder() {
return Arrays.asList("methods");
}
public static class Config {
private HttpMethod[] methods;
public HttpMethod[] getMethods() {
return methods;
}
public void setMethods(HttpMethod... methods) {
this.methods = methods;
}
}
3.GATHER_LIST_TAIL_FLAG
该解析方式的条件必须是两个字段,前一个将配置参数解析成集合,后面一个必须要是Boolean类型数据
例如:spring.cloud.gateway.routes[1].predicates[2]=Path=/web/**, false
default List<String> shortcutFieldOrder() {
return Arrays.asList("patterns", "matchTrailingSlash");
}
public static class Config {
private List<String> patterns = new ArrayList<>();
private boolean matchTrailingSlash = true;
...
}