【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
举个栗子:

当用户向网关发起请求时,它到底经历了什么?

首先是路由,我们有一个断言工厂,它可以基于我们配置的规则完成 请求路由,判断这个请求到底要去向哪个微服务
但是路由之后,并不是立即就向微服务发起请求的

在网关里面,我们还可以路由配置各种各样的过滤器
这些过滤器会形成一个 过滤器链,

用户的请求一定要经过这个过滤器链,才能到达微服务
那么在这个过程中,过滤器就可以对用户的请求做各种的处理,【请求头处理、参数处理…】
当微服务处理完成后,会返回一个结果,这个结果也是先到达网关,而且同样的也会经过过滤器链,来逐层处理【各种各样的处理】微服务响应的结果,最终才会返回给用户
【所以具体能做什么样的处理?】
Spring提供了31种不同的路由过滤器工厂。【当然现在可能也不止了】例如:
| 名称 | 说明 |
|---|---|
| AddRequestHeader | 给当前请求添加一个请求头 |
| RemoveRequestHeader | 移除请求中的一个请求头 |
| AddResponseHeader | 给响应结果中添加一个响应头 |
| RemoveResponseHeader | 从响应结果中移除有一个响应头 |
| RequestRateLimiter | 限制请求的流量 |
| … |
Spring 官网 https://docs.spring.io/spring-cloud-gateway/docs/3.1.4/reference/html/#gatewayfilter-factories
OK, 现在【2022年10月29日】有34 种了
给所有进入userservice的请求添加一个请求头
给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

直接干
filters:
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

OK, 直接重启网关服务

在user服务中,简单验证一下
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
@RequestHeader(value = "Truth",required = false) String truth) {
System.out.println("truth : " + truth);
return userService.queryById(id);
}

重启user 服务

直接测试

查看日志

OK, 没毛病
【如果我现在想给所有的微服务都加上这个请求头】
所有微服务都复制一份配置,显然是不合理的,
【默认过滤器】
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

直接干
default-filters:
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

重启网关服务

先来两次user 请求

查看日志

OK,8081和8082 一个接了一个,而且两次都打印了请求头信息【没毛病】
这里同样的方式给order 服务加上一个打印信息
package cn.itcast.order.web;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,@RequestHeader(value = "Truth",required = false) String truth) {
// 根据id查询订单并返回
System.out.println(truth);
return orderService.queryOrderById(orderId);
}
}

OK, 重启一下order 服务,测试

没毛病,这就是所有都加上了
①对路由的请求或响应做加工处理,比如添加请求头
②配置在路由下的过滤器只对当前路由的请求生效
①对所有路由都生效的过滤器