Global Filter接口与GatewayFilter具有相同的签名。这些是有条件地应用于所有路由的特殊过滤器。(此接口和用法在未来里程碑里有可能改变)
Combined Global Filter and GatewayFilter Ordering
当请求进入(并匹配路由)时,Filtering Web Handler会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链。此组合过滤器链通过org.springframework.core.Ordered接口进行排序。可以通过实现getOrder()方法或者使用@Order注解。
由于Spring Cloud Gateway区分了过滤器逻辑执行的“请求”和“响应”阶段(请参阅:第三章),具有最高优先级的过滤器将是“请求”阶段的第一个和“响应”阶段的最后一个 。
ForwardRoutingFilter 查找一个URI在exchange的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR属性中。如果url具有forward方案(即forward:// localendpoint),它将使用Spring DispatcherHandler处理请求。请求URL的路径部分将被转发URL中的路径覆盖。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中的列表中。
说明: Forward Routing Filter处理forward前缀的url;Netty Routing Filter处理http或https前缀的url。
LoadBalancerClientFilter在exchange 属性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,然后应用相同的规则。
默认情况下,在LoadBalancer中找不到服务实例时,将返回503。 您可以通过设置spring.cloud.gateway.loadbalancer.use404 = true来配置网关以返回404。
从LoadBalancer返回的ServiceInstance的isSecure值将覆盖在对网关发出的请求中指定的方案。 例如,如果请求通过HTTPS进入网关但ServiceInstance指示它不安全,则下游请求将通过HTTP进行。 相反的情况也适用。 但是,如果为网关配置中的路由指定了GATEWAY_SCHEME_PREFIX_ATTR,则将剥离前缀,并且路由URL中的结果方案将覆盖ServiceInstance配置。
如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange 属性中的URL具有http或https方案,则运行Netty路由过滤器。 它使用Netty HttpClient发出下游代理请求。 响应放在exchange中的ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR属性中,以便在以后的过滤器中使用。 (有一个实验性的WebClientHttpRoutingFilter执行相同的功能,但不需要netty)
如果exchange中存放ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR 属性存在Netty HttpClientResponse,则运行NettyWriteResponseFilter。 它在所有其他过滤器完成后运行,并将代理响应写回网关客户端响应。 (有一个实验性的WebClientWriteResponseFilter执行相同的功能,但不需要netty)
说明:1.我看到源码中,判断是CLIENT_RESPONSE_CONN_ATTR属性存在,而不是CLIENT_RESPONSE_ATTR 属性。
2.网关对于客户端其实是服务代理,网关对于服务端是客户代理。
Netty Routing Filter相当于是客户端代理,访问服务端,获取响应信息;
Netty Write Response Filter相当于服务端代理,客户访问时,将服务端返回的信息写会给客户端。
如果在exchange中ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR 属性存在Route对象,则运行RouteToRequestUrlFilter。 它根据请求URI创建一个新URI,但使用Route对象的URI属性进行更新。 新URI放在exchange的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 属性中。
如果URI具有前缀,例如lb:ws:// serviceid,则lb方案将从URI中剥离并放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR中,以便稍后在过滤器链中使用。
说明:将客户端请求对象中获取的URI根据路由表中URI加工为访问服务端的URI。另外,其他路径加工过滤器在此之前已经加工完成,所以新增过滤器时,如果涉及到修改请求URI的,最好在此路由之前进行,此路由order=10000。
如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中的URL具有ws或wss方案,则运行Websocket路由过滤器。 它使用Spring Web Socket基础结构将Websocket请求转发到下游。
可以通过在URI前面添加lb来对Websockets进行负载平衡,例如lb:ws:// serviceid。
如果您使用SockJS作为普通HTTP的fallback,则应配置正常的HTTP路由以及Websocket路由。
要启用Gateway Metrics,请将spring-boot-starter-actuator添加为项目依赖项。 然后,默认情况下,只要属性spring.cloud.gateway.metrics.enabled未设置为false,Gateway Metrics Filter就会运行。 此过滤器添加名为“gateway.requests”的计时器度量标准,其中包含以下标记:
routeId:路由id
routeUri: API被路由的URI
outcome: 由HttpStatus.Series分类的结果
status: 请求返回客户端的状态Http Status
httpStatusCode: 请求返回客户端的状态Http Status
httpMethod:Http 请求方法
然后可以从/actuator/metrics/gateway.requests中删除这些指标,并可以轻松地与Prometheus集成以创建Grafana dashboard。
要启用pometheus端点,请将micrometer-registry-prometheus添加为项目依赖项。
在Gateway路由了ServerWebExchange之后,它会通过将gatewayAlreadyRouted添加到exchange属性来将该exchange标记为“路由”。 一旦请求被标记为路由,其他路由过滤器将不会再次路由请求,实质上是跳过过滤器。 您可以使用便捷方法将exchange标记为路由,或检查exchange 是否已路由。
ServerWebExchangeUtils.isAlreadyRouted接受ServerWebExchange对象并检查它是否已“路由”。
ServerWebExchangeUtils.setAlreadyRouted接受ServerWebExchange对象并将其标记为“路由”。