精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Cloud實戰(zhàn)小貼士:Zuul統一異常處理(二)

開發(fā) 開發(fā)工具
之前,我們詳細說明了當Zuul的過濾器中拋出異常時會發(fā)生客戶端沒有返回任何內容的問題以及針對這個問題的兩種解決方案,但是如果在多一些應用實踐或源碼分析之后,我們會發(fā)現依然存在一些不足。

在前幾天發(fā)布的《Spring Cloud實戰(zhàn)小貼士:Zuul統一異常處理(一)》一文中,我們詳細說明了當Zuul的過濾器中拋出異常時會發(fā)生客戶端沒有返回任何內容的問題以及針對這個問題的兩種解決方案:一種是通過在各個階段的過濾器中增加try-catch塊,實現過濾器內部的異常處理;另一種是利用error類型過濾器的生命周期特性,集中地處理pre、route、post階段拋出的異常信息。通常情況下,我們可以將這兩種手段同時使用,其中***種是對開發(fā)人員的基本要求;而第二種是對***種處理方式的補充,以防止一些意外情況的發(fā)生。這樣的異常處理機制看似已經***,但是如果在多一些應用實踐或源碼分析之后,我們會發(fā)現依然存在一些不足。

[[191774]]

不足之處

下面,我們不妨跟著源碼來看看,到底上面的方案還有哪些不足之處需要我們注意和進一步優(yōu)化的。先來看看外部請求到達API網關服務之后,各個階段的過濾器是如何進行調度的:

  1. try { 
  2.     preRoute(); 
  3. } catch (ZuulException e) { 
  4.     error(e); 
  5.     postRoute(); 
  6.     return; 
  7. try { 
  8.     route(); 
  9. } catch (ZuulException e) { 
  10.     error(e); 
  11.     postRoute(); 
  12.     return; 
  13. try { 
  14.     postRoute(); 
  15. } catch (ZuulException e) { 
  16.     error(e); 
  17.     return; 

上面代碼源自com.netflix.zuul.http.ZuulServlet的service方法實現,它定義了Zuul處理外部請求過程時,各個類型過濾器的執(zhí)行邏輯。從代碼中我們可以看到三個try-catch塊,它們依次分別代表了pre、route、post三個階段的過濾器調用,在catch的異常處理中我們可以看到它們都會被error類型的過濾器進行處理(之前使用error過濾器來定義統一的異常處理也正是利用了這個特性);error類型的過濾器處理完畢之后,除了來自post階段的異常之外,都會再被post過濾器進行處理。而對于從post過濾器中拋出異常的情況,在經過了error過濾器處理之后,就沒有其他類型的過濾器來接手了,這就是使用之前所述方案存在不足之處的根源。

分析與優(yōu)化

回想一下之前實現的兩種異常處理方法,其中非常核心的一點,這兩種處理方法都在異常處理時候往請求上下文中添加了一系列的error.*參數,而這些參數真正起作用的地方是在post階段的SendErrorFilter,在該過濾器中會使用這些參數來組織內容返回給客戶端。而對于post階段拋出異常的情況下,由error過濾器處理之后并不會在調用post階段的請求,自然這些error.*參數也就不會被SendErrorFilter消費輸出。所以,如果我們在自定義post過濾器的時候,沒有正確的處理異常,就依然有可能出現日志中沒有異常并且請求響應內容為空的問題。我們可以通過修改之前ThrowExceptionFilter的filterType修改為post來驗證這個問題的存在,注意去掉try-catch塊的處理,讓它能夠拋出異常。

解決上述問題的方法有很多種,比如最直接的我們可以在實現error過濾器的時候,直接來組織結果返回就能實現效果,但是這樣的缺點也很明顯,對于錯誤信息組織和返回的代碼實現就會存在多份,這樣非常不易于我們日后的代碼維護工作。所以為了保持對異常返回處理邏輯的一致,我們還是希望將post過濾器拋出的異常能夠交給SendErrorFilter來處理。

在前文中,我們已經實現了一個ErrorFilter來捕獲pre、route、post過濾器拋出的異常,并組織error.*參數保存到請求的上下文中。由于我們的目標是沿用SendErrorFilter,這些error.*參數依然對我們有用,所以我們可以繼續(xù)沿用該過濾器,讓它在post過濾器拋出異常的時候,繼續(xù)組織error.*參數,只是這里我們已經無法將這些error.*參數再傳遞給SendErrorFitler過濾器來處理了。所以,我們需要在ErrorFilter過濾器之后再定義一個error類型的過濾器,讓它來實現SendErrorFilter的功能,但是這個error過濾器并不需要處理所有出現異常的情況,它僅對post過濾器拋出的異常才有效。根據上面的思路,我們完全可以創(chuàng)建一個繼承自SendErrorFilter的過濾器,就能復用它的run方法,然后重寫它的類型、順序以及執(zhí)行條件,實現對原有邏輯的復用,具體實現如下:

  1. try { 
  2.     preRoute(); 
  3. } catch (ZuulException e) { 
  4.     error(e); 
  5.     postRoute(); 
  6.     return; 
  7. try { 
  8.     route(); 
  9. } catch (ZuulException e) { 
  10.     error(e); 
  11.     postRoute(); 
  12.     return; 
  13. try { 
  14.     postRoute(); 
  15. } catch (ZuulException e) { 
  16.     error(e); 
  17.     return; 

到這里,我們在過濾器調度上的實現思路已經很清晰了,但是又有一個問題出現在我們面前:怎么判斷引起異常的過濾器是來自什么階段呢?(shouldFilter方法該如何實現)對于這個問題,我們***反應會寄希望于請求上下文RequestContext對象,可是在查閱文檔和源碼后發(fā)現其中并沒有存儲異常來源的內容,所以我們不得不擴展原來的過濾器處理邏輯,當有異常拋出的時候,記錄下拋出異常的過濾器,這樣我們就可以在ErrorExtFilter過濾器的shouldFilter方法中獲取并以此判斷異常是否來自post階段的過濾器了。

為了擴展過濾器的處理邏輯,為請求上下文增加一些自定義屬性,我們需要深入了解一下Zuul過濾器的核心處理器:com.netflix.zuul.FilterProcessor。該類中定義了下面過濾器調用和處理相關的核心方法:

  • getInstance():該方法用來獲取當前處理器的實例
  • setProcessor(FilterProcessor processor):該方法用來設置處理器實例,可以使用此方法來設置自定義的處理器
  • processZuulFilter(ZuulFilter filter):該方法定義了用來執(zhí)行filter的具體邏輯,包括對請求上下文的設置,判斷是否應該執(zhí)行,執(zhí)行時一些異常處理等
  • getFiltersByType(String filterType):該方法用來根據傳入的filterType獲取API網關中對應類型的過濾器,并根據這些過濾器的filterOrder從小到大排序,組織成一個列表返回
  • runFilters(String sType):該方法會根據傳入的filterType來調用getFiltersByType(String filterType)獲取排序后的過濾器列表,然后輪詢這些過濾器,并調用processZuulFilter(ZuulFilter filter)來依次執(zhí)行它們
  • preRoute():調用runFilters("pre")來執(zhí)行所有pre類型的過濾器
  • route():調用runFilters("route")來執(zhí)行所有route類型的過濾器
  • postRoute():調用runFilters("post")來執(zhí)行所有post類型的過濾器
  • error():調用runFilters("error")來執(zhí)行所有error類型的過濾器

根據我們之前的設計,我們可以直接通過擴展processZuulFilter(ZuulFilter filter)方法,當過濾器執(zhí)行拋出異常的時候,我們捕獲它,并往請求上下中記錄一些信息。比如下面的具體實現:

  1. public class DidiFilterProcessor extends FilterProcessor { 
  2.     @Override 
  3.     public Object processZuulFilter(ZuulFilter filter) throws ZuulException { 
  4.         try { 
  5.             return super.processZuulFilter(filter); 
  6.         } catch (ZuulException e) { 
  7.             RequestContext ctx = RequestContext.getCurrentContext(); 
  8.             ctx.set("failed.exception", e); 
  9.             ctx.set("failed.filter", filter); 
  10.             throw e; 
  11.         } 
  12.     } 

在上面代碼的實現中,我們創(chuàng)建了一個FilterProcessor的子類,并重寫了processZuulFilter(ZuulFilter filter),雖然主邏輯依然使用了父類的實現,但是在最外層,我們?yōu)槠湓黾恿水惓2东@,并在異常處理中為請求上下文添加了failed.filter屬性,以存儲拋出異常的過濾器實例。在實現了這個擴展之后,我們也就可以完善之前ErrorExtFilter中的shouldFilter()方法,通過從請求上下文中獲取該信息作出正確的判斷,具體實現如下:

  1. public class ErrorExtFilter extends SendErrorFilter { 
  2.     @Override 
  3.     public String filterType() { 
  4.         return "error"; 
  5.     } 
  6.     @Override 
  7.     public int filterOrder() { 
  8.         return 30; 
  9.     } 
  10.     @Override 
  11.     public boolean shouldFilter() { 
  12.         RequestContext ctx = RequestContext.getCurrentContext(); 
  13.         ZuulFilter failedFilter = (ZuulFilter) ctx.get("failed.filter"); 
  14.         if(failedFilter != null && failedFilter.filterType().equals("post")) { 
  15.             return true; 
  16.         } 
  17.         return false; 
  18.     } 

到這里,我們的優(yōu)化任務還沒有完成,因為擴展的過濾器處理類并還沒有生效。***,我們需要在應用主類中,通過調用FilterProcessor.setProcessor(new DidiFilterProcessor());方法來啟用自定義的核心處理器以完成我們的優(yōu)化目標。

【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉載請通過51CTO聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-05-18 14:14:25

過濾器Spring ClouZuul

2017-07-31 15:47:50

Zuul統一處理

2017-05-02 23:05:44

HTTPZuulCookie

2017-10-20 14:55:06

Spring ClouZuul加載

2017-10-18 16:00:14

SpringCloudZuul路徑

2017-08-10 16:14:07

FeignRPC模式

2025-02-13 00:34:22

Spring對象系統

2017-09-26 16:17:39

Ribboneager-load模式

2021-04-30 07:34:01

Spring BootController項目

2023-11-28 14:32:04

2021-06-29 19:26:29

緩存Spring CachSpring

2025-04-09 08:00:00

FastAPI統一響應全局異常處理

2024-08-09 08:25:32

Spring流程注解

2024-08-05 10:03:53

2017-04-12 14:43:01

Spring ClouZuul過濾器

2017-04-13 11:06:28

SpringCloud隨機端口

2017-05-04 22:30:17

Zuul過濾器微服務

2019-08-22 14:02:00

Spring BootRestful APIJava

2022-05-30 08:03:06

后端參數校驗異常處理

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架
點贊
收藏

51CTO技術棧公眾號

亚洲欧美激情一区二区三区| 亚洲免费在线精品一区| 亚洲精品午夜久久久久久久| 日韩极品在线| 在线观看亚洲精品| 亚洲天堂av免费在线观看| 精品国产一级片| 亚洲久久一区二区| 亚洲欧美日韩国产精品| 香蕉视频999| 1区2区3区在线| 国产精品水嫩水嫩| 国产精品免费视频一区二区| 亚洲不卡在线视频| 欧美精品大片| 亚洲香蕉成人av网站在线观看| 日韩在线一区视频| 碰碰在线视频| 综合婷婷亚洲小说| 欧美一区二区高清在线观看| 国产精品亚洲lv粉色| 一本久道久久综合狠狠爱| 日韩中文字幕免费看| 亚洲av无码国产精品久久| avtt久久| 在线亚洲精品福利网址导航| 男女日批视频在线观看| 在线免费看a| 久久视频一区二区| 超碰97在线资源| 国产一区二区在线不卡| 奶水喷射视频一区| 欧美激情欧美狂野欧美精品 | 亚洲啊v在线| 中文字幕亚洲视频| 激情伦成人综合小说| 一级黄色片免费看| 日韩激情一二三区| 国产91ⅴ在线精品免费观看| 欧美日韩成人免费观看| 99视频精品全国免费| 亚洲欧美激情另类校园| 久久久高清视频| vam成人资源在线观看| 色94色欧美sute亚洲13| 欧美日韩在线视频一区二区三区| 亚洲男同gay网站| 一色桃子久久精品亚洲| 日本成人看片网址| 欧美成人综合在线| 99国产欧美久久久精品| 99爱精品视频| 99久久精品日本一区二区免费 | 国产精品久久久久久久久久久久久久久久| 亚洲一区黄色| 性欧美在线看片a免费观看| 黄色在线观看免费| 欧美精品国产一区| 九九久久综合网站| 一区二区视频免费看| 午夜激情久久| 俺去了亚洲欧美日韩| 美国黄色片视频| 久久亚洲在线| 久久人人爽人人爽爽久久| 天堂网中文在线观看| 久久五月天小说| 精品国产欧美成人夜夜嗨| 久久视频一区二区三区| 99久久精品网| 美女精品视频一区| 久久亚洲av午夜福利精品一区| 亚洲综合色网| 欧美大片免费观看| 日本在线小视频| 野花国产精品入口| 欧美一级视频一区二区| 波多野结衣绝顶大高潮| 免费不卡在线视频| 97免费资源站| 午夜视频免费在线| 国产午夜精品福利| 香蕉精品视频在线| 精灵使的剑舞无删减版在线观看| 性久久久久久久久久久久 | 日本vs亚洲vs韩国一区三区二区| 国产精品第一区| 91成人在线免费| 国产成人av福利| 精品日产一区2区三区黄免费| 毛片免费在线观看| 亚洲色图制服丝袜| 国产一二三在线视频| 欧美aa视频| 欧美午夜电影网| 337p日本欧洲亚洲大胆张筱雨| 999久久久久久久久6666| 亚洲午夜久久久久久久久电影网| 日本五级黄色片| 成人美女黄网站| 欧美另类久久久品| 少妇一级淫片免费放播放| 国产一区二区观看| 九九精品视频在线观看| 久久精品五月天| 国产成人精品免费| 欧美日韩一区在线观看视频| 黄色视屏免费在线观看| 欧美日韩国产中文字幕| 亚洲自拍第三页| 日韩欧美在线精品| 大胆人体色综合| 中文字幕精品无码一区二区| 久久99这里只有精品| 久久久一本精品99久久精品| 免费黄色网址在线观看| 日韩欧美在线播放| 性色av浪潮av| 国语产色综合| 午夜精品在线观看| av中文在线观看| 欧美激情一区二区三区不卡| 国产 日韩 欧美在线| 欧美激情不卡| 亚洲三级 欧美三级| 久久亚洲成人av| 精品亚洲成a人在线观看| 青草青草久热精品视频在线网站 | 黄色在线视频网站| 色婷婷久久久久swag精品| 无码日本精品xxxxxxxxx| 欧美日韩尤物久久| 日韩精品极品在线观看播放免费视频| 综合五月激情网| 免费精品视频最新在线| 久久国产精品一区二区三区四区| 69成人在线| 欧美精品三级在线观看| 精品人体无码一区二区三区| 亚洲综合99| 国产在线一区二区三区欧美 | jazzjazz国产精品久久| 久久视频在线视频| 中文av免费观看| 久久精品在线观看| 虎白女粉嫩尤物福利视频| 国产成人澳门| 欧美极品少妇xxxxⅹ裸体艺术 | 免费av网站观看| 亚洲视频在线一区| 国产毛片久久久久久| 外国成人激情视频| 91精品视频专区| 欧美精品videos另类| 欧美视频你懂的| 在线观看免费黄色网址| 日本女优在线视频一区二区| 日韩电影免费观看高清完整| 欧美成人精品三级网站| 亚洲欧美国产精品va在线观看| 成人毛片在线播放| 久久嫩草精品久久久久| 久久久精品在线视频| 亚洲国产欧美日韩在线观看第一区| 97视频com| 视频在线观看你懂的| 日韩欧美成人区| 91精品人妻一区二区| 久久五月激情| 亚洲精美视频| 成人黄色91| 欧美激情精品久久久久久蜜臀 | 欧洲精品二区| 欧美不卡一区二区三区四区| 久操视频免费在线观看| zzijzzij亚洲日本少妇熟睡| 国产精品视频一区二区三区四区五区| 视频国产一区| 国产精品亚洲自拍| 在线观看电影av| 亚洲精品美女久久久| 日韩av免费播放| 国产精品久久久久久久久果冻传媒 | 精品欧美国产一区二区三区| 国产熟妇搡bbbb搡bbbb| 日韩精品一区第一页| 免费国产成人看片在线| 久久草在线视频| 国产精品精品久久久| 国产美女在线观看| 亚洲国产天堂久久国产91| jizz18女人高潮| 久久精品国产秦先生| 日韩一区二区高清视频| 神马香蕉久久| 成人午夜两性视频| 华人av在线| 日韩视频第一页| 日韩一级片免费| 欧美色国产精品| 国产无遮挡免费视频| 国产日韩欧美电影| 日韩精品国产一区| 奇米色一区二区| 欧美黑人在线观看| 成人嘿咻视频免费看| 成人三级在线| 国外成人福利视频| 57pao成人国产永久免费| 欧美日韩在线看片| 亚洲欧美国产精品va在线观看| 国产高清视频免费观看| 色狠狠一区二区| 午夜偷拍福利视频| 国产精品国产三级国产aⅴ入口| 中文字幕99页| 久久福利资源站| 波多野结衣家庭教师视频| 欧美成人高清| 午夜精品一区二区三区在线观看 | 雨宫琴音一区二区在线| 亚洲欧美丝袜| 五月综合久久| 99久久自偷自偷国产精品不卡| 桃子视频成人app| 久久久噜噜噜久久久| 免费高清在线观看| 亚洲最大中文字幕| 九色视频在线播放| 亚洲国产日韩欧美在线图片 | 精品视频久久久| 超碰在线播放97| 4438亚洲最大| 91激情在线观看| 加勒比中文字幕精品| 久久先锋影音av鲁色资源网| 中文字幕亚洲乱码| 麻豆精品网站| 日韩av三级在线| 91久久亚洲| 国产在线视频在线| 你懂的视频一区二区| 裸体大乳女做爰69| 99久久这里只有精品| 亚洲一二三区精品| 国产a亚洲精品| 亲爱的老师9免费观看全集电视剧| 成人福利影视| 久久久久久久一区二区| 色呦呦在线视频| 欧美大片欧美激情性色a∨久久| 最新av网站在线观看 | 日本中文字幕视频在线| 亚洲欧美综合图区| 北岛玲日韩精品一区二区三区| 亚洲欧洲国产精品| 国产精品视频一区二区久久| 亚洲男人7777| 国产精品免费观看| 这里只有精品在线播放| 天堂а√在线资源在线| 精品国偷自产在线| 中文字幕资源网在线观看| 欧美国产高跟鞋裸体秀xxxhd| 日本无删减在线| 性色av一区二区三区在线观看 | 日本免费一区二区三区视频观看| aa级大片免费在线观看| 国产91精品久久久久| 我爱我色成人网| 国产日韩av在线播放| 麻豆精品国产| 国产免费一区| 国产a久久精品一区二区三区| 五月天亚洲综合| 综合一区av| 免费在线观看视频a| 欧美资源在线| 亚洲第一天堂久久| 懂色一区二区三区免费观看| xxxx黄色片| 中文字幕高清一区| 久一区二区三区| 日韩欧美成人精品| 国产影视一区二区| 亚洲精品aⅴ中文字幕乱码 | 99视频有精品高清视频| 国产伦精品一区二区三区四区视频 | 国产一区二区三区站长工具| 亚洲精品视频一二三| 欧美aa国产视频| 无码人妻丰满熟妇区毛片18 | 9191在线视频| www国产成人| 三级黄色录像视频| 五月婷婷色综合| 91av国产精品| 亚洲国产日韩欧美在线动漫| 1024国产在线| 97精品视频在线观看| 九九九精品视频| 国产伦理一区二区三区| 日本一本不卡| 激情伊人五月天| 精品一区二区成人精品| aaaa黄色片| 亚洲男人的天堂av| 69视频免费看| 日韩精品一区二| av在线三区| 69av视频在线播放| 国产精品中文| 日韩精品成人一区二区在线观看| 国产精品啊啊啊| 日本在线一二三区| 26uuu国产在线精品一区二区| 国产成人av免费在线观看| 色综合激情久久| 可以免费看毛片的网站| 久久韩国免费视频| 日韩网站中文字幕| 精品国产免费久久久久久尖叫| 亚洲国产精品久久久久蝴蝶传媒| 18岁视频在线观看| 91亚洲精品久久久蜜桃| 男女免费视频网站| 这里只有精品免费| 日本视频不卡| 国产精品男人的天堂| 九九热爱视频精品视频| 黄页免费在线观看视频| 国产精品12区| 一卡二卡三卡四卡五卡| 亚洲国产精品传媒在线观看| 国产一级做a爱片久久毛片a| 日韩精品一区二区三区蜜臀| 免费av在线网址| 国产精品高潮呻吟久久av野狼| 亚洲a级精品| 国产老熟妇精品观看| 粉嫩嫩av羞羞动漫久久久| 一区二区在线观看免费视频| 欧美精品tushy高清| 亚洲1卡2卡3卡4卡乱码精品| 国产美女精品视频| 日本欧美国产| 日韩一级免费片| 国产精品久久久久久亚洲伦| 中国女人一级一次看片| 亚洲欧洲高清在线| av一区在线播放| 亚洲欧美国产不卡| 久久国产精品色婷婷| 国产极品美女在线| 宅男噜噜噜66一区二区66| av文字幕在线观看| 91九色露脸| 伊人影院久久| 国产白嫩美女无套久久| 岛国av一区二区在线在线观看| 午夜小视频在线播放| 日韩av毛片网| 日韩理论片av| 尤物网站在线看| 一区二区高清视频在线观看| 好吊色在线观看| 98视频在线噜噜噜国产| 亚洲最好看的视频| 性chinese极品按摩| 综合在线观看色| 黄色片一区二区| 性金发美女69hd大尺寸| 久久99久久人婷婷精品综合 | 久久久久亚洲AV成人| 精品对白一区国产伦| 热色播在线视频| 色噜噜色狠狠狠狠狠综合色一| 蜜桃视频在线观看一区二区| 青青草免费av| 亚洲激情视频在线| 素人一区二区三区| 97在线免费视频观看| 99re亚洲国产精品| 这里只有精品6| 欧美风情在线观看| 亚洲午夜久久| 超碰成人在线播放| 精品免费在线观看| jizz视频在线观看| 国产精品jizz视频| 奇米影视在线99精品| 久久久久无码精品国产| 亚洲欧美综合精品久久成人| 欧美成人一级| 国模吧无码一区二区三区| 国产精品成人一区二区三区夜夜夜| 黄色av免费观看| 国产精品美女主播在线观看纯欲| 午夜精品久久久久99热蜜桃导演 | 精品自拍偷拍|