Gateway 网关 之 Filter

Filter作用

  在路由转发到代理服务之前和代理服务返回结果之后额外做的事情。Filter执行了说明断言条件通过了

官网文档https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories


Gateway Filter  Factories

1、路由过滤器可用于修改进入进入的 HTTP 请求和 返回的 HTTP 响应,路由过滤器只能指定路由进行使用,SpringCloud内置了很多过滤器,他们有 GatewayFilter 的工厂来生产

2、生命周期:有 pre (类似于前置)   和 post (类似于后置) 两个生命周期,

3、种类: GatewayFilter (单一过滤器 ,官方提供 31个) 和  GlobalFilter (全局过滤器,官方提供 10个),可自行实现

 

在Spring Cloud Gateway的路由中Filter分为内置Filter都是GatewayFilter实现类自定义GlobalFilter

所有内置Filter都实现GatewayFilter接口。使用时filters属性中过滤器名XxxGatewayFilterFactory 命名为 Xxx

如:StripPrefixGatewayFilterFactory 命名为 StripPrefix=1,代表过滤转发地址前缀过滤一节,

 

GatewayFilter 是一个接口,主要实现类

举例:


StripPrefix

spring:
  application:
    name: @artifactId@
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: my-admin

          predcates:
            - Path=/admin/**
          uri: lb://my-admin
          filter:
            - StripPrefix=1

https//gateway-server:port/admin/getXxx,    对应的 断言 /admin 符合断言,

转发地址为:https://gateway-server:port/admion/getXxx,过滤时对转发地址前缀过滤一节   即删除  /person ->   https://gateway-server:port/getXxx

 因为所有路由都需要这样处理,所以可以使用 全局过滤器中处理:

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        
        ServerHttpRequest request = exchange.getRequest();
        
        // 转发忽略第一层 等价于 StripPrefix=1
        String rawPath = request.getURI().getRawPath();
        String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")).skip(1L)
                .collect(Collectors.joining("/"));
        ServerHttpRequest newRequest = request.mutate().path(newPath).build();
        exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());

        return chain.filter(exchange.mutate().request(newRequest.mutate().build()).build());
    }

 


AddRequestHeader

   添加请求头参数,参数和值之间使用逗号分隔

routes:
    filters:
      - AddRequestHeader=X-Request-red, blue

 


AddRequestParameter

  添加请求表单参数,多个参数需要有多个过滤器

filters:
  - AddRequestParameter=app-name,braineex
  - AddRequestParameter=age,123

 


AddResponseHeader

添加响应头

 


DedupeResponseHeader

  对指定响应头去重复

  语法:DedupeResponseHeader=响应头参数  响应头参数,strategy

  可选参数strategy可取值:

  RETAIN_FIRST 默认值,保留第一个

  RETAIN_LAST 保留最后一个

  RETAIN_UNIQUE 保留唯一的,出现重复的属性值,会保留一个。例如有两个My:bbb的属性,最后会只留一个

filters:
  - DedupeResponseHeader=My Content-Type,RETAIN_UNIQUE

 


CircuitBreaker

  实现熔断时使用,支持CircuitBreaker和Hystrix两种

 


FallbackHeaders

  可以添加降级时的异常信息

 


PrefixPath

  匹配所有前缀满足条件的URI

 

 


RequestRateLimiter

  限流过滤器。

 


RedirectTo 

  重定向。有两个参数,status和url。其中status应该300系列重定向状态码

 


RemoveRequestHeader

  删除请求头参数

 


RemoveResponseHeader 

  删除响应头参数

 


RemoveRequestParameter 

  删除请求参数

 


RewritePath 

  重写请求路径

 


RewriteResponseHeader 

  重写响应头参数

 


SaveSession 

  如果项目中使用Spring Security和Spring Session整合时,此属性特别重要

 


SecureHeaders 

  具有权限验证时,建议的头信息内容

 


SetPath 

  功能和StripPrefix有点类似。语法更贴近restful,

当前请求路径为/red/blue时会将/blue发送给下游

predicates:
  - Path=/red/{segment}
filters:
  - SetPath=/{segment}

 


SetRequestHeader 

  替换请求参数头数。不是添加

 


SetResponseHeader 

  替换响应头参数

 


SetStatus 

  设置响应状态码

 


StripPrefix 

  跳过路由uri中前几段后发送给下游

 


Retry

  设置重试次数

 


RequestSize 

  请求最大大小。包含maxSize参数,可以有单位“KB”或“MB”默认为“B”,比如设置上传大小限制

 


ModifyRequestBody 

  修改请求体内容,不建议使用

 


ModifyResponseBody 

  修改响应体,不建议使用

 

如:过滤器工厂会在匹配上的请求头中加入一个请求头,名称为:X-Request-Id,值为:1024

- AddRequestHeader=X-Request-Id, 1024

 

 >>>>>>>>>>>>> 下一篇 :https://www.cnblogs.com/chxlay/p/15150543.html <<<<<<<<<<<<<<<<<<

 
posted @ 2021-08-17 00:01  Vermeer  阅读(672)  评论(0)    收藏  举报