今天我們來學習下GatewayFilter Factory,中文解釋就是過濾器工廠。
官方文檔對GatewayFilter Factory的介紹:
Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular route. Spring Cloud Gateway includes many built-in GatewayFilter Factories.
英文不好,就隨意翻譯下,大概的意思如下:
Spring Cloud Gateway的路由過濾器允許以某種方式修改傳入的HTTP請求或輸出的HTTP響應。只作用於特定的路由。Spring Cloud Gateway中內置了很多的過濾器工廠。
通過目前的文檔,我看到了內置的數量為20個,今天我們來學習第一個過濾器工廠AddRequestHeader GatewayFilter Factory。
通過名稱我們可以快速的明白這個過濾器工廠的作用,就是添加請求頭。
使用示列:
spring:
cloud:
gateway:
routes:
- id: fsh-house
uri: lb://fsh-house
predicates:
- Path=/house/**
filters:
- AddRequestHeader=NAME, yinjihuan
上面的配置,我們針對fsh-house這個服務的路由配置了AddRequestHeader,增加了一個名稱為NAME,值是yinjihuan的請求頭。
這樣配置之后,在fsh-house服務中的所有接口,都可以通過request來獲取到NAME請求頭的信息,代碼如下:
@GetMapping("/hello")
public String hello(HttpServletRequest request) throws Exception {
System.err.println(request.getHeader("NAME"));
return "Hello"+serverPort;
}
如果我們需要傳遞多個請求頭咋配置?
filters:
- AddRequestHeader=NAME, yinjihuan
- AddRequestHeader=NAME2, yinjihuan2
配置2個過濾器就行了,是不支持一個過濾器配置多個請求頭的方式,原因我們通過源碼可以得出,請看源碼:
public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(config.getName(), config.getValue())
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
}
NameValueConfig就2個字段,一個name,一個value,對應的也就是請求頭的名稱和值。
類似的工廠類還有AddRequestParameter和AddResponseHeader,RemoveRequestHeader,RemoveResponseHeader,這幾個就不做單獨講解了,使用方式是一樣的。一個是添加請求參數,一個是添加響應的請求頭。
AddRequestParameter配置示列:
filters:
- AddRequestParameter=name, yinjihuan
AddResponseHeader配置示列:
filters:
- AddResponseHeader=name, yinjihuan
討論時間
文章中講的這幾個工廠類的作用我們已經了解了,那具體的使用場景有哪些?適合在什么場景下使用呢?歡迎大家留言討論。