微服務springcloud—zuul的過濾器的編寫和禁用
Zuul的過濾器
過濾器是Zuul的核心元件。
過濾器型別與請求生命週期
PRE:這種過濾器在請求被路由之前呼叫。可利用這種過濾器實現 身份驗證、在叢集中選擇請求的微服務、記錄除錯資訊等。 ROUTHING: 這種過濾器將請求路由到微服務。這總過濾器用於構建傳送給 微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。 POST:這種過濾器在路由到微服務以後執行。這種過濾器用來為響應新增標準的 HTTP Header、收集統計資訊和指標、將響應從微服務傳送給客戶端等。 ERROR:在其他階段發生錯誤時執行該過濾器。
編寫過濾器
1.複製專案microservice-gateway-zuul,將ArtifactId修改為 microservice-gateway-zuul-filter。 2.編寫自定義Zuul過濾器
public class PreRequestLogFilter extends ZuulApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(PreRequestLogFilter.class);
public String filterType() {
return "pre";
}
public int filterOrder() {
return 1;
}
public boolean shouldFilter () {
return true;
}
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
PreRequestLogFilter.LOGGER.info(String.format("send%s request to %s", request.getMethod(), request.getRequestURL( ).toString()));
return null;
}
}
由此可知,自定義的Zuul Filter需實現以下幾個方法。 filterType:返回過濾器型別。有pre、route、post、error等幾種取值。 filterOrder:返回一個int值來指定過濾器的執行順序,不同的過濾器允許返回相同的數字。 shouldFilter:返回一個boolean值來判斷該過濾器是否要執行,true表示執行,false表示不執行。 run:過濾器的具體邏輯,本例讓他列印了請求的HTTP方法以及請求的地址。
3.修改啟動類,為啟動類新增以下內容
@Bean
public PreRequestLogFilter preRequestLogFilter(){
return new PreRequestLogFilter();
}
4.測試 啟動專案microservice-discovery-eureka。 啟動專案microservice-provider-user。 啟動專案microservice-gateway-zuul-filter。 訪問http://localhost:8040/users/1,可獲得如下日誌:
禁用Zuul過濾器
Spring Cloud預設為Zuul編寫了一些過濾器。 一些場景下,想要禁用掉部分過濾器,該怎麼辦呢? 答案很簡單,只需設定zuul.SendResponseFilter.post.disable=true, 即可禁用該過濾器。 如果想要禁用自己編寫的自定義過濾器只須zuul.preRequestLogFilter.pre.disable = true即可。
本文大部分內容轉載自周立的《Spring Cloud與Docker微服務架構實戰》