深入解析Spring Cloud內(nèi)置的Zuul過濾器
前言
Spring Cloud默認(rèn)為Zuul編寫并啟用了一些過濾器,這些過濾器有什么作用呢?我們不妨按照@EnableZuulServer、@EnableZuulProxy兩個(gè)注解進(jìn)行展開,相信大家對這兩個(gè)注解都不陌生(至少都見過吧)。如果覺得陌生也沒有關(guān)系,可將@EnableZuulProxy簡單理解為@EnableZuulServer的增強(qiáng)版。事實(shí)上,當(dāng)Zuul與Eureka、Ribbon等組件配合使用時(shí),
@EnableZuulProxy是我們常用的注解。
在Spring Cloud的官方文檔中,只說@EnableZuulServer是一個(gè)“空白”的Zuul,那么究竟空白在什么地方呢?與@EnableZuulProxy到底有什么區(qū)別呢?諸多問題,都將在本文找到答案。
在此之前,我們先理解什么是RequestContext:
RequestContext:用于在過濾器之間傳遞消息。它的數(shù)據(jù)保存在每個(gè)請求的ThreadLocal中。它用于存儲請求路由到哪里、錯(cuò)誤、HttpServletRequest、HttpServletResponse都存儲在RequestContext中。RequestContext擴(kuò)展了ConcurrentHashMap,所以,任何數(shù)據(jù)都可以存儲在上下文中。
@EnableZuulServer過濾器
一、pre類型過濾器
(1) ServletDetectionFilter:該過濾器用于檢查請求是否通過Spring Dispatcher。檢查后,通過isDispatcherServletRequest設(shè)置布爾值。
(2) FormBodyWrapperFilter:解析表單數(shù)據(jù),并為請求重新編碼。
(3) DebugFilter:顧名思義,調(diào)試用的過濾器,可以通過zuul.debug.request=true
,或在請求時(shí),加上debug=true
的參數(shù),例如$ZUUL_HOST:ZUUL_PORT/path?debug=true
開啟該過濾器。這樣,該過濾器就會把RequestContext.setDebugRouting()
、RequestContext.setDebugRequest()
設(shè)為true。
二、route類型過濾器
SendForwardFilter:該過濾器使用Servlet RequestDispatcher轉(zhuǎn)發(fā)請求,轉(zhuǎn)發(fā)位置存儲在RequestContext.getCurrentContext().get("forward.to")
中??梢詫⒙酚稍O(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)就會轉(zhuǎn)發(fā)到/error,也可以設(shè)置error.path
屬性修改默認(rèn)的轉(zhuǎn)發(fā)路徑。
@EnableZuulProxy過濾器
如果使用注解@EnableZuulProxy,那么除上述過濾器之外,Spring Cloud還會安裝以下過濾器:
一、pre類型過濾器
PreDecorationFilter:該過濾器根據(jù)提供的RouteLocator確定路由到的地址,以及怎樣去路由。該路由器也可為后端請求設(shè)置各種代理相關(guān)的header。
二、route類型過濾器
(1) RibbonRoutingFilter:該過濾器使用Ribbon,Hystrix和可插拔的HTTP客戶端發(fā)送請求。serviceId在RequestContext.getCurrentContext().get("serviceId")
中。該過濾器可使用不同的HTTP客戶端,例如
- Apache HttpClient:默認(rèn)的HTTP客戶端
- Squareup OkHttpClient v3:如需使用該客戶端,需保證
com.squareup.okhttp3
的依賴在classpath中,并設(shè)置ribbon.okhttp.enabled = true
。 - Netflix Ribbon HTTP client:設(shè)置
ribbon.restclient.enabled = true
即可啟用該HTTP客戶端。需要注意的是,該客戶端有一定限制,例如不支持PATCH方法,另外,它有內(nèi)置的重試機(jī)制。
(2) SimpleHostRoutingFilter:該過濾器通過Apache HttpClient向指定的URL發(fā)送請求。URL在RequestContext.getRouteHost()
中。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Java動(dòng)態(tài)規(guī)劃方式解決不同的二叉搜索樹
二叉搜索樹作為一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時(shí)查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實(shí)現(xiàn),需要的可以參考一下2022-10-10Java中MyBatis Plus知識點(diǎn)總結(jié)
在本篇文章里小編給大家整理一篇關(guān)于Java中MyBatis Plus知識點(diǎn)總結(jié),需要的朋友們參考下。2019-10-10RecyclerChart動(dòng)態(tài)屬性圖標(biāo)聯(lián)動(dòng)數(shù)據(jù)動(dòng)態(tài)加載詳解
這篇文章主要為大家介紹了RecyclerChart動(dòng)態(tài)屬性圖標(biāo)聯(lián)動(dòng)數(shù)據(jù)動(dòng)態(tài)加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java gui詳解貪吃蛇小游戲?qū)崿F(xiàn)流程
剛開始學(xué)JAVA GUI,就練手寫了一個(gè)小時(shí)候經(jīng)常在諾基亞上玩的一個(gè)小游戲__貪吃蛇.做的比較簡單,但還是可以玩的.感興趣的朋友快來看看吧2021-11-11Spring的請求映射handlerMapping以及原理詳解
這篇文章主要介紹了Spring的請求映射handlerMapping以及原理詳解,我們每次發(fā)請求,它到底是怎么找到我們哪個(gè)方法來去處理這個(gè)請求,因?yàn)槲覀冎浪械恼埱筮^來都會來到DispatcherServlet,springboot底層還是使用的是springMVC,需要的朋友可以參考下2023-08-08教新手使用java如何對一個(gè)大的文本文件內(nèi)容進(jìn)行去重
用HashSet對內(nèi)容去重這個(gè)過程jvm會內(nèi)存溢出,只能首先將這個(gè)大文件中的內(nèi)容讀取出來,對每行String的hashCode取模取正整數(shù),可用取模結(jié)果作為文件名,將相同模數(shù)的行寫入同一個(gè)文件,再單獨(dú)對每個(gè)小文件進(jìn)行去重,最后再合并2021-06-06