深入理解Spring Cloud Zuul過濾器
前言
過濾器是Zuul的核心組件,這篇文章我們來詳細(xì)討論Zuul的過濾器。下面話不多說,來看看詳細(xì)的介紹吧。
過濾器類型與請(qǐng)求生命周期
Zuul大部分功能都是通過過濾器來實(shí)現(xiàn)的。Zuul中定義了四種標(biāo)準(zhǔn)過濾器類型,這些過濾器類型對(duì)應(yīng)于請(qǐng)求的典型生命周期。
(1) PRE:這種過濾器在請(qǐng)求被路由之前調(diào)用。我們可利用這種過濾器實(shí)現(xiàn)身份驗(yàn)證、在集群中選擇請(qǐng)求的微服務(wù)、記錄調(diào)試信息等。
(2) ROUTING:這種過濾器將請(qǐng)求路由到微服務(wù)。這種過濾器用于構(gòu)建發(fā)送給微服務(wù)的請(qǐng)求,并使用Apache HttpClient或Netfilx Ribbon請(qǐng)求微服務(wù)。
(3) POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標(biāo)準(zhǔn)的HTTP Header、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
(4) ERROR:在其他階段發(fā)生錯(cuò)誤時(shí)執(zhí)行該過濾器。
除了默認(rèn)的過濾器類型,Zuul還允許我們創(chuàng)建自定義的過濾器類型。例如,我們可以定制一種STATIC類型的過濾器,直接在Zuul中生成響應(yīng),而不將請(qǐng)求轉(zhuǎn)發(fā)到后端的微服務(wù)。
Zuul請(qǐng)求的生命周期如圖8-5所示,該圖詳細(xì)描述了各種類型的過濾器的執(zhí)行順序。

Zuul請(qǐng)求的生命周期
編寫Zuul過濾器
理解過濾器類型和請(qǐng)求生命周期后,我們來編寫一個(gè)Zuul過濾器。編寫Zuul的過濾器非常簡(jiǎn)單,我們只需繼承抽象類ZuulFilter,然后實(shí)現(xiàn)幾個(gè)抽象方法就可以了。
那么現(xiàn)在,我們來編寫一個(gè)簡(jiǎn)單的Zuul過濾器,讓該過濾器打印請(qǐng)求日志。
(1) 復(fù)制項(xiàng)目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需實(shí)現(xiàn)以下幾個(gè)方法:
- filterType:返回過濾器的類型。有pre、route、post、error等幾種取值,分別對(duì)應(yīng)上文的幾種過濾器。詳細(xì)可以參考
com.netflix.zuul.ZuulFilter.filterType()中的注釋。 - filterOrder:返回一個(gè)int值來指定過濾器的執(zhí)行順序,不同的過濾器允許返回相同的數(shù)字。
- shouldFilter:返回一個(gè)boolean值來判斷該過濾器是否要執(zhí)行,true表示執(zhí)行,false表示不執(zhí)行。
- run:過濾器的具體邏輯。本例中,我們讓它打印了請(qǐng)求的HTTP方法以及請(qǐng)求的地址。
(2) 修改啟動(dòng)類,為啟動(dòng)類添加以下內(nèi)容:
@Bean
public PreRequestLogFilter preRequestLogFilter() {
return new PreRequestLogFilter();
}
測(cè)試
(1) 啟動(dòng)microservice-discovery-eureka。
(2) 啟動(dòng)microservice-provider-user。
(3) 啟動(dòng)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過濾器被執(zhí)行了。
禁用Zuul過濾器
Spring Cloud默認(rèn)為Zuul編寫并啟用了一些過濾器,例如DebugFilter、FormBodyWrapperFilter、PreDecorationFilter等。這些過濾器都存放在spring-cloud-netflix-core這個(gè)Jar包的org.springframework.cloud.netflix.zuul.filters包中。
一些場(chǎng)景下,我們想要禁用掉部分過濾器,此時(shí)該怎么辦呢?
答案非常簡(jiǎn)單,只需設(shè)置zuul.<SimpleClassName>.<filterType>.disable=true ,即可禁用SimpleClassName所對(duì)應(yīng)的過濾器。以過濾器org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter為例,只需設(shè)置zuul.SendResponseFilter.post.disable=true ,即可禁用該過濾器。
同理,如果想要禁用《編寫Zuul過濾器》一節(jié)編寫的過濾器,只需設(shè)置zuul.PreRequestLogFilter.pre.disable=true 即可。
TPS
(1) 相關(guān)代碼com.netflix.zuul.ZuulFilter.disablePropertyName() 、com.netflix.zuul.ZuulFilter.isFilterDisabled() 、com.netflix.zuul.ZuulFilter.runFilter() 。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
SpringBoot實(shí)現(xiàn)圖片上傳及本地訪問
在SpringBoot項(xiàng)目中,處理靜態(tài)文件訪問尤其是實(shí)時(shí)更新的文件如商品圖片,可通過配置WebMvcConfig將本地文件映射到URL路徑上,以解決重啟項(xiàng)目才能訪問文件的問題,本文詳解如何保存和訪問這些文件,幫助開發(fā)者優(yōu)化項(xiàng)目文件管理2022-09-09
Java8流式API將實(shí)體類列表轉(zhuǎn)換為視圖對(duì)象列表的示例
這篇文章主要介紹了Java8流式API將實(shí)體類列表轉(zhuǎn)換為視圖對(duì)象列表的示例,文中有相關(guān)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
關(guān)于JavaEE內(nèi)部類的部分注意事項(xiàng)
這篇文章主要介紹了關(guān)于JavaEE內(nèi)部類的部分注意事項(xiàng),將一個(gè)類定義在另一個(gè)類里面或者一個(gè)方法里面,這樣的類稱為內(nèi)部類,這是一種封裝思想,那么使用內(nèi)部類的時(shí)候要注意些什么呢,讓我們一起來看看吧2023-03-03
基于Spring Data的AuditorAware審計(jì)功能的示例代碼
這篇文章主要介紹了基于Spring Data的AuditorAware審計(jì)功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03

