Spring Request Forward Enters the Filter Again
six. Global Filters
The GlobalFilter interface has the same signature as GatewayFilter. These are special filters that are conditionally practical to all routes. (This interface and usage are discipline to change in future milestones).
six.1 Combined Global Filter and GatewayFilter Ordering
When a asking comes in (and matches a Route) the Filtering Web Handler volition add all instances of GlobalFilter and all route specific instances of GatewayFilter to a filter concatenation. This combined filter concatenation is sorted past the org.springframework.cadre.Ordered interface, which can be ready by implementing the getOrder() method or by using the @Gild annotation.
Equally Spring Cloud Gateway distinguishes between "pre" and "post" phases for filter logic execution (see: How It Works), the filter with the highest precedence will be the showtime in the "pre"-phase and the last in the "post"-phase.
ExampleConfiguration.coffee.
@Bean @Order(-1) public GlobalFilter a() { return (exchange, chain) -> { log.info("first pre filter"); return concatenation.filter(exchange).and so(Mono.fromRunnable(() -> { log.info("third post filter"); })); }; } @Bean @Order(0) public GlobalFilter b() { return (exchange, chain) -> { log.info("second pre filter"); return concatenation.filter(exchange).then(Mono.fromRunnable(() -> { log.info("second post filter"); })); }; } @Bean @Lodge(ane) public GlobalFilter c() { return (substitution, chain) -> { log.info("third pre filter"); render chain.filter(substitution).and then(Mono.fromRunnable(() -> { log.info("outset mail filter"); })); }; }
6.2 Forward Routing Filter
The ForwardRoutingFilter looks for a URI in the exchange attribute ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR. If the url has a forward scheme (ie forward:///localendpoint), it will use the Spring DispatcherHandler to handler the request. The path office of the request URL volition be overridden with the path in the forrard URL. The unmodified original url is appended to the list in the ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR attribute.
half dozen.three LoadBalancerClient Filter
The LoadBalancerClientFilter looks for a URI in the exchange attribute ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR. If the url has a lb scheme (ie lb://myservice), it will use the Spring Deject LoadBalancerClient to resolve the name (myservice in the previous instance) to an actual host and port and supercede the URI in the same attribute. The unmodified original url is appended to the list in the ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR attribute. The filter will likewise await in the ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR attribute to see if information technology equals lb and then the same rules utilise.
application.yml.
spring: cloud: gateway: routes: - id: myRoute uri: lb://service predicates: - Path=/service/**
| Note |
|---|---|
| By default when a service case cannot exist found in the |
| Note |
|---|---|
| The |
vi.4 Netty Routing Filter
The Netty Routing Filter runs if the url located in the ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange aspect has a http or https scheme. Information technology uses the Netty HttpClient to make the downstream proxy request. The response is put in the ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR commutation aspect for utilise in a afterwards filter. (There is an experimental WebClientHttpRoutingFilter that performs the same function, but does not crave netty)
six.v Netty Write Response Filter
The NettyWriteResponseFilter runs if at that place is a Netty HttpClientResponse in the ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange attribute. Information technology is run after all other filters have completed and writes the proxy response back to the gateway client response. (There is an experimental WebClientWriteResponseFilter that performs the same function, but does not require netty)
half-dozen.six RouteToRequestUrl Filter
The RouteToRequestUrlFilter runs if at that place is a Route object in the ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR exchange attribute. It creates a new URI, based off of the request URI, just updated with the URI aspect of the Route object. The new URI is placed in the ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange attribute`.
If the URI has a scheme prefix, such as lb:ws://serviceid, the lb scheme is stripped from the URI and placed in the ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR for use later in the filter concatenation.
half dozen.7 Websocket Routing Filter
The Websocket Routing Filter runs if the url located in the ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR substitution attribute has a ws or wss scheme. It uses the Jump Web Socket infrastructure to forward the Websocket asking downstream.
Websockets may be load-balanced past prefixing the URI with lb, such as lb:ws://serviceid.
| Note |
|---|---|
| If you are using SockJS as a fallback over normal http, you should configure a normal HTTP route too equally the Websocket Road. |
application.yml.
leap: cloud: gateway: routes: - id: websocket_sockjs_route uri: http://localhost:3001 predicates: - Path=/websocket/info/** - id: websocket_route uri: ws://localhost:3001 predicates: - Path=/websocket/**
half-dozen.viii Gateway Metrics Filter
To enable Gateway Metrics add together spring-kick-starter-actuator as a project dependency. And then, by default, the Gateway Metrics Filter runs as long as the belongings bound.cloud.gateway.metrics.enabled is not ready to simulated. This filter adds a timer metric named "gateway.requests" with the following tags:
-
routeId: The route id -
routeUri: The URI that the API will be routed to -
result: Effect equally classified by HttpStatus.Series -
condition: Http Status of the request returned to the client
These metrics are and then available to exist scraped from /actuator/metrics/gateway.requests and can be hands integated with Prometheus to create a Grafana dashboard.
| Note |
|---|---|
| To enable the pometheus endpoint add together micrometer-registry-prometheus as a projection dependency. |
6.9 Making An Exchange As Routed
After the Gateway has routed a ServerWebExchange it will mark that exchange as "routed" by calculation gatewayAlreadyRouted to the exchange attributes. In one case a request has been marked as routed, other routing filters will non road the request once more, essentially skipping the filter. There are convenience methods that you can utilize to mark an commutation as routed or check if an exchange has already been routed.
-
ServerWebExchangeUtils.isAlreadyRoutedtakes aServerWebExchangeobject and checks if it has been "routed" -
ServerWebExchangeUtils.setAlreadyRoutedtakes aServerWebExchangeobject and marks information technology equally "routed"
Source: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/multi/multi__global_filters.html
0 Response to "Spring Request Forward Enters the Filter Again"
Post a Comment