概述

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

spring官方文档

image-1655622260779

Spring提供了31种不同的路由过滤器工厂。例如:

image-1655622406444

案例

给所有进入userservice的请求添加一个请求头:gateway=gateway is awesome!

实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: user-service #路由表示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates:
            - Path=/user/** #路径判断,判断路径是否是以/user开头,如果是则符合
        - id: order-service #路由表示,必须唯一
          uri: lb://orderservice # 路由的目标地址
          predicates:
            - Path=/order/** #路径判断,判断路径是否是以/user开头,如果是则符合
          filters:
            - AddRequestHeader=gateway,gateway is awesome!

测试

在order-service的接口中测试:

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId, @RequestHeader String gateway) {
        System.out.println(gateway);
        // 根据id查询订单并返回
        return orderService.queryOrderById(orderId);
    }

重启网关和order-service,访问该接口,可以看到控制台输出:

image-1655622798432

默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下,网关的配置如下:

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: user-service #路由表示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates:
            - Path=/user/** #路径判断,判断路径是否是以/user开头,如果是则符合
        - id: order-service #路由表示,必须唯一
          uri: lb://orderservice # 路由的目标地址
          predicates:
            - Path=/order/** #路径判断,判断路径是否是以/user开头,如果是则符合
      default-filters:
        - AddRequestHeader=gateway,gateway is awesome!

总结

过滤器的作用是什么?

  • 对路由的请求或响应做加工处理,比如添加请求头
  • 配置在路由下的过滤器只对当前路由的请求生效

defaultFilters的作用是什么?

  • 对所有路由都生效的过滤器