您好,登錄后才能下訂單哦!
前言
過濾器是Zuul的核心組件,這篇文章我們來詳細討論Zuul的過濾器。下面話不多說,來看看詳細的介紹吧。
過濾器類型與請求生命周期
Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了四種標準過濾器類型,這些過濾器類型對應于請求的典型生命周期。
(1) PRE:這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。
(2) ROUTING:這種過濾器將請求路由到微服務。這種過濾器用于構建發送給微服務的請求,并使用Apache HttpClient或Netfilx Ribbon請求微服務。
(3) POST:這種過濾器在路由到微服務以后執行。這種過濾器可用來為響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
(4) ERROR:在其他階段發生錯誤時執行該過濾器。
除了默認的過濾器類型,Zuul還允許我們創建自定義的過濾器類型。例如,我們可以定制一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到后端的微服務。
Zuul請求的生命周期如圖8-5所示,該圖詳細描述了各種類型的過濾器的執行順序。
Zuul請求的生命周期
編寫Zuul過濾器
理解過濾器類型和請求生命周期后,我們來編寫一個Zuul過濾器。編寫Zuul的過濾器非常簡單,我們只需繼承抽象類ZuulFilter,然后實現幾個抽象方法就可以了。
那么現在,我們來編寫一個簡單的Zuul過濾器,讓該過濾器打印請求日志。
(1) 復制項目microservice-gateway-zuul,將ArtifactId修改為microservice-gateway-zuul-filter。
(2) 編寫自定義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需實現以下幾個方法:
com.netflix.zuul.ZuulFilter.filterType()
中的注釋。(2) 修改啟動類,為啟動類添加以下內容:
@Bean public PreRequestLogFilter preRequestLogFilter() { return new PreRequestLogFilter(); }
測試
(1) 啟動microservice-discovery-eureka。
(2) 啟動microservice-provider-user。
(3) 啟動microservice-gateway-zuul-filter。
(4) 訪問http://localhost:8040/microservice-provider-user/1 ,可獲得類似如下的日志。
[nio-8040-exec-6] c.i.c.s.filters.pre.PreRequestLogFilter : send GET request to http://localhost:8040//microservice-provider-user/1
說明我們編寫的自定義Zuul過濾器被執行了。
禁用Zuul過濾器
Spring Cloud默認為Zuul編寫并啟用了一些過濾器,例如DebugFilter、FormBodyWrapperFilter、PreDecorationFilter等。這些過濾器都存放在spring-cloud-netflix-core這個Jar包的org.springframework.cloud.netflix.zuul.filters包中。
一些場景下,我們想要禁用掉部分過濾器,此時該怎么辦呢?
答案非常簡單,只需設置zuul.<SimpleClassName>.<filterType>.disable=true
,即可禁用SimpleClassName所對應的過濾器。以過濾器org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter
為例,只需設置zuul.SendResponseFilter.post.disable=true
,即可禁用該過濾器。
同理,如果想要禁用《編寫Zuul過濾器》一節編寫的過濾器,只需設置zuul.PreRequestLogFilter.pre.disable=true
即可。
TPS
(1) 相關代碼com.netflix.zuul.ZuulFilter.disablePropertyName()
、com.netflix.zuul.ZuulFilter.isFilterDisabled()
、com.netflix.zuul.ZuulFilter.runFilter()
。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。