前言
Gateway
中的過濾器可以爲路由添加業務邏輯,修改請求以及響應
環境
Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE
Gateway過濾器的生命週期
pre
:Gateway
轉發請求之前post
:Gateway
轉發請求之後
過濾器工廠
內置過濾器工廠
AddRequestHeader GatewayFilter Factory
示例,爲原始請求添加請求參數foo=bar
gateway:
discovery:
locator:
# 讓gateway通過服務發現組件找到其他的微服務
enabled: true
routes:
- id: user-center
uri: lb://user-center
predicates:
- Path=/**
filters:
- AddRequestParameter=foo, bar
- 輸入日誌
自定義過濾器工廠
自定義過濾器工廠 - 實現方式
- 實現自定義過濾器工廠有兩種方式
繼承 AbstractGatewayFilterFactory
繼承 AbstractNameValueGatewayFilterFactory
自定義過濾器工廠 - 具體實例
- 實現自定義過濾器工廠 - 日誌打印
application.yml
gateway:
discovery:
locator:
# 讓gateway通過服務發現組件找到其他的微服務
enabled: true
routes:
- id: user-center
uri: lb://user-center
predicates:
- Path=/**
filters:
- PreLog=參數1,參數2
PreLogGatewayFilterFactory.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
/**
* 自定義過濾器工廠 - 日誌打印
* 必須以GatewayFilterFactory結尾
*/
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return ((exchange, chain) -> {
log.info("自定義過濾器工廠 - 日誌打印參數:{},{}", config.getName(), config.getValue());
// 修改請求
ServerHttpRequest modifiedRequest = exchange.getRequest()
.mutate()
.build();
// 修改exchange
ServerWebExchange modifiedExchange = exchange.mutate()
.request(modifiedRequest)
.build();
// 傳遞給下一個過濾器處理
return chain.filter(modifiedExchange);
});
}
}
- 訪問
GATEWAY_URL/**
自定義過濾器工廠- 核心API
exchange.getRequest().mutate().xxx // 修改request
exchange.mutate().xxx // 修改exchange
chain.filter(exchange) // 傳遞給下一個過濾器處理
exchange.getResponse() // 拿到響應