前言

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、涿州網(wǎng)站維護(hù)、網(wǎng)站推廣。
Spring Cloud默認(rèn)為Zuul編寫并啟用了一些過濾器,這些過濾器有什么作用呢?我們不妨按照@EnableZuulServer、@EnableZuulProxy兩個(gè)注解進(jìn)行展開,相信大家對(duì)這兩個(gè)注解都不陌生(至少都見過吧)。如果覺得陌生也沒有關(guān)系,可將@EnableZuulProxy簡(jiǎn)單理解為@EnableZuulServer的增強(qiáng)版。事實(shí)上,當(dāng)Zuul與Eureka、Ribbon等組件配合使用時(shí),
@EnableZuulProxy是我們常用的注解。
在Spring Cloud的官方文檔中,只說@EnableZuulServer是一個(gè)“空白”的Zuul,那么究竟空白在什么地方呢?與@EnableZuulProxy到底有什么區(qū)別呢?諸多問題,都將在本文找到答案。
在此之前,我們先理解什么是RequestContext:
RequestContext:用于在過濾器之間傳遞消息。它的數(shù)據(jù)保存在每個(gè)請(qǐng)求的ThreadLocal中。它用于存儲(chǔ)請(qǐng)求路由到哪里、錯(cuò)誤、HttpServletRequest、HttpServletResponse都存儲(chǔ)在RequestContext中。RequestContext擴(kuò)展了ConcurrentHashMap,所以,任何數(shù)據(jù)都可以存儲(chǔ)在上下文中。
@EnableZuulServer過濾器
一、pre類型過濾器
(1) ServletDetectionFilter:該過濾器用于檢查請(qǐng)求是否通過Spring Dispatcher。檢查后,通過isDispatcherServletRequest設(shè)置布爾值。
(2) FormBodyWrapperFilter:解析表單數(shù)據(jù),并為請(qǐng)求重新編碼。
(3) DebugFilter:顧名思義,調(diào)試用的過濾器,可以通過zuul.debug.request=true ,或在請(qǐng)求時(shí),加上debug=true的參數(shù),例如$ZUUL_HOST:ZUUL_PORT/path?debug=true 開啟該過濾器。這樣,該過濾器就會(huì)把RequestContext.setDebugRouting() 、RequestContext.setDebugRequest() 設(shè)為true。
二、route類型過濾器
SendForwardFilter:該過濾器使用Servlet RequestDispatcher轉(zhuǎn)發(fā)請(qǐng)求,轉(zhuǎn)發(fā)位置存儲(chǔ)在RequestContext.getCurrentContext().get("forward.to") 中。可以將路由設(shè)置成:
zuul: routes: abc: path: /abc/** url: forward:/abc
然后訪問$ZUUL_HOST:ZUUL_PORT/abc ,觀察該過濾器的執(zhí)行過程。
三、post類型過濾器
SendResponseFilter:將Zuul所代理的微服務(wù)的的響應(yīng)寫入當(dāng)前響應(yīng)。
四、error類型過濾器
SendErrorFilter:如果RequestContext.getThrowable() 不為null,那么默認(rèn)就會(huì)轉(zhuǎn)發(fā)到/error,也可以設(shè)置error.path屬性修改默認(rèn)的轉(zhuǎn)發(fā)路徑。
@EnableZuulProxy過濾器
如果使用注解@EnableZuulProxy,那么除上述過濾器之外,Spring Cloud還會(huì)安裝以下過濾器:
一、pre類型過濾器
PreDecorationFilter:該過濾器根據(jù)提供的RouteLocator確定路由到的地址,以及怎樣去路由。該路由器也可為后端請(qǐng)求設(shè)置各種代理相關(guān)的header。
二、route類型過濾器
(1) RibbonRoutingFilter:該過濾器使用Ribbon,Hystrix和可插拔的HTTP客戶端發(fā)送請(qǐng)求。serviceId在RequestContext.getCurrentContext().get("serviceId") 中。該過濾器可使用不同的HTTP客戶端,例如
com.squareup.okhttp3的依賴在classpath中,并設(shè)置ribbon.okhttp.enabled = true 。ribbon.restclient.enabled = true 即可啟用該HTTP客戶端。需要注意的是,該客戶端有一定限制,例如不支持PATCH方法,另外,它有內(nèi)置的重試機(jī)制。(2) SimpleHostRoutingFilter:該過濾器通過Apache HttpClient向指定的URL發(fā)送請(qǐng)求。URL在RequestContext.getRouteHost() 中。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。
網(wǎng)站標(biāo)題:深入解析SpringCloud內(nèi)置的Zuul過濾器
URL分享:http://chinadenli.net/article34/jigese.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)