目录
AddRequestHeader GatewayFilter Factory
AddRequestHeadersIfNotPresent GatewayFilter Factory
AddResponseHeader GatewayFilter Factory
RemoveRequestHeader GatewayFilter Factory
RemoveResponseHeader GatewayFilter Factory
RequestRateLimiter GatewayFilter Factory
RequestSize GatewayFilter Factory
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: 8888 spring: 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")
@RestController
public 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: 8888 spring: 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")
@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
GlobalFilter是Spring Cloud Gateway中的全局过滤器, 它和GatewayFilter的作⽤是相同的.
GlobalFilter 会应⽤到所有的路由请求上, 全局过滤器通常⽤于实现与安全性, 性能监控和⽇志记录等相关的全局功能.
Spring Cloud Gateway 内置的全局过滤器也有很多, ⽐如:
• Gateway Metrics Filter: ⽹关指标, 提供监控指标
• Forward Routing Filter: ⽤于本地forword, 请求不转发到下游服务器
• LoadBalancer Client Filter: 针对下游服务, 实现负载均衡
GlobalFilter的使用
添加依赖
<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”,显示所有监控的信息链接