Spring Cloud Gateway 全局过滤器

GlobalFilter接口与GatewayFilter具有相同的签名。这些是有条件地应用于所有路线的特殊过滤器。(此界面和用法可能会在未来的里程碑中发生变化)。

组合全局过滤器和GatewayFilter排序

当请求进入(并匹配路由)时,Filtering Web Handler会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链。

这个组合的过滤器链由org.springframework.core.Ordered接口排序,可以通过实现getOrder()方法或使用@Order注释来设置。由于Spring Cloud Gateway区分了过滤器逻辑执行的“前”和“后”阶段(请参阅:工作原理),具有最高优先级的过滤器将是“前”阶段中的第一个和“后”中的最后一个“-相。

ExampleConfiguration.java

@Bean
@Order(-1)
public GlobalFilter a() {
    return (exchange, chain) -> {
        log.info("first pre filter");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("third post filter");
        }));
    };
}

@Bean
@Order(0)
public GlobalFilter b() {
    return (exchange, chain) -> {
        log.info("second pre filter");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("second post filter");
        }));
    };
}

@Bean
@Order(1)
public GlobalFilter c() {
    return (exchange, chain) -> {
        log.info("third pre filter");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("first post filter");
        }));
    };
}

Forward Routing Filter

ForwardRoutingFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果url具有forward方案(即forward:/// localendpoint),它将使用Spring DispatcherHandler处理请求。请求URL的路径部分将被转发URL中的路径覆盖。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中的列表中。

LoadBalancerClient Filter

LoadBalancerClientFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果url具有lb方案(即lb:// myservice),它将使用Spring Cloud LoadBalancerClient将名称(前一示例中的myservice)解析为实际主机和端口,并替换相同属性中的URI。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中的列表中。过滤器还将查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否等于lb,然后应用相同的规则。

application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: myRoute
        uri: lb://service
        predicates:
        - Path=/service/**

默认情况下,在LoadBalancer中找不到服务实例时,将返回503。您可以通过设置spring.cloud.gateway.loadbalancer.use404 = true来配置网关以返回404。

从LoadBalancer返回的ServiceInstance的isSecure值将覆盖在对网关发出的请求中指定的方案。例如,如果请求通过HTTPS进入网关但ServiceInstance指示它不安全,则下游请求将通过HTTP进行。相反的情况也适用。但是,如果为网关配置中的路由指定了GATEWAY_SCHEME_PREFIX_ATTR,则将剥离前缀,并且路由URL中的结果方案将覆盖ServiceInstance配置。

Netty Routing Filter

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性中的URL具有http或https方案,则运行Netty路由过滤器。它使用Netty HttpClient发出下游代理请求。响应放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性中,以便在以后的过滤器中使用。(有一个实验性的WebClientHttpRoutingFilter执行相同的功能,但不需要netty)

Netty Write Response Filter

如果ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性中存在Netty HttpClientResponse,则运行NettyWriteResponseFilter。它在所有其他过滤器完成后运行,并将代理响应写回网关客户端响应。(有一个实验性的WebClientWriteResponseFilter执行相同的功能,但不需要netty)

RouteToRequestUrl Filter

如果ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR交换属性中存在Route对象,则运行RouteToRequestUrlFilter。它根据请求URI创建一个新URI,但使用Route对象的URI属性进行更新。新URI放在ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性`中。如果URI具有方案前缀,例如lb:ws:// serviceid,则lb方案将从URI中剥离并放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR中,以便稍后在过滤器链中使用。

Websocket Routing Filter

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性中的URL具有ws或wss方案,则运行Websocket路由过滤器。它使用Spring Web Socket基础结构将Websocket请求转发到下游。可以通过在URI前面添加lb来对Websockets进行负载平衡,例如lb:ws:// serviceid。

如果您使用SockJS作为普通http的后​​备,则应配置正常的HTTP路由以及Websocket路由。

application.yml

spring:
  cloud:
    gateway:
      routes:
      # SockJS route
      - id: websocket_sockjs_route
        uri: http://localhost:3001
        predicates:
        - Path=/websocket/info/**
      # Normwal Websocket route
      - id: websocket_route
        uri: ws://localhost:3001
        predicates:
        - Path=/websocket/**

Gateway Metrics Filter

要启用Gateway Metrics,请将spring-boot-starter-actuator添加为项目依赖项。然后,默认情况下,只要属性spring.cloud.gateway.metrics.enabled未设置为false,网关指标筛选器就会运行。此过滤器添加名为“gateway.requests”的计时器度量标准,其中包含以下标记:

  • routeId:路由ID
  • routeUri:API将路由到的URI
  • 结果:由HttpStatus.Series分类的结果
  • status:Http返回给客户端的请求状态

然后可以从/actuator/metrics/gateway.requests中删除这些指标,并可以轻松地与Prometheus集成以创建Grafana仪表板。

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

Marking An Exchange As Routed

在Gateway路由了ServerWebExchange之后,它会通过将gatewayAlreadyRouted添加到exchange属性来将该交换标记为“路由”。一旦请求被标记为路由,其他路由过滤器将不会再次路由请求,实质上是跳过过滤器。您可以使用便捷方法将交换标记为路由,或检查交换是否已路由。

ServerWebExchangeUtils.isAlreadyRouted接受ServerWebExchange对象并检查它是否已“路由”

ServerWebExchangeUtils.setAlreadyRouted接受ServerWebExchange对象并将其标记为“路由”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值