7. 全局过滤器
该接口的签名与 .
这些是有条件地应用于所有路由的特殊筛选器。GlobalFilter
GatewayFilter
此接口及其用法在将来的里程碑版本中可能会发生变化。 |
7.1. 组合的全局过滤器和GatewayFilter
排序
当请求与路由匹配时,筛选 Web 处理程序会将 的所有实例和所有特定于路由的实例添加到筛选链中。
此组合的过滤器链按接口排序,您可以通过实现该方法来设置该接口。GlobalFilter
GatewayFilter
org.springframework.core.Ordered
getOrder()
由于 Spring Cloud Gateway 区分了过滤器逻辑执行的“前”和“后”阶段(请参阅它是如何工作的),因此具有最高优先级的过滤器是“前”阶段中的第一个过滤器,而“后”阶段中的最后一个过滤器。
下面的清单配置了一个过滤器链:
@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 将附加到属性中的列表中。ForwardRoutingFilter
ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
forward
forward:///localendpoint
DispatcherHandler
ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
7.3. ReactiveLoadBalancerClientFilter
在 exchange 属性中查找名为 的 URI。
如果 URL 具有方案(例如 ),则它使用 Spring Cloud 将名称(在本例中为)解析为实际的主机和端口,并替换同一属性中的 URI。
未修改的原始 URL 将附加到属性中的列表中。
过滤器还会查看属性以查看它是否等于 。
如果是这样,则适用相同的规则。
下面的清单配置了一个:ReactiveLoadBalancerClientFilter
ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
lb
lb://myservice
ReactorLoadBalancer
myservice
ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR
lb
ReactiveLoadBalancerClientFilter
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: lb://service
predicates:
- Path=/service/**
默认情况下,当 找不到服务实例时,将返回 a。
您可以将网关配置为返回 by 设置 。ReactorLoadBalancer 503 404 spring.cloud.gateway.loadbalancer.use404=true |
从覆盖中返回的值
在向网关发出的请求中指定的方案。
例如,如果请求通过 Gateway 进入,但指示它不安全,则下游请求将通过 发出。
相反的情况也可能适用。
但是,如果在网关配置中为路由指定了前缀,则会去除前缀,并且路由 URL 生成的方案将覆盖配置。isSecure ServiceInstance ReactiveLoadBalancerClientFilter HTTPS ServiceInstance HTTP GATEWAY_SCHEME_PREFIX_ATTR ServiceInstance |
Gateway 支持所有 LoadBalancer 功能。您可以在 Spring Cloud Commons 文档中阅读有关它们的更多信息。 |
7.4. Netty 路由过滤器
如果位于 exchange 属性中的 URL 具有 或 方案,则运行 Netty 路由过滤器。
它使用 Netty 发出下游代理请求。
响应被放入 exchange 属性中,以便在以后的过滤器中使用。
(还有一个实验执行相同的功能,但不需要 Netty。ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
http
https
HttpClient
ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR
WebClientHttpRoutingFilter
7.5. Netty Write 响应过滤器
如果 exchange 属性中有 Netty,则运行。
它在所有其他筛选条件完成后运行,并将代理响应写回网关客户端响应。
(还有一个实验执行相同的功能,但不需要 Netty。NettyWriteResponseFilter
HttpClientResponse
ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR
WebClientWriteResponseFilter
7.6. RouteToRequestUrl
过滤器
如果 exchange 属性中有对象,则运行
它根据请求 URI 创建一个新的 URI,但使用对象的 URI 属性进行更新。
新 URI 将放置在 exchange 属性中。Route
ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR
RouteToRequestUrlFilter
Route
ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
如果 URI 具有 scheme 前缀(如 ),则 scheme 将从 URI 中剥离,并放置在过滤器链中供以后使用。lb:ws://serviceid
lb
ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR
7.7. Websocket 路由过滤器
如果位于 exchange 属性中的 URL 具有 or 方案,则 websocket 路由过滤器将运行。它使用 Spring WebSocket 基础设施将 websocket 请求转发到下游。ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
ws
wss
您可以通过在 URI 前面加上 前缀来对 websockets 进行负载均衡,例如 .lb
lb:ws://serviceid
如果使用 Sockjs 作为普通 HTTP 的后备,则应配置普通 HTTP 路由以及 websocket 路由。 |
下面的清单配置了一个 websocket 路由过滤器:
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.enabled
false
spring.cloud.gateway.requests
-
routeId
:路线 ID。 -
routeUri
:API 路由到的 URI。 -
outcome
:结果,按 HttpStatus.Series 分类。 -
status
:返回给客户端的请求的 HTTP 状态。 -
httpStatusCode
:返回给客户端的请求的 HTTP 状态。 -
httpMethod
:用于请求的 HTTP 方法。
此外,通过属性(默认情况下,设置为 false),您可以使用标记激活额外的量度:spring.cloud.gateway.metrics.tags.path.enabled
-
path
:请求的路径。
要启用 prometheus 终端节点,请添加为项目依赖项。micrometer-registry-prometheus |
7.9. 将 Exchange 标记为 Routed
网关路由 a 后,它通过向 exchange 属性添加 exchange 来将该 exchange 标记为 “routed”。一旦请求被标记为已路由,其他路由过滤器将不会再次路由该请求。
基本上跳过了过滤器。您可以使用一些便捷的方法将交易所标记为已路由
或者检查是否已路由 Exchange。ServerWebExchange
gatewayAlreadyRouted
-
ServerWebExchangeUtils.isAlreadyRouted
获取一个对象并检查它是否已被 “路由”。ServerWebExchange
-
ServerWebExchangeUtils.setAlreadyRouted
获取一个对象并将其标记为 “routed”。ServerWebExchange