spring cloud gateway系列教程2——GatewayFilter

接 上篇

RequestRateLimiter GatewayFilter Factory使用 RateLimiter 来决定当前请求是否允许通过,如果不允许,则默认返回状态码 HTTP 429 - Too Many Requests 。

RequestRateLimiter GatewayFilter可以使用一个可选参数 keyResolver 来做速率限制。

keyResolver 是 KeyResolver 接口的一个实现bean,在配置里面,通过SpEL表达式 #{@myKeyResolver} 来管理bean的名字 myKeyResolver 。

KeyResolver.java.

KeyResolver 接口允许你使用不同的策略来得出限制请求的key,未来,官方也会推出一些 KeyResolver 的不同实现。

KeyResolver 默认实现是 PrincipalNameKeyResolver ,通过 ServerWebExchange 中获取 Principal ,并以 Principal.getName() 作为限流的key。

如果 KeyResolver 拿不到key,请求默认都会被限制,你也可以自己配置 spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key :是否允许空key, spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code :空key时返回的状态码。

application.properties.

基于 Stripe 的redis实现方案,依赖 spring-boot-starter-data-redis-reactive Spring Boot starter,使用的是令牌桶算法。

redis-rate-limiter.replenishRate 配置的是每秒允许通过的请求数,其实就是令牌桶的填充速率。

redis-rate-limiter.burstCapacity 配置的是一秒内最大的请求数,其实就是令牌桶的最大容量,如果设置为0,则会阻塞所有请求。

所以可以通过设置相同的 replenishRate 和 burstCapacity 来实现匀速的速率控制,通过设置 burstCapacity 大于 replenishRate 来允许系统流量瞬间突发,但是对于这种情况,突发周期为 burstCapacity / replenishRate 秒,如果周期内有两次请求突发的情况,则第二次会有部分请求丢失,返回 HTTP 429 - Too Many Requests 。

application.yml.

Config.java.

上面定义了每个用户每秒10个请求的速率限制,允许20的突发流量,突发完,下一秒只允许10个请求通过了, KeyResolver 定义了通过请求获取请求参数 user 作为key。

你也可以实现 RateLimiter 接口自定义自己的请求速率限制器,在配置文件中使用SpEL表达式配置对应的bean的名字即可。

application.yml.

RedirectTo GatewayFilter Factory使用 status 和 url 两个参数,其中 status 必须是300系列的HTTP状态码, url 则是跳转的地址,会放在响应的 Location 的header中(http协议中转跳的header)。

application.yml.

上面路由会执行302重定向到 http://www.edjdhbb.com 。

RemoveNonProxyHeaders GatewayFilter Factory转发请求是会根据 IETF 的定义,默认会移除下列的http头信息:

你也可以通过配置 spring.cloud.gateway.filter.remove-non-proxy-headers.headers 来更改需要移除的header列表。

RemoveRequestHeader GatewayFilter Factory配置header的name,即可以移除请求的header。

application.yml.

上面路由在发送请求给下游时,会将请求中的 X-Request-Foo 头信息去掉。

RemoveResponseHeader GatewayFilter Factory通过配置header的name,会在响应返回时移除header。

application.yml.

上面路由会在响应返回给gateway的客户端时,将 X-Response-Foo 响应头信息去掉。

RewritePath GatewayFilter Factory使用路径 regexp 和替换路径 replacement 两个参数做路径重写,两个都可以灵活地使用java的正则表达式。

application.yml.

对于上面的例子,如果请求的路径是 /foo/bar ,则gateway会将请求路径改为 /bar 发送给下游。

RewriteResponseHeader GatewayFilter Factory的作用是修改响应返回的header内容,需要配置响应返回的header的 name ,匹配规则 regexp 和替换词 replacement ,也是支持java的正则表达式。

application.yml.

举个例子,对于上面的filter,如果响应的header X-Response-Foo 的内容是 /42?user=ford&password=omg!what&flag=true ,这个内容会修改为 /42?user=ford&password=***&flag=true 。

SaveSession GatewayFilter Factory会在请求下游时强制执行 WebSession::save 方法,用在那种像 Spring Session 延迟数据存储的,并在请求转发前确保session状态保存情况。

application.yml.

如果你将 Spring Secutiry 于 Spring Session 集成使用,并想确保安全信息都传到下游机器,你就需要配置这个filter。

SecureHeaders GatewayFilter Factory会添加在返回响应中一系列安全作用的header,至于为什么,英文好的可以看一下 这篇博客 。

默认会添加这些头信息和默认内容:

如果你想修改这些头信息的默认内容,可以在配置文件中添加下面的配置:

前缀: spring.cloud.gateway.filter.secure-headers

上面的header对应的后缀:

前后缀接起来即可,如: spring.cloud.gateway.filter.secure-headers.xss-protection-header

SetPath GatewayFilter Factory采用路径 template 参数,通过请求路径的片段的模板化,来达到操作修改路径的母的,运行多个路径片段模板化。

application.yml.

对于上面的例子,如果路径是 /foo/bar ,则对于下游的请求路径会修改为 /bar 。

SetResponseHeader GatewayFilter Factory通过设置 name 和 value 来替换响应对于的header。

application.yml.

对于上面的例子,如果下游的返回带有头信息为 X-Response-Foo:1234 ,则会gateway会替换为 X-Response-Foo:Bar ,在返回给客户端。

SetStatus GatewayFilter Factory通过配置有效的Spring HttpStatus 枚举参数,可以是类似于404的这些数字,也可以是枚举的name字符串,来修改响应的返回码。

application.yml.

上面例子中,两种路由都会将响应的状态码设置为401。

StripPrefix GatewayFilter Factory通过配置 parts 来表示截断路径前缀的数量。

application.yml.

如上面例子中,如果请求的路径为 /name/bar/foo ,则路径会修改为 /foo ,即将路径的两个前缀去掉了。

Retry GatewayFilter Factory可以配置针对不同的响应做请求重试,可以配置如下参数:

application.yml.

上面例子,当下游服务返回502状态码时,gateway会重试3次。

RequestSize GatewayFilter Factory会限制客户端请求包的大小,通过参数 RequestSize 来配置最大上传大小,单位字节。

application.yml.

如果请求大小超过5000kb限制,则会返回状态码 413 Payload Too Large 。

Modify Request Body GatewayFilter Factory可以修改请求体内容,这个只能通过java来配置。

Modify Response Body GatewayFilter Factory用于修改响应返回的内容,同样只能通过java配置。

这一章接着上一章介绍了Spring Cloud Gateway官方的Gateway Filter使用场景,下一章讲 Global Filters的使用 。

如果想查看其他spring cloud gateway的案例和使用,可以点击 查看



扩展阅读:xbox series x ... mybatis plus ... springcloud hystrix ... springcloud auth2 ... spring cloud dubbo ... spring cloud security ... cloud.huawei.com ... toeic speaking ... spring cloud 版本 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网