Spring Cloud Gateway内置的断言和过滤器作用说明
作者:kse_music
前言
对应版本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>一、内置断言
1.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作为配置对象绑定源
- 区别就是第一种最多只会绑定指定的字段尽管可能配置类字段有其它字段!
2.BeforeRoutePredicateFactory
作用:与AfterRoutePredicateFactory正好相反,判断当请求时间是否在指定配置时间之前
使用方式
spring.cloud.gateway.routes[0].predicates[0]=Before=2019-04-20T17:42:47.789+08:00[Asia/Shanghai]
使用场景:指定服务在指定时间以内访问
3.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]
使用场景:指定服务在指定时间范围内访问
4.CloudFoundryRouteServiceRoutePredicateFactory
作用:判断请求是否针对 Cloud Foundry 路由服务(通过判断请求头中是否有X-CF-Forwarded-Url、X-CF-Proxy-Signature、X-CF-Proxy-Metadata这个三个配置)
使用方式
spring.cloud.gateway.routes[0].predicates[0]=CloudFoundryRouteService
5.CookieRoutePredicateFactory
作用:判断请求中cookie是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)
使用方式
# cookie中id的值必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Cookie=id, \\d+
6.HeaderRoutePredicateFactory
作用:判断请求头中是否包含指定字段的以及对应的值是否符合指定的模式(正则表达式)
使用方式
# header中X-Request-Id的值必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Header=X-Request-Id, \\d+
7.HostRoutePredicateFactory
作用:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则
使用方式
spring.cloud.gateway.routes[0].predicates[0]=Host=api1.hiboot.cn,api2.hiboot.cn
8.MethodRoutePredicateFactory
作用:判断请求方法类型是否跟指定的类型匹配
使用方式
#指定路由只接受post和get请求 spring.cloud.gateway.routes[0].predicates[0]=Method=POST,GET
9.PathRoutePredicateFactory
作用:判断请求的URI部分是否满足路径规则。使用PathContainer解析
使用方式
spring.cloud.gateway.routes[0].predicates[0]=Path=/web/**
10.QueryRoutePredicateFactory
作用: 判断请求参数(QueryParams)是否具有给定名称且值与正则表达式匹配
使用方式
#指定请求参数age必须是数字 spring.cloud.gateway.routes[0].predicates[0]=Query=age,\\d+
11.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}12.RemoteAddrRoutePredicateFactory
作用:判断请求访问者的地址是否在指定指定ip/mask内
使用方式
spring.cloud.gateway.routes[0].predicates[0]=RemoteAddr=192.168.1.0/24
使用场景:配置服务只允许指定ip可访问
13.WeightRoutePredicateFactory
作用:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
使用方式
spring.cloud.gateway.routes[0].predicates[0]=Weight=group1,1
14.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
RemoveCachedBodyFilterAdaptCachedBodyGlobalFilterNettyWriteResponseFilterGatewayMetricsFilterRouteToRequestUrlFilterReactiveLoadBalancerClientFilterLoadBalancerServiceInstanceCookieFilterWebsocketRoutingFilterNettyRoutingFilterForwardRoutingFilter
2.GatewayFilter
AddRequestHeaderGatewayFilterFactoryMapRequestHeaderGatewayFilterFactoryAddRequestParameterGatewayFilterFactoryAddResponseHeaderGatewayFilterFactoryModifyRequestBodyGatewayFilterFactoryDedupeResponseHeaderGatewayFilterFactoryModifyResponseBodyGatewayFilterFactoryCacheRequestBodyGatewayFilterFactoryPrefixPathGatewayFilterFactoryPreserveHostHeaderGatewayFilterFactoryRedirectToGatewayFilterFactoryRemoveRequestHeaderGatewayFilterFactoryRemoveRequestParameterGatewayFilterFactoryRemoveResponseHeaderGatewayFilterFactoryRequestRateLimiterGatewayFilterFactoryRewritePathGatewayFilterFactoryRetryGatewayFilterFactorySetPathGatewayFilterFactorySecureHeadersGatewayFilterFactorySetRequestHeaderGatewayFilterFactorySetRequestHostHeaderGatewayFilterFactorySetResponseHeaderGatewayFilterFactoryRewriteResponseHeaderGatewayFilterFactoryRewriteLocationResponseHeaderGatewayFilterFactorySetStatusGatewayFilterFactorySaveSessionGatewayFilterFactoryStripPrefixGatewayFilterFactoryRequestHeaderToRequestUriGatewayFilterFactoryRequestSizeGatewayFilterFactoryRequestHeaderSizeGatewayFilterFactory
三、配置参数解析模式
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;
...
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
