Tipos de filtros de Spring Cloud Gateway

GatewayFilterSpring Cloud Gateway se divide en y según el alcanceGlobalFilter

Introducción al sitio web oficial de SpringCloud-gataway

El papel y el ciclo de vida del filtro.

Desde el punto de flujo de trabajo del filtro, podemos saber que el filtro juega un papel muy importante. El filtro de tipo "pre" puede realizar verificación de parámetros, verificación de permisos, monitoreo de tráfico, salida de registros, conversión de protocolo, etc., y el filtro de tipo "post". can do El servidor puede modificar el contenido de la respuesta, los encabezados de la respuesta, la salida del registro, el monitoreo del tráfico, etc.

efecto

Los filtros de puerta de enlace se utilizan para interceptar y procesar solicitudes web en cadena, lo que puede lograr requisitos transversales no relacionados con las aplicaciones, como autenticación , limitación de corriente, salida de registro, etc.

ciclo vital

Spring Cloud Gateway es similar a zuul, con filtros "pre" y "post". La solicitud del cliente primero pasa por el filtro de tipo "pre" y luego reenvía la solicitud a un servicio comercial específico, como el servicio de usuario en la figura anterior. Después de recibir la respuesta del servicio comercial, pasa por el " post" procesamiento de filtro de tipo y, finalmente, devolver respuesta al cliente. El filtro se puede dividir en otros dos tipos según su alcance: uno es el filtro de puerta de enlace para una sola ruta. Su método de escritura en el archivo de configuración es similar al de predicción; el otro es el filtro de puerta de enlace global para todas las rutas.

Filtro de puerta de enlace Filtro de puerta de enlace

Los filtros permiten modificar de alguna manera las solicitudes HTTP entrantes o las respuestas HTTP salientes. Los filtros se pueden limitar a determinadas rutas de solicitud. Puede realizar requisitos transversales que no tienen nada que ver con las aplicaciones, como: seguridad, configuración de tiempo de espera de acceso, etc. Modifique las solicitudes HTTP entrantes o las respuestas HTTP salientes. Spring Cloud Gateway contiene muchas fábricas de filtros de puerta de enlace integradas, 22 en total. Incluyendo filtros de encabezado, filtros de ruta, filtros Hystrix y filtros que reescriben las URL de solicitud, así como otros tipos de filtros como parámetros y códigos de estado. Según el propósito del proyecto de filtro, se puede dividir en los siguientes tipos: encabezado, parámetro, ruta, cuerpo, estado, sesión, redirección, reintento, RateLimiter e Hystrix. Spring Cloud Gateway incluye muchas fábricas GatewayFilter integradas.

La fábrica GatewayFilter es similar a la fábrica Predicate presentada en el artículo anterior. Se configuran en el archivo de configuración application.yml. Siguen la idea de que la convención es mayor que la configuración. Solo necesita configurar el nombre de la fábrica GatewayFilter en el archivo de configuración en lugar de escribir el nombre completo de la clase. Por ejemplo, AddRequestHeaderGatewayFilterFactory solo necesita escribir AddRequestHeader en el archivo de configuración, no el nombre completo de la clase. La fábrica GatewayFilter configurada en el archivo de configuración eventualmente será procesada por la clase de fábrica de filtros correspondiente.

1. Agregar encabezado de solicitud

1. Descripción

1. Se utiliza para 添加proporcionar encabezados de solicitud a servicios posteriores,
2. Admite variables uri

2. Parámetros

1.: namePasar la clave del encabezado de la solicitud al servicio descendente
. 2 value.: Pasar el valor del encabezado de la solicitud al servicio descendente.

3. Ejemplo

1. Método 1. Agregar un encabezado de solicitud fijo

spring:
  cloud:
    nacos:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddRequestHeader=x-token,xxxxx

x-tokenIndica que se pasará un encabezado de solicitud al servicio descendente y el valor esxxxxx

2. Agregue encabezados de solicitud dinámicos con variables uri

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-02
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne/{productId}
          filters:
            - AddRequestHeader=x-token,xxxxx-{productId}

x-tokenIndica que se pasará un encabezado de solicitud al servicio descendente y el valor esxxxxx-匹配上的productId的值

2、Agregar parámetro de solicitud

1. Descripción

Se utiliza para agregar un parámetro de solicitud al servicio descendente.

2. Parámetros

1.: nameClave de parámetro agregada
2 value.: Valor de parámetro agregado, que puede admitir Ruta o Hosturi variables

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddRequestParameter=username,zhangsan

Agregue un parámetro de solicitud username= al servicio descendentezhangsan

3、Agregar encabezado de respuesta

1. Descripción

Agrega un encabezado de respuesta a la respuesta posterior.

2. Parámetros

1 name.: La clave del encabezado de respuesta agregado.
2 value.: El valor del encabezado de respuesta agregado, que puede admitir Ruta o Host.uri variables

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - AddResponseHeader=encryption,false

Agregue un encabezado de respuesta encryption= a la respuesta del servicio descendentefalse

4、Encabezado de respuesta de deduplicación

1. Descripción

Eliminar encabezados de solicitud duplicados

2. Parámetros

1 name.: Encabezados de respuesta duplicados que deben eliminarse, varios 空格separados por
2 strategy.: Cuando se repite, la estrategia de eliminación, la predeterminada es RETAIN_FIRST, es decir, conservar el primer encabezado.

  1. RETAIN_FIRST: retiene el primer valor
  2. RETAIN_LAST: retiene el último valor
  3. RETAIN_UNIQUE: conserva todos los valores únicos

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - DedupeResponseHeader=x-token Access-Control-Allow-Credentials Access-Control-Allow-Origin,RETAIN_FIRST

Elimina los encabezados de respuesta duplicados especificados anteriormente y conserva el primero que aparece.

5、Encabezado de solicitud de mapa

1. Descripción

Agrega fromHeaderel valor del parámetro al toHeaderparámetro.

  1. Si fromHeader no existe en el encabezado, no tiene ningún efecto.

  2. fromHeader existe

  3.  toHeader 存在,那么往配置中 toHeader 对应的 header 中追加 fromHeader对应的值 
    
    
    
  4. toHeader 不存在,那么往 header 中增加一个header ,key: 配置中的toHeader的值,value: fromHeader 在header中的值
    
    
    

2. Parámetros

1 .: El valor fromHeaderobtenido de los parámetros de solicitud 2 .: Establezca un encabezado, la clave es el valor de toheader, el valor es el valor de fromHeaderheader
toHeaderheader

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - MapRequestHeader=from-header,x-token

Es decir, se agregará a la solicitud un x-tokenencabezado con una clave de y un header 中 from-headervalor correspondiente a . (Hay muchas situaciones, consulte la descripción )

6 、 Prefijo

1. Descripción

Para la ruta coincidente, agregue un prefijo al reenviarla al servicio descendente.prefix

2. Parámetros

1.: prefixPrefijo de ruta que debe agregarse

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/findOne
          filters:
            - PrefixPath=/product

Acceda a http:// gateway ip:port/findOne ⇒ Reenvíe a la dirección de servicio descendente http://product-provider/product /findOne con un prefijo agregado.

7、PreservarHostHeader

1. Descripción

Significa que cuando Spring Cloud Gateway reenvía la solicitud, mantiene la Hostinformación del cliente sin cambios y luego la pasa al servidor descendente.

2. Parámetros

sin parámetros

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - PreserveHostHeader

8、Eliminar encabezado de solicitud

1. Descripción

Eliminar parámetros de los encabezados de solicitud

2. Parámetros

1.: nameSolicitar encabezados que deben eliminarse

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveRequestHeader=x-token

9、Eliminar encabezado de respuesta

1. Descripción

Eliminar encabezados de respuesta

2. Parámetros

1.: nameEncabezados de respuesta que deben eliminarse

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveResponseHeader=x-token

9、Eliminar parámetro de solicitud

1. Descripción

Elimine el parámetro de solicitud y, al pasarlo al servicio descendente, este parámetro no aparecerá.

2. Parámetros

1.: nameSolicitar parámetros que deben eliminarse

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - RemoveRequestParameter=password

10、Reescribir ruta

1. Descripción

Realizar reescritura de rutas basadas en expresiones regulares.

2. Parámetros

1 regexp.: Expresión regular coincidente
2 replacement.: Cadena que debe reemplazarse
Nota:
1. En ymlla configuración , $debe escribirse como $\
2. La regla de reemplazo de ruta es:path.replaceAll(regexp,replacement)

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/admin/product/findOne
          filters:
            - RewritePath=/admin(?<segment>/?.*), $\{segment} # 当访问/admin/product/findOne 将会替换成 /product/findOne

Acceda a /admin/product/findOne en la página ⇒ La ruta al servicio descendente es/product/findOne

11、Prefijo de tira

1. Descripción

Elimine el prefijo de ruta, por ejemplo, acceda a: /admin/aa/bb/cc. Si la dirección real del servidor descendente es /bb/cc, puede utilizar esta implementación.

2. Parámetros

1.: partsDespués de separar la ruta solicitada de acuerdo con /la separación, la parte que debe omitirse comienza desde 1.

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/admin/product/findOne
          filters:
            - StripPrefix=1 # 当访问/admin/product/findOne 将会替换成 /product/findOne

Acceda a /admin/product/findOne en la página ⇒ La ruta al servicio descendente es/product/findOne

12 、 Tamaño de solicitud

1. Descripción

Configure el tamaño del cuerpo de la solicitud. Cuando el cuerpo de la solicitud sea demasiado grande, se devolverá 413 Payload Too Large.

2. Parámetros

1. maxSize:El ​​tamaño del cuerpo de la solicitud.

3. Ejemplo

spring:
  cloud:
    gateway:
      routes:
        - id: product-provider-01
          uri: lb://product-provider
          predicates:
            - Path=/product/findOne
          filters:
            - name: RequestSize
              args:
                maxSize: 1B

Esto debe filters[index].args.maxSizeconfigurarse; de ​​lo contrario, no tendrá efecto.

13、ModificarSolicitudCuerpo

1. Descripción

Modifique el valor pasado al servicio descendente RequestBody. Por ejemplo, todos nuestros servicios que pasan a través de la puerta de enlace deben pasar el nombre de usuario actual y los permisos de datos del usuario al llegar al servicio descendente. Puede usar esto en este momento.

2. Requisitos:

Modifique los parámetros del servicio original, agregue usernamey rolespase parámetros al servicio posterior.

3. La configuración de enrutamiento solo se puede configurar mediante código Java

@Configuration
public class RouteConfig {
 
    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("product-provider", predicateSpec -> predicateSpec.path("/product/modifyRequestBody")
                        .filters(gatewayFilterSpec -> gatewayFilterSpec.modifyRequestBody(String.class, Map.class, MediaType.APPLICATION_JSON_VALUE, (exchange, s) -> {
                            Map<String, Object> params = new HashMap<>(16);
                            params.put("old", s);
                            params.put("username", "v_huan");
                            params.put("roles", "ROLE_ADMIN");
                            return Mono.just(params);
                        })).uri("lb://product-provider")).build();
    }
}

filtro global

El filtro global no necesita configurarse en el archivo de configuración y actúa en todas las rutas. Finalmente se empaqueta en un filtro reconocido por GatewayFilterChain a través de GatewayFilterAdapter. Es el filtro central que convierte el URI del negocio y el enrutamiento solicitados en reales. dirección de solicitud de servicio empresarial. No es necesario configurarlo para que se cargue durante la inicialización del sistema y se aplicará a cada ruta.

Cuando una solicitud coincide con una ruta, todos los filtros globales (GlobalFilter) y GatewayFilters coincidentes con la ruta se combinarán en una cadena de filtros, y las reglas de clasificación se ordenarán según Spring's Ordered.
GlobalFilter tiene dos fases de ejecución: previa y posterior: cuanto mayor sea la prioridad, antes se ejecutará la fase previa y más tarde se ejecutará la fase posterior.
Escribir un filtro global requiere implementar la interfaz GlobalFilter

Los siguientes son los filtros globales integrados de Gateway, que han entrado en vigor en todas las rutas.

Spring Cloud Gateway se divide en GatewayFilter y GlobalFilter según su alcance. Las diferencias entre los dos son las siguientes:

  • GatewayFilter: debe configurarse bajo una ruta específica a través de spring.cloud.routes.filters, que solo actúa en la ruta actual, o configurarse globalmente a través de spring.cloud.default-filters, que actúa en todas las rutas.
  • GlobalFilter: un filtro global que no necesita configurarse en el archivo de configuración. Actúa en todas las rutas. Finalmente se empaqueta en un filtro reconocido por GatewayFilterChain a través de GatewayFilterAdapter. Convierte el URI del negocio y el enrutamiento solicitados en la dirección de solicitud. del servicio empresarial real. El filtro central no requiere configuración. Se carga durante la inicialización del sistema y actúa en cada ruta.

Referencia: https://www.jianshu.com/p/394e11981692 Spring Cloud Gateway

Supongo que te gusta

Origin blog.csdn.net/caidingnu/article/details/129420242
Recomendado
Clasificación