Spring Cloud Gateway 过滤器工厂详解
Spring Cloud Gateway 通过过滤器拦截和处理 Web 请求,分为应用于单个路由的 GatewayFilter 和应用于所有路由的 GlobalFilter。文章详细介绍了 AddRequestHeader、Retry、RequestRateLimiter 等内置过滤器工厂的配置方法,展示了如何在 application.yml 中设置默认过滤器及启用 Actuator 监控指标,并提供了相关代码示例。

Spring Cloud Gateway 通过过滤器拦截和处理 Web 请求,分为应用于单个路由的 GatewayFilter 和应用于所有路由的 GlobalFilter。文章详细介绍了 AddRequestHeader、Retry、RequestRateLimiter 等内置过滤器工厂的配置方法,展示了如何在 application.yml 中设置默认过滤器及启用 Actuator 监控指标,并提供了相关代码示例。

Predicate 决定了请求由哪一个路由处理,如果在请求处理前后需要加一些逻辑,这就是 Filter(过滤器)的作用范围了。
Filter 分为两种类型:Pre 类型和 Post 类型。
Pre 类型过滤器:路由处理之前执行(请求转发到后端服务之前执行),在 Pre 类型过滤器中可以做鉴权、限流等。 Post 类型过滤器:请求执行完成后,将结果返回给客户端之前执行。
Spring Cloud Gateway 中内置了很多 Filter,用于拦截和链式处理 Web 请求。比如权限校验、访问超时等设定。
Spring Cloud Gateway 从作用范围上,把 Filter 可分为 GatewayFilter 和 GlobalFilter。
GatewayFilter:应用到单个路由或者一个分组的路由上。 GlobalFilter:应用到所有的路由上,也就是对所有的请求生效。
GatewayFilter 同 Predicate 类似,都是在配置文件 application.yml 中配置,每个过滤器的逻辑都是固定的。比如 AddRequestParameterGatewayFilterFactory 只需要在配置文件中写 AddRequestParameter,就可以为所有的请求添加一个参数,我们先通过一个例子来演示 GatewayFilter 如何使用。
server:
port: 8888
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 47.98.109.138:8848
gateway:
metrics:
enabled: true
routes:
- id: order-service
uri: lb://order-service/
predicates:
- Path=/order/**,/feign/**
filters:
- AddRequestParameter=userName,xiaoming
- id: product-service
uri: lb://product-service/
predicates:
- Path=/product/**
@Slf4j
@RequestMapping("/feign")
@RestController
public class FeignController {
@Autowired
private ProductApi productApi;
@RequestMapping("test")
public String test(Integer id, String userName) {
log.info("userName: " + userName);
return "接收到参数" + id;
}
}



为当前请求添加 Header

为当前请求添加请求参数

为响应结果添加 Header

从当前请求删除某个 Header

从响应结果删除某个 Header

为当前网关的所有请求执行限流过滤,如果被限流,默认会响应 HTTP429-TooManyRequests。默认提供了 RedisRateLimiter 的限流实现,采用令牌桶算法实现限流功能。

说明:
redis-rate-limiter.replenishRate : 令牌填充速度,即每秒钟允许多少个请求(不丢弃任何请求) redis-rate-limiter.burstCapacity : 令牌桶容量,即每秒用户最大能够执行的请求数量(不丢弃任何请求)。将此值设置为零将阻止所有请求 redis-rate-limiter.requestedTokens : 每次请求占用几个令牌,默认为 1。
针对不同的响应进行重试。当后端服务不可用时,网关会根据配置参数来发起重试请求。

说明:
retries: 重试次数,默认为 3 status: HTTP 请求返回的状态码,针对指定状态码进行重试。对应 org.springframework.http.HttpStatus
设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返回 413 Payload Too Large。 请求包大小,单位为字节,默认值为 5M

添加一个 filter 并将其应用于所有路由,这个属性需要一个 filter 的列表

server:
port: 8888
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 47.98.109.138:8848
gateway:
metrics:
enabled: true
routes:
- id: order-service
uri: lb://order-service/
predicates:
- Path=/order/**,/feign/**
filters:
- AddRequestParameter=userName,xiaoming
- name: Custom
args:
name: test_custom
- id: product-service
uri: lb://product-service/
predicates:
- Path=/product/**
default-filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
@RequestMapping("/order")
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId, ServerHttpResponse response) {
response.setStatusCode(BAD_GATEWAY);
return orderService.selectOrderById(orderId);
}
}


可以看到,一共是四次,第一次时访问,后三次才是 Retry 的次数。
GlobalFilter 是 Spring Cloud Gateway 中的全局过滤器,它和 GatewayFilter 的作用是相同的。 GlobalFilter 会应用到所有的路由请求上,全局过滤器通常用于实现与安全性、性能监控和日志记录等相关的全局功能。
Spring Cloud Gateway 内置的全局过滤器也有很多,比如:
• Gateway Metrics Filter: 网关指标,提供监控指标 • Forward Routing Filter: 用于本地 forward,请求不转发到下游服务器 • LoadBalancer Client Filter: 针对下游服务,实现负载均衡
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
spring:
cloud:
gateway:
metrics:
enabled: true
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
shutdown:
enabled: true
查看所有监控的信息链接
访问'http://127.0.0.1:8888/actuator',显示所有监控的信息链接


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online