Spring Cloud Gateway核心全局過濾器
概述
GlobalFilter接口與GatewayFilter具有相同的簽名。這些是特殊的過濾器,有條件地應用于所有路由。
在未來的里程碑版本中,此接口及其使用可能會發生更改。
GlobalFilter攔截式的契約,Web請求的鏈式處理,可用于實現橫切、應用程序無關的需求,如Security、Timeout等。?
組合全局過濾器和網關過濾器
當請求匹配路由時,過濾web處理程序將GlobalFilter的所有實例和GatewayFilter的所有特定路由實例添加到過濾器鏈中。這個組合過濾器鏈是由org.springframework.core.Ordered接口排序的,你可以通過實現getOrder()方法來設置它。
由于Spring Cloud Gateway區分了過濾器邏輯執行的“前”和“后”階段(參見它的工作原理),優先級最高的過濾器是“前”階段的第一個過濾器,是“后”階段的最后一個過濾器。
下面的代碼清單配置了過濾器鏈:?
Forward Routing Filter
ForwardRoutingFilter在交換屬性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果URL是前向模式(例如forward:///xxxx),它會使用Spring DispatcherHandler來處理請求。請求URL中的路徑部分被前向URL中的路徑覆蓋。未修改的原始URL被附加到ServerWebExchangeUtils中的列表中ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR屬性。
負載均衡過濾器
ReactiveLoadBalancerClientFilter在名為ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR的exchange屬性中查找URI。如果URL具有lb模式(例如lb://myservice),它會使用Spring Cloud ReactorLoadBalancer將名稱(在本例中是myservice)解析為實際的主機和端口,并替換相同屬性中的URI。未修改的原始URL被附加到ServerWebExchangeUtils中的列表中GATEWAY_ORIGINAL_REQUEST_URL_ATTR屬性。過濾器還在ServerWebExchangeUtils中查找GATEWAY_SCHEME_PREFIX_ATTR屬性,查看它是否等于lb。如果等于,則應用相同的規則。下面的代碼清單配置了ReactiveLoadBalancerClientFilter:
默認情況下,當ReactorLoadBalancer找不到服務實例時,會返回503。通過設置spring.cloud.gateway.loadbalancer.use404=true,可以配置網關返回404。
從ReactiveLoadBalancerClientFilter返回的ServiceInstance的isSecure值覆蓋了向網關發出的請求中指定的方案。例如,如果請求通過HTTPS進入網關,但ServiceInstance表明它不安全,則下游請求將通過HTTP發出。相反的情況也可以適用。但是,如果在網關配置中為路由指定了GATEWAY_SCHEME_PREFIX_ATTR,前綴將被刪除,并且從路由URL得到的方案將覆蓋ServiceInstance配置。
Netty路由過濾器
如果URL位于ServerWebExchangeUtils中,則運行Netty路由過濾器GATEWAY_REQUEST_URL_ATTR交換屬性具有http或https方案。它使用Netty HttpClient來發出下游代理請求。響應被放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交換屬性,稍后在過濾器中使用。(還有一個實驗性的WebClientHttpRoutingFilter,它執行相同的功能,但不需要Netty。)
Netty寫響應過濾器
如果服務器ServerWebExchangeUtils中有Netty HttpClientResponse,則運行NettyWriteResponseFilter.CLIENT_RESPONSE_ATTR交換屬性。它在所有其他過濾器完成之后運行,并將代理響應寫回網關客戶端響應。(還有一個實驗性的WebClientWriteResponseFilter,它可以執行相同的功能,但不需要Netty。)
RouteToRequestUrl過濾器
如果ServerWebExchangeUtils中有路由對象。GATEWAY_ROUTE_ATTR交換屬性,運行RouteToRequestUrlFilter。它根據請求的URI創建一個新的URI,但使用路由對象的URI屬性進行更新。新的URI放置在ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交換屬性'。
如果URI中有一個模式前綴,例如lb:ws://serviceid,則從URI中剝離lb模式,放在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR,稍后在過濾器鏈中使用。
WebSocket過濾器
如果URL位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交換屬性有ws或wss方案,websocket路由過濾器運行。它使用Spring WebSocket基礎設施向下游轉發WebSocket請求。
你可以在URI前加上lb,例如lb:ws://serviceid,對websocket進行負載均衡。?
以上在Gateway中提供的幾個核心全局過濾器,任何路由都會被過濾器執行。