> 技术文档 > Spring Cloud之服务入口Gateway之Gateway Filter Factories

Spring Cloud之服务入口Gateway之Gateway Filter Factories

目录

Gateway Filter Factories

GatewayFilter

application.yml

接收参数并打印

启动服务并访问

GatewayFilter说明

AddRequestHeader GatewayFilter Factory

AddRequestHeadersIfNotPresent GatewayFilter Factory

AddResponseHeader GatewayFilter Factory

RemoveRequestHeader GatewayFilter Factory

RemoveResponseHeader GatewayFilter Factory

RequestRateLimiter GatewayFilter Factory

Retry GatewayFilter Factory

 RequestSize GatewayFilter Factory

Default Filters

Default Filter的使用

application.yml

设置响应状态码为BAD_GATEWAY

启动服务并访问

GlobalFilter

GlobalFilter的使用

添加依赖

添加配置

启动服务并访问


Gateway Filter Factories

Predicate决定了请求由哪⼀个路由处理, 如果在请求处理前后需要加⼀些逻辑, 这就是Filter(过滤器)的作⽤范围了.

Filter分为两种类型: Pre类型和Post类型.

Pre类型过滤器: 路由处理之前执⾏(请求转发到后端服务之前执⾏), 在Pre 类型过滤器中可以做鉴权, 限流等.
Post类型过滤器: 请求执⾏完成后, 将结果返回给客⼾端之前执⾏.

Spring Cloud Gateway 中内置了很多Filter, ⽤于拦截和链式处理web请求. ⽐如权限校验, 访问超时等设定.

Spring Cloud Gateway从作⽤范围上, 把Filter可分为GatewayFilter 和GlobalFilter.

GatewayFilter: 应⽤到单个路由或者⼀个分组的路由上.
GlobalFilter: 应⽤到所有的路由上, 也就是对所有的请求⽣效.

GatewayFilter

GatewayFilter 同 Predicate 类似, 都是在配置⽂件 application.yml 中配置,每个过滤
器的逻辑都是固定的. ⽐如 AddRequestParameterGatewayFilterFactory 只需要在配置⽂件
中写 AddRequestParameter , 就可以为所有的请求添加⼀个参数, 我们先通过⼀个例⼦来演⽰
GatewayFilter如何使⽤.

application.yml
server: port: 8888spring: application: name: gateway cloud: nacos: discovery: server-addr: 47.98.109.138:8848 gateway: metrics: enabled: true routes: - id: order-service #路由规则id, 随便起, 不重复即可 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\")@RestControllerpublic class FeignController { @Autowired private ProductApi productApi; @RequestMapping(\"test\") public String test(Integer id,String userName) { log.info(\"userName: \"+userName); return \"接收到参数\"+id; }}
启动服务并访问

GatewayFilter说明
AddRequestHeader GatewayFilter Factory

为当前请求添加Header

AddRequestHeadersIfNotPresent GatewayFilter Factory

为当前请求添加请求参数

AddResponseHeader GatewayFilter Factory

为响应结果添加Header

RemoveRequestHeader GatewayFilter Factory

从当前请求删除某个Header

RemoveResponseHeader GatewayFilter Factory

从响应结果删除某个Header

RequestRateLimiter GatewayFilter Factory

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

说明:

redis-rate-limiter.replenishRate : 令牌填充速度, 即每秒钟允许多少个请求(不丢弃任何请求)
redis-rate-limiter.burstCapacity : 令牌桶容量, 即每秒⽤⼾最⼤能够执⾏的请求数量(不丢弃任何请求). 将此值设置为零将阻⽌所有请求
redis-rate-limiter.requestedTokens : 每次请求占⽤⼏个令牌, 默认为 1 。

Retry GatewayFilter Factory

针对不同的响应进⾏重试. 当后端服务不可⽤时, ⽹关会根据配置参数来发起重试请求.

说明:

retries: 重试次数, 默认为3
status:HTTP请求返回的状态码, 针对指定状态码进⾏重试. 对应
org.springframework.http.HttpStatus

 RequestSize GatewayFilter Factory

设置允许接收最⼤请求包的⼤小. 如果请求包大小超过设置的值, 则返回 413 Payload Too
Large.
请求包大小, 单位为字节, 默认值为5M

Default Filters

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

Default Filter的使用
application.yml
server: port: 8888spring: application: name: gateway cloud: nacos: discovery: server-addr: 47.98.109.138:8848 gateway: metrics: enabled: true routes: - id: order-service #路由规则id, 随便起, 不重复即可 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
设置响应状态码为BAD_GATEWAY
@RequestMapping(\"/order\")@RestControllerpublic 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

GlobalFilter是Spring Cloud Gateway中的全局过滤器, 它和GatewayFilter的作⽤是相同的.
GlobalFilter 会应⽤到所有的路由请求上, 全局过滤器通常⽤于实现与安全性, 性能监控和⽇志记录等相关的全局功能.

Spring Cloud Gateway 内置的全局过滤器也有很多, ⽐如:

• Gateway Metrics Filter: ⽹关指标, 提供监控指标
• Forward Routing Filter: ⽤于本地forword, 请求不转发到下游服务器
• LoadBalancer Client Filter: 针对下游服务, 实现负载均衡

GlobalFilter的使用
添加依赖
 org.springframework.boot spring-boot-starter-actuator
添加配置
spring: cloud: gateway: metrics: enabled: truemanagement: endpoints: web: exposure: include: \"*\" endpoint: health: show-details: always shutdown: enabled: true
启动服务并访问

查看所有监控的信息链接

访问“http://127.0.0.1:8888/actuator”,显示所有监控的信息链接