Zuul的過濾器

過濾器是Zuul的核心組件,這篇文章用來記錄Zuul的過濾器相關內容。

過濾器類型與請求聲明週期

Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了4種標準類型過濾器,這些過濾器正好對應於請求的典型生命週期。

  • PRE
    這種過濾器在請求被路由之前調用。可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調式信息等。

  • ROUTING
    這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或 Netfilx Ribbon請求微服務。

  • POST
    這種過濾器在路由到微服務以後執行。這種過濾器可以用來爲響應添加標準的Http Header、收集統計信息和指標、將響應從微服務發送給客戶端等。

  • ERROR
    在其他階段發生錯誤時執行該過濾器。

除了上面默認的過濾器類型外,Zuul還允許創建自定義的過濾器類型。例如,可以定製一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到後端微服務。

Zuul請求的生命週期如下圖所示,該圖詳細描述了各種類型過濾器的執行順序。

Zuul請求聲明週期

我們來進行編寫一個Zuul過濾器

編寫一個Zuul的過濾器非常簡單,只需要繼承抽象類ZuulFilter,然後實現幾個抽象方法就可以了。

接下來,我們編寫一個簡單的Zuul過濾器,讓該過濾器打印請求日誌。

  1. 編寫自定義Zuul過濾器
public class PreRequestLogFilter extends ZuulFilter {

    private static final Logger LOGGER = LoggerFactory.getLogger(PreRequestLogFilter.class);

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    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等幾種取值,分別對應上文的幾種過濾器。詳情可以參考com.netfilx.zuul.ZuulFilter.filterType() 中的註釋。
  • filterOrder: 返回一個int值來指定過濾器的執行順序,不同的過濾器允許返回相同的數字。
  • shouldFilter: 返回一個boolean值來判斷該過濾器是否要執行,true表示執行,false表示不執行。
  • run: 過濾器的具體邏輯。這裏我讓它打印了請求的HTTP方法以及請求地址。
  1. 修改springboot工程的啓動類,爲啓動類添加一下內容:
	@Bean
	public PreRequestLogFilter preRequestLogFilter() {
		return new PreRequestLogFilter();
	}

測試:
訪問 http://localhost:port/microservice-name/uri,可以獲得類似如下日誌:

send GET request to http://localhost:8040/microservice-provider-user/1

禁用Zuul過濾器

Spring Cloud默認爲Zuul編寫並啓用了一些過濾器,例如DebugFilter,FormBodyWrapperFilter、PreDecorationFilter等。這些過濾器都存放在spring-cloud-netfilx-core 這個Jar包的org.springframework.cloud.netflix.zuul.filters包中。

一些場景下,想要禁用掉部分過濾器,該怎麼辦?

答案非常簡單,只須設置zuul...disable=true,即可禁用SimpleClassName 所對應的過濾器。如果想要禁用掉我們上門所編寫的過濾器,只需設置zuul.PreRequestLogFilter.pre.disable=true即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章