Spring Gateway断言工厂与过滤器工厂

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Gateway断言工厂与过滤器工厂相关的知识,希望对你有一定的参考价值。

文章目录

1.断言工厂

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如下面的断言:

Path=/user/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,进入源码我们能看到他对路径字符串的一系列处理

像这样的断言工厂在SpringCloudGateway还有十几个:

名称说明示例
After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-Id, \\d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/red/segment,/blue/**
Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

我们也都可以追踪到源码,例如AfterRoutePredicateFactory

其他断言配置可以参考这一篇博文

Gateway(四)Spring Cloud Gateway过滤器(GatewayFilter)工厂
链接:https://blog.csdn.net/zhuocailing3390/article/details/123151458

2.过滤器工厂

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

当有请求访问时,gateway网关回对请求路由做层层的过滤筛选,之后才能传达到微服务。

过滤器的作用:

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

2.1.路由过滤器的种类

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

例如下面几个常用的:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

2.2.1 AddRequestHeader

需求:给所有进入userservice的请求添加一个请求头:Truth=yyl is good!

只需要修改gateway服务的application.yml文件,添加路由过滤即可:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/** 
        filters: # 过滤器
        - AddRequestHeader=Truth,yyl is good! # 添加请求头

当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。

我们在controller里加上获取请求头的代码

@GetMapping("/id")
public User queryById(@PathVariable("id") Long id,@RequestHeader("Truth") String truth) 
    System.out.println("truth="+truth);
    return userService.queryById(id);

重启服务器,请求查看打印结果:

下面的配置就不一 一进行测试了,只展示结果

2.2.2 RemoveRequestHeader

RemoveRequestHeader是一个header名称的参数,它是要删除的标头的名称。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
            - RemoveRequestHeader=Color

配置为:在请求中,设置需要删除的header名称;然后过滤器将该header信息在传递到下游服务之前将其删除。

2.2.3 SetRequestHeader

SetRequestHeader由两个参数组成:第一个是header名称,第二个是header值。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
            - SetRequestHeader=Color, Blue

配置为:SetRequestHeader将替换原有的header名称的值,在请求的header中,设置name为Color,value为blue;然后过滤器将该header的原有Value值替换为blue再传递到下游的header中。

2.2.4 AddRequestParameter

AddRequestParameter由两个参数组成:第一个是参数的名称,第二个是参数的值。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
        	- AddRequestParameter=color, blue

配置为:在请求时,网关过滤器中新增一组name为color,value为blue的参数;然后过滤器将该组参数传递到下游服务中。

2.2.5 RemoveRequestParameter

RemoveRequestParameter是一个指定参数名称的参数,它是要删除的查询参数的名称。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
        	- RemoveRequestParameter=color

配置为:在请求中,设置需要删除的参数名称;然后过滤器将该参数信息在传递到下游服务之前将其删除。

2.2.6 AddResponseHeader

AddResponseHeader由两个参数组成:第一个是header名称,第二个是header值。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
     	   - AddResponseHeader=Color, Blue

配置为:设置name为Color,value为Blue;然后过滤器将该header信息传递到下游服务的响应header中。

2.2.7 RemoveResponseHeader

RemoveResponseHeader是一个header名称的参数,它是要在响应时被删除的标头的名称。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
            - RemoveResponseHeader=Color

配置为:在请求中,设置需要删除的header名称;然后过滤器将该header信息在返回到网关客户端之前从响应中删除标头。

2.2.8 SetResponseHeader

SetResponseHeader由两个参数组成:第一个是header名称,第二个是新的header值。
yaml配置:

spring:
  cloud:
    gateway:
	   routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
            - SetRequestHeader=Color, Blue

配置为:SetResponseHeader将替换原有的header名称的值,在请求的header中,设置name为Color,value为Blue;然后过滤器将该header信息在返回到网关客户端之前把原有Value值替换为Blue。

2.3.默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/**
      default-filters: # 默认过滤项
      - AddRequestHeader=Truth,yyl is good! 

以上是关于Spring Gateway断言工厂与过滤器工厂的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Gateway 服务网关详解

Spring Cloud —— Gateway 服务网关

Gateway配置介绍

Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析

Spring Cloud Gateway 内置的过滤器工厂

Spring Cloud Gateway 2 断言