7. 全局过滤器

该接口的签名与 . 这些是有条件地应用于所有路由的特殊筛选器。GlobalFilterGatewayFilterspring-doc.cn

此接口及其用法在将来的里程碑版本中可能会发生变化。

7.1. 组合的全局过滤器和GatewayFilter排序

当请求与路由匹配时,筛选 Web 处理程序会将 的所有实例和所有特定于路由的实例添加到筛选链中。 此组合的过滤器链按接口排序,您可以通过实现该方法来设置该接口。GlobalFilterGatewayFilterorg.springframework.core.OrderedgetOrder()spring-doc.cn

由于 Spring Cloud Gateway 区分了过滤器逻辑执行的“前”和“后”阶段(请参阅它是如何工作的),因此具有最高优先级的过滤器是“前”阶段中的第一个过滤器,而“后”阶段中的最后一个过滤器。spring-doc.cn

下面的清单配置了一个过滤器链:spring-doc.cn

例 56.ExampleConfiguration.java
@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("custom global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

7.2. 正向路由过滤器

在 exchange 属性 中查找 URI 。 如果 URL 具有方案(例如 ),则它使用 Spring 来处理请求。 请求 URL 的 path 部分被转发 URL 中的路径覆盖。 未修改的原始 URL 将附加到属性中的列表中。ForwardRoutingFilterServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTRforwardforward:///localendpointDispatcherHandlerServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTRspring-doc.cn

7.3. ReactiveLoadBalancerClientFilter

在 exchange 属性中查找名为 的 URI。 如果 URL 具有方案(例如 ),则它使用 Spring Cloud 将名称(在本例中为)解析为实际的主机和端口,并替换同一属性中的 URI。 未修改的原始 URL 将附加到属性中的列表中。 过滤器还会查看属性以查看它是否等于 。 如果是这样,则适用相同的规则。 下面的清单配置了一个:ReactiveLoadBalancerClientFilterServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTRlblb://myserviceReactorLoadBalancermyserviceServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTRServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTRlbReactiveLoadBalancerClientFilterspring-doc.cn

例 57.application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: myRoute
        uri: lb://service
        predicates:
        - Path=/service/**
默认情况下,当 找不到服务实例时,将返回 a。 您可以将网关配置为返回 by 设置 。ReactorLoadBalancer503404spring.cloud.gateway.loadbalancer.use404=true
从覆盖中返回的值 在向网关发出的请求中指定的方案。 例如,如果请求通过 Gateway 进入,但指示它不安全,则下游请求将通过 发出。 相反的情况也可能适用。 但是,如果在网关配置中为路由指定了前缀,则会去除前缀,并且路由 URL 生成的方案将覆盖配置。isSecureServiceInstanceReactiveLoadBalancerClientFilterHTTPSServiceInstanceHTTPGATEWAY_SCHEME_PREFIX_ATTRServiceInstance
Gateway 支持所有 LoadBalancer 功能。您可以在 Spring Cloud Commons 文档中阅读有关它们的更多信息。

7.4. Netty 路由过滤器

如果位于 exchange 属性中的 URL 具有 或 方案,则运行 Netty 路由过滤器。 它使用 Netty 发出下游代理请求。 响应被放入 exchange 属性中,以便在以后的过滤器中使用。 (还有一个实验执行相同的功能,但不需要 Netty。ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTRhttphttpsHttpClientServerWebExchangeUtils.CLIENT_RESPONSE_ATTRWebClientHttpRoutingFilterspring-doc.cn

7.5. Netty Write 响应过滤器

如果 exchange 属性中有 Netty,则运行。 它在所有其他筛选条件完成后运行,并将代理响应写回网关客户端响应。 (还有一个实验执行相同的功能,但不需要 Netty。NettyWriteResponseFilterHttpClientResponseServerWebExchangeUtils.CLIENT_RESPONSE_ATTRWebClientWriteResponseFilterspring-doc.cn

7.6. RouteToRequestUrl 过滤器

如果 exchange 属性中有对象,则运行 它根据请求 URI 创建一个新的 URI,但使用对象的 URI 属性进行更新。 新 URI 将放置在 exchange 属性中。RouteServerWebExchangeUtils.GATEWAY_ROUTE_ATTRRouteToRequestUrlFilterRouteServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTRspring-doc.cn

如果 URI 具有 scheme 前缀(如 ),则 scheme 将从 URI 中剥离,并放置在过滤器链中供以后使用。lb:ws://serviceidlbServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTRspring-doc.cn

7.7. Websocket 路由过滤器

如果位于 exchange 属性中的 URL 具有 or 方案,则 websocket 路由过滤器将运行。它使用 Spring WebSocket 基础设施将 websocket 请求转发到下游。ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTRwswssspring-doc.cn

您可以通过在 URI 前面加上 前缀来对 websockets 进行负载均衡,例如 .lblb:ws://serviceidspring-doc.cn

如果使用 Sockjs 作为普通 HTTP 的后备,则应配置普通 HTTP 路由以及 websocket 路由。

下面的清单配置了一个 websocket 路由过滤器:spring-doc.cn

例 58.application.yml
spring:
  cloud:
    gateway:
      routes:
      # SockJS route
      - id: websocket_sockjs_route
        uri: http://localhost:3001
        predicates:
        - Path=/websocket/info/**
      # Normal Websocket route
      - id: websocket_route
        uri: ws://localhost:3001
        predicates:
        - Path=/websocket/**

7.8. Gateway Metrics 过滤器

要启用网关指标,请将spring-boot-starter-actuator添加为项目依赖项。然后,默认情况下,只要该属性未设置为 ,网关指标筛选条件就会运行。此筛选条件添加一个以以下标签命名的计时器指标:spring.cloud.gateway.metrics.enabledfalsespring.cloud.gateway.requestsspring-doc.cn

此外,通过属性(默认情况下,设置为 false),您可以使用标记激活额外的量度:spring.cloud.gateway.metrics.tags.path.enabledspring-doc.cn

然后,可以从中抓取这些指标,并且可以轻松地与 Prometheus 集成以创建 Grafana 仪表板/actuator/metrics/spring.cloud.gateway.requestsspring-doc.cn

要启用 prometheus 终端节点,请添加为项目依赖项。micrometer-registry-prometheus

7.9. 将 Exchange 标记为 Routed

网关路由 a 后,它通过向 exchange 属性添加 exchange 来将该 exchange 标记为 “routed”。一旦请求被标记为已路由,其他路由过滤器将不会再次路由该请求。 基本上跳过了过滤器。您可以使用一些便捷的方法将交易所标记为已路由 或者检查是否已路由 Exchange。ServerWebExchangegatewayAlreadyRoutedspring-doc.cn

  • ServerWebExchangeUtils.isAlreadyRouted获取一个对象并检查它是否已被 “路由”。ServerWebExchangespring-doc.cn

  • ServerWebExchangeUtils.setAlreadyRouted获取一个对象并将其标记为 “routed”。ServerWebExchangespring-doc.cn