gateway中的局部过滤器_SpringCloud系列Gateway:过滤器总结

今天带大家看一下Spring Cloud Gateway的过滤器

过滤器分类

Spring Cloud Gateway根据作用范围划分为GatewayFilter和GlobalFilter,二者的区别如下GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。

GlobalFilter:全局过滤器,不需要再配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。

网关过滤器

网关过滤器用于拦截并链式处理web请求,可以实现横切与应用无关的需求,比如:安全、监控/埋点、限流访问超时设置、对请求和响应做出修改。Spring Cloud Gateway包含了许多内置的网关过滤器工厂,大概有30多个,具体用途大致可以分为以下几类Header过滤器

Parameter请求参数过滤器

Path路径过滤器

Body请求(响应)体过滤器

Status状态过滤器

Session会话过滤器

Redirect重定向过滤器

Retry重试过滤器

RateLimiter限流过滤器

Hystrix熔断过滤器。

如下图所示列出部分过滤器

接下来我们举例说明部分使用

Path路径过滤器

Path路径过滤器可以实现URL重写,通过重写URL可以实现隐藏实际路径提高安全性。

RewritePathGatewayFilterFactory

RewritePath网关过滤器工厂包括路径正则表达式参数和替换后的参数,使用正则表达式来灵活地重写请求路径。如下示例:spring: profiles: rewritePath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api-gateway/**   # 匹配对应URL请求         filters:           - RewritePath=/api-gateway(?/?.*), $\{segment} # 路径重写, 如/api-gateway/product/重写为/product/1

将/api-gateway/**路径的所有请求重写为/**及去掉/api-gateway前缀发送给下游请求http://localhost:8892/api-gateway/product/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

PrefixPathGatewayFilterFactory

PrefixPath网关过滤器工厂可以在路径前统一增加前缀重写请求路径。如下示例:spring: profiles: prefixPath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/**   # 匹配对应URL请求         filters:           - PrefixPath=/product # 在请求路径前统一增加product前缀, 如/1 重写为/product/1

将/product作为所有匹配请求的路径的前缀。因此,当请求/1将被重写为/product/1发送给下游。请求http://localhost:8892/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

StripPrefixGatewayFilterFactory

StripPrefix网关过滤器工厂可以从请求中分割掉部分路径。spring: profiles: stripPrefix cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/**   # 匹配对应URL请求         filters:           - StripPrefix=2 # 请求中分割掉前两部分路径, 如/abc/123/product/1 重写为/product/1

将请求中的前两个路径分割掉,因此,当请求/abc/123/product/1 重写为/product/1发动给下游。请求http://localhost:8892/abc/123/product/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

SetPathGatewayFilterFactory

setPath网关过滤器工厂采用路径模板参数,它提供了一种通过允许模板化路径来操作请求路径的简单方法,使用Spring Framework中的URI模板,允许多个匹配段spring: profiles: setPath cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: http://localhost:8890  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1

对于请求路径/api/1,这会将路径设置为/product/1发出下游请求之前的路径请求http://localhost:8892/api/1 会将路径设置为http://localhost:8890/product/1请求下游product-service服务

Parameter请求参数过滤器

AddRequestParameterGatewayFilterFactory

AddRequestParameter网关过滤器可以在请求中增加参数spring: profiles: addRequestParameter cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: lb://product-service  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1           - AddRequestParameter=flag, test  #在下游请求中增加flag参数值为test

修改下游product-service服务打印参数flag@RequestMapping("/{id}") public Product selectProductById(@PathVariable("id") Integer id, @RequestParam(value = "flag", required = false) String flag) {    log.info("flag的值为:{}", flag);    return service.selectProductById(id); }

请求http://localhost:8892/api/1 结果,flag结果为test

Status状态过滤器

SetStatusGatewayFilterFactory

修改响应状态码spring: profiles: setStatus cloud:   gateway:     routes:       - id: product-service         # 路由ID 唯一         uri: lb://product-service  # 目标URL,路由到对应的微服务地址         predicates:           - Path=/api/{segment}   # 匹配对应URL请求,将匹配的请求追加到目标URI之后         filters:           - SetPath=/product/{segment} # 请求中分割掉部分路径, /api/1 重写为/product/1           - SetStatus=404  #任何响应的HTTP状态将被设置为404

无论任何请求统一响应状态码为404

全局过滤器

全局过滤器不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它的请求业务以及路由的URI转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

全局过滤器主要包括以下几个,如下图所示:

你可能感兴趣的:(gateway中的局部过滤器)