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

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

開發 開發工具
在之前的文章中,我們詳細介紹了Spring Cloud Zuul中自己實現的一些核心過濾器,以及這些過濾器在請求生命周期中的不同作用。本文將介紹如何利用error過濾器來實現統一的異常處理。

在上一篇《Spring Cloud源碼分析(四)Zuul:核心過濾器》一文中,我們詳細介紹了Spring Cloud Zuul中自己實現的一些核心過濾器,以及這些過濾器在請求生命周期中的不同作用。我們會發現在這些核心過濾器中并沒有實現error階段的過濾器。那么這些過濾器可以用來做什么呢?接下來,本文將介紹如何利用error過濾器來實現統一的異常處理。

[[191637]]

過濾器中拋出異常的問題

首先,我們可以來看看默認情況下,過濾器中拋出異常Spring Cloud Zuul會發生什么現象。我們創建一個pre類型的過濾器,并在該過濾器的run方法實現中拋出一個異常。比如下面的實現,在run方法中調用的doSomething方法將拋出RuntimeException異常。

  1. public class ThrowExceptionFilter extends ZuulFilter { 
  2.     private static Logger log = LoggerFactory.getLogger(ThrowExceptionFilter.class); 
  3.     @Override 
  4.     public String filterType() { 
  5.         return "pre"; 
  6.     } 
  7.     @Override 
  8.     public int filterOrder() { 
  9.         return 0; 
  10.     } 
  11.     @Override 
  12.     public boolean shouldFilter() { 
  13.         return true; 
  14.     } 
  15.     @Override 
  16.     public Object run() { 
  17.         log.info("This is a pre filter, it will throw a RuntimeException"); 
  18.         doSomething(); 
  19.         return null; 
  20.     } 
  21.     private void doSomething() { 
  22.         throw new RuntimeException("Exist some errors..."); 
  23.     } 

運行網關程序并訪問某個路由請求,此時我們會發現:在API網關服務的控制臺中輸出了ThrowExceptionFilter的過濾邏輯中的日志信息,但是并沒有輸出任何異常信息,同時發起的請求也沒有獲得任何響應結果。為什么會出現這樣的情況呢?我們又該如何在過濾器中處理異常呢?

解決方案一:嚴格的try-catch處理

回想一下,我們在上一節中介紹的所有核心過濾器,是否還記得有一個post過濾器SendErrorFilter是用來處理異常信息的?根據正常的處理流程,該過濾器會處理異常信息,那么這里沒有出現任何異常信息說明很有可能就是這個過濾器沒有被執行。所以,我們不妨來詳細看看SendErrorFilter的shouldFilter函數:

  1. public boolean shouldFilter() { 
  2.     RequestContext ctx = RequestContext.getCurrentContext(); 
  3.     return ctx.containsKey("error.status_code") && !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false); 

可以看到該方法的返回值中有一個重要的判斷依據ctx.containsKey("error.status_code"),也就是說請求上下文中必須有error.status_code參數,我們實現的ThrowExceptionFilter中并沒有設置這個參數,所以自然不會進入SendErrorFilter過濾器的處理邏輯。那么我們要如何用這個參數呢?我們可以看一下route類型的幾個過濾器,由于這些過濾器會對外發起請求,所以肯定會有異常需要處理,比如RibbonRoutingFilter的run方法實現如下:

  1. public Object run() { 
  2.     RequestContext context = RequestContext.getCurrentContext(); 
  3.     this.helper.addIgnoredHeaders(); 
  4.     try { 
  5.         RibbonCommandContext commandContext = buildCommandContext(context); 
  6.         ClientHttpResponse response = forward(commandContext); 
  7.         setResponse(response); 
  8.         return response; 
  9.     } 
  10.     catch (ZuulException ex) { 
  11.         context.set(ERROR_STATUS_CODE, ex.nStatusCode); 
  12.         context.set("error.message", ex.errorCause); 
  13.         context.set("error.exception", ex); 
  14.     } 
  15.     catch (Exception ex) { 
  16.         context.set("error.status_code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
  17.         context.set("error.exception", ex); 
  18.     } 
  19.     return null; 

可以看到,整個發起請求的邏輯都采用了try-catch塊處理。在catch異常的處理邏輯中并沒有做任何輸出操作,而是往請求上下文中添加一些error相關的參數,主要有下面三個參數:

  • error.status_code:錯誤編碼
  • error.exception:Exception異常對象
  • error.message:錯誤信息

其中,error.status_code參數就是SendErrorFilter過濾器用來判斷是否需要執行的重要參數。分析到這里,實現異常處理的大致思路就開始明朗了,我們可以參考RibbonRoutingFilter的實現對ThrowExceptionFilter的run方法做一些異常處理的改造,具體如下:

  1. public Object run() { 
  2.     log.info("This is a pre filter, it will throw a RuntimeException"); 
  3.     RequestContext ctx = RequestContext.getCurrentContext(); 
  4.     try { 
  5.         doSomething(); 
  6.     } catch (Exception e) { 
  7.         ctx.set("error.status_code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
  8.         ctx.set("error.exception", e); 
  9.     } 
  10.      return null; 

通過上面的改造之后,我們再嘗試訪問之前的接口,這個時候我們可以得到如下響應內容:

  1.     "timestamp": 1481674980376, 
  2.     "status": 500, 
  3.     "error": "Internal Server Error", 
  4.     "exception": "java.lang.RuntimeException", 
  5.     "message": "Exist some errors..." 

此時,我們的異常信息已經被SendErrorFilter過濾器正常處理并返回給客戶端了,同時在網關的控制臺中也輸出了異常信息。從返回的響應信息中,我們可以看到幾個我們之前設置在請求上下文中的內容,它們的對應關系如下:

  • status:對應error.status_code參數的值
  • exception:對應error.exception參數中Exception的類型
  • message:對應error.exception參數中Exception的message信息。對于message的信息,我們在過濾器中還可以通過ctx.set("error.message", "自定義異常消息");來定義更友好的錯誤信息。SendErrorFilter會優先取error.message來作為返回的message內容,如果沒有的話才會使用Exception中的message信息

解決方案二:ErrorFilter處理

通過上面的分析與實驗,我們已經知道如何在過濾器中正確的處理異常,讓錯誤信息能夠順利地流轉到后續的SendErrorFilter過濾器來組織和輸出。但是,即使我們不斷強調要在過濾器中使用try-catch來處理業務邏輯并往請求上下文添加異常信息,但是不可控的人為因素、意料之外的程序因素等,依然會使得一些異常從過濾器中拋出,對于意外拋出的異常又會導致沒有控制臺輸出也沒有任何響應信息的情況出現,那么是否有什么好的方法來為這些異常做一個統一的處理呢?

這個時候,我們就可以用到error類型的過濾器了。由于在請求生命周期的pre、route、post三個階段中有異常拋出的時候都會進入error階段的處理,所以我們可以通過創建一個error類型的過濾器來捕獲這些異常信息,并根據這些異常信息在請求上下文中注入需要返回給客戶端的錯誤描述,這里我們可以直接沿用在try-catch處理異常信息時用的那些error參數,這樣就可以讓這些信息被SendErrorFilter捕獲并組織成消息響應返回給客戶端。比如,下面的代碼就實現了這里所描述的一個過濾器:

  1. public class ErrorFilter extends ZuulFilter { 
  2.     Logger log = LoggerFactory.getLogger(ErrorFilter.class); 
  3.     @Override 
  4.     public String filterType() { 
  5.         return "error"; 
  6.     } 
  7.     @Override 
  8.     public int filterOrder() { 
  9.         return 10; 
  10.     } 
  11.     @Override 
  12.     public boolean shouldFilter() { 
  13.         return true; 
  14.     } 
  15.     @Override 
  16.     public Object run() { 
  17.         RequestContext ctx = RequestContext.getCurrentContext(); 
  18.         Throwable throwable = ctx.getThrowable(); 
  19.         log.error("this is a ErrorFilter : {}", throwable.getCause().getMessage()); 
  20.         ctx.set("error.status_code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
  21.         ctx.set("error.exception", throwable.getCause()); 
  22.         return null; 
  23.     } 

在將該過濾器加入到我們的API網關服務之后,我們可以嘗試使用之前介紹try-catch處理時實現的ThrowExceptionFilter(不包含異常處理機制的代碼),讓該過濾器能夠拋出異常。這個時候我們再通過API網關來訪問服務接口。此時,我們就可以在控制臺中看到ThrowExceptionFilter過濾器拋出的異常信息,并且請求響應中也能獲得如下的錯誤信息內容,而不是什么信息都沒有的情況了。

  1.     "timestamp": 1481674993561, 
  2.     "status": 500, 
  3.     "error": "Internal Server Error", 
  4.     "exception": "java.lang.RuntimeException", 
  5.     "message": "Exist some errors..." 

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

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

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

2017-05-19 15:13:05

過濾器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路徑

2025-02-13 00:34:22

Spring對象系統

2021-04-30 07:34:01

Spring BootController項目

2023-11-28 14:32:04

2025-04-09 08:00:00

FastAPI統一響應全局異常處理

2017-08-10 16:14:07

FeignRPC模式

2021-06-29 19:26:29

緩存Spring CachSpring

2024-08-09 08:25:32

Spring流程注解

2017-09-26 16:17:39

Ribboneager-load模式

2019-08-22 14:02:00

Spring BootRestful APIJava

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架

2022-05-07 10:09:01

開發Java日志

2022-05-30 08:03:06

后端參數校驗異常處理

2023-11-30 07:00:56

SpringBoot處理器

2024-08-05 10:03:53

2017-04-12 14:43:01

Spring ClouZuul過濾器
點贊
收藏

51CTO技術棧公眾號

久久久99精品| 日本国产一级片| 青青视频在线观| 欧美亚洲三级| 深夜成人在线观看| 秋霞午夜鲁丝一区二区 | 欧美在线影院一区二区| 色一情一乱一伦一区二区三欧美| 国产精品白浆一区二小说| 欧美尿孔扩张虐视频| 在线免费观看日韩欧美| 在线视频一二三区| 精品美女视频在线观看免费软件 | 香蕉大人久久国产成人av| 亚洲综合一区在线| 欧美性bbwbbwbbwhd| 99久久夜色精品国产亚洲| 亚洲成人原创| www.美女亚洲精品| 精品人妻互换一区二区三区| 久久久久毛片免费观看| 在线观看一区二区精品视频| 奇米777四色影视在线看| 韩国中文字幕2020精品| 国产成人av电影在线| 国产精品91久久久久久| 精品成人免费视频| 亚洲精品91| 精品国产一区二区三区av性色 | 欧美色视频一区| 黄色www网站| 日本三级在线观看网站| 国产精品激情偷乱一区二区∴| 国产欧美精品一区二区| 欧美精品一二三四区| 亚洲二区精品| 欧美激情在线狂野欧美精品| 亚洲不卡在线播放| 日韩久久精品| 亚洲视频在线免费观看| 一级做a爰片毛片| 激情av综合| 日韩欧美精品在线视频| www.午夜av| av成人免费| 91福利视频网站| 韩日视频在线观看| 欧美xxxx视频| 亚洲一级在线观看| av动漫在线免费观看| 日本www在线观看视频| 国产精品网友自拍| 亚洲欧洲三级| 免费不卡视频| 欧美国产日本视频| 亚洲欧美国产精品桃花| 97人人在线| 中文字幕中文字幕中文字幕亚洲无线| 亚洲综合在线播放| 国产夫妻性生活视频| 韩国av一区二区三区四区| 国产一区二区在线免费视频| 中文字字幕在线中文乱码| 裸体在线国模精品偷拍| 国产专区欧美专区| 97人妻精品一区二区三区视频| 日韩图片一区| 欧美尤物巨大精品爽| 天堂网一区二区| 麻豆精品精品国产自在97香蕉| 欧美精品在线观看91| 免费中文字幕在线观看| 激情久久五月| 国产aaa精品| 这里只有久久精品视频| 久久av资源网| 91精品免费| 视频在线不卡| 中文字幕高清一区| 400部精品国偷自产在线观看| 国产中文字幕在线视频| 国产精品―色哟哟| 国产经典久久久| 爱啪视频在线观看视频免费| 欧美性一二三区| 热久久久久久久久| 国产精品x8x8一区二区| 亚洲精品自在久久| 国产日产精品一区二区三区的介绍| 一个色免费成人影院| 永久555www成人免费| 在线免费日韩av| 国产精品呻吟| 成人午夜激情网| 免费国产羞羞网站视频| 欧美国产精品中文字幕| 日韩精品久久一区二区| 免费日韩电影| 日韩欧美色综合| 先锋影音av在线| 国内一区二区三区| 国产精品美女呻吟| 男人天堂手机在线观看| 国产精品系列在线| 日韩国产欧美亚洲| 午夜不卡一区| 日韩第一页在线| 亚洲最大的黄色网址| 久久免费黄色| 国产高清在线一区| 欧美性天天影视| 狠狠躁夜夜躁人人爽天天天天97| 男人天堂1024| 国产精品一级在线观看| 国产亚洲精品久久久久久| 精品一区二区三区人妻| 韩国理伦片一区二区三区在线播放| 国产精品入口福利| 日本免费一区视频| 亚洲精品日韩一| 免费看污黄网站| 香蕉国产成人午夜av影院| 欧美成年人视频网站| 最新国产中文字幕| 久久精品一级爱片| 日本欧美黄色片| 一区二区在线免费播放| xxx成人少妇69| 在线观看你懂的网站| 337p粉嫩大胆噜噜噜噜噜91av | 色乱码一区二区三区在线| 欧美挤奶吃奶水xxxxx| 久久伊人免费视频| 亚洲性在线观看| 国产三级三级三级精品8ⅰ区| 色女孩综合网| 波多视频一区| 精品视频—区二区三区免费| 黄色激情视频在线观看| 国产一区二区在线电影| 亚洲午夜精品一区二区| 日韩另类视频| 国产性色av一区二区| 国产高清中文字幕| 久久综合中文字幕| 日本精品www| 国产精品一区二区三区av麻| 91理论电影在线观看| 福利视频一区二区三区| 伊人福利在线| 精品免费国产二区三区 | xnxx国产精品| 欧美v在线观看| 免费短视频成人日韩| 日本高清视频精品| 国产精品免费观看| 欧美性生活大片视频| 永久免费毛片在线观看| 秋霞影院一区二区| 一区二区三区四区国产| 95精品视频| 欧美裸身视频免费观看| 免费观看成年人视频| 偷拍一区二区三区| 伊人网伊人影院| 蜜臀av亚洲一区中文字幕| 亚洲激情电影在线| 国产精品毛片无码| 欧美日韩高清区| 亚洲人视频在线观看| 日本道免费精品一区二区三区| 黄色三级视频在线播放| 国产中文一区| 久久亚洲综合网| 国产69精品久久| 久久成年人免费电影| 丰满人妻一区二区三区免费视频| 亚洲欧洲国产专区| 国产a级片视频| 免费视频一区二区三区在线观看| 99电影网电视剧在线观看| av人人综合网| 一本色道久久88精品综合| 国产精品主播一区二区| 午夜视频一区在线观看| 中文字幕第20页| 国产一区二区在线视频| 亚洲成人在线视频播放| 久久人人爽人人爽人人| 久久蜜臀精品av| www.久久av.com| 韩日在线一区| 日韩啊v在线| 伊人久久亚洲| 国产精品啪视频| 免费看电影在线| 在线播放日韩欧美| 动漫av一区二区三区| 在线免费观看视频一区| 国产精品99精品无码视| 欧美激情在线观看视频免费| 久久久男人的天堂| 免费成人在线视频观看| www.av片| 91精品婷婷色在线观看| 国产欧美丝袜| 日本综合视频| 久久免费精品视频| 久草资源在线观看| 国产成人三级在线播放 | 亚洲国产精品成人无久久精品| 国产精品一品视频| 熟女少妇精品一区二区| 国产精品尤物视频| 中文字幕精品一区二区精品绿巨人| 日韩手机在线观看视频| 国产精品大片免费观看| 免费不卡亚洲欧美| 成人自拍视频| 国产成人综合亚洲| 丁香花高清在线观看完整版| 最近2019中文免费高清视频观看www99 | 久久免费视频在线| 日韩大片在线永久免费观看网站| 午夜私人影院久久久久| 放荡的美妇在线播放| 国产欧美一区在线| 毛茸茸多毛bbb毛多视频| 国产传媒日韩欧美成人| 国产一线二线三线在线观看| 亚洲激情二区| 青青草免费在线视频观看| 视频在线不卡免费观看| 日韩色妇久久av| 全国精品免费看| 国产乱码精品一区二区三区不卡| 偷拍自拍在线看| 久久久久久久久久国产精品| 永久免费网站在线| 久久激情视频久久| 触手亚洲一区二区三区| 亚洲男人7777| 深夜影院在线观看| 亚洲国产欧美一区二区三区同亚洲 | 色先锋资源久久综合| 天海翼一区二区| 亚洲风情在线资源站| 欧美精品videos极品| 亚洲黄色片在线观看| 五月天丁香激情| 亚洲在线一区二区三区| 国产一级生活片| 亚洲国产精品久久人人爱| 久久久国产精品黄毛片| 亚洲一区二区三区视频在线 | 亚洲AV无码国产精品午夜字幕| 亚洲高清免费视频| 久久精品无码一区| 国产色综合久久| av在线免费播放网址| 最新国产精品久久精品| 黄色在线观看免费| 午夜国产精品影院在线观看| 全部毛片永久免费看| 欧美性猛交xxxx乱大交3| 中文字幕视频网站| 在线免费一区三区| 国产人妖一区二区三区| 日韩一区二区免费在线观看| 午夜精品久久久久久久99热黄桃 | 中文天堂在线一区| www中文在线| 夜夜揉揉日日人人青青一国产精品| 免费看91的网站| 亚洲欧美在线观看| 极品盗摄国产盗摄合集| 婷婷开心久久网| 中文亚洲av片在线观看| 日韩欧美国产综合在线一区二区三区 | 182在线视频| 国产日韩精品视频一区| 亚洲伦理一区二区三区| 亚洲国产aⅴ成人精品无吗| 少妇高潮av久久久久久| 欧美猛男gaygay网站| 欧美一级淫片aaaaaa| 国产一级揄自揄精品视频| 黄色国产网站在线播放| 欧美一级高清免费播放| 成人国产精品| 国产美女99p| 久久社区一区| 91好吊色国产欧美日韩在线| 男女性色大片免费观看一区二区| mm1313亚洲国产精品无码试看| 天天综合久久| 亚洲熟妇无码一区二区三区导航| 国产欧美日韩免费观看 | 亚洲精品一二三四五区| 精品午夜一区二区三区在线观看| 欧美日韩在线视频一区二区三区| 午夜精品国产| 国产女女做受ⅹxx高潮| 国产精品影视在线观看| 三上悠亚影音先锋| 一区二区三区国产| 久久久999久久久| 亚洲国产古装精品网站| 蜜桃视频网站在线观看| 欧美一级高清免费| 91成人精品在线| 在线观看亚洲视频啊啊啊啊| 久久国产精品久久久久久电车 | av最新在线观看| 欧美视频二区36p| av中文字幕免费在线观看| 精品亚洲男同gayvideo网站| 污片视频在线免费观看| 国产精品中文字幕在线| 午夜欧洲一区| 可以在线看的av网站| 国产精品白丝jk白祙喷水网站| 毛片毛片毛片毛片毛| 久久精品免费在线观看| 日韩成人免费在线观看| 91精品免费在线| 欧美精品电影| 国产美女精彩久久| 精品国产一区探花在线观看 | 欧美性生交xxxxx| 中文字幕一区在线观看| 加勒比在线一区| 国产丝袜视频一区| 九九精品调教| 99理论电影网| 亚洲91中文字幕无线码三区| 亚洲综合色在线观看| 国产网站一区二区| 91久久国产综合久久91| 日韩美女av在线| 亚洲免费福利| 欧美日韩精品中文字幕一区二区| 免费电影一区二区三区| 成人在线观看黄| 国产日韩欧美不卡在线| 久久这里只有精品9| 国产亚洲精品91在线| jizzyou欧美16| 亚洲图片小说在线| 韩国一区二区三区| 农村黄色一级片| 欧美电视剧在线看免费| 国产天堂在线播放视频| 国产区一区二区三区| 国产欧美一级| 亚洲成人黄色av| 欧美又粗又大又爽| 欧美激情午夜| 草莓视频一区| 国产日韩一区二区三区在线| 波多野结衣福利| 欧美性大战久久久久久久| 免费av毛片在线看| www.久久久| 国产精品毛片在线| 一级黄色录像毛片| 91精品国产综合久久香蕉的特点| 天天干天天舔天天射| 91成人免费观看网站| 欧美一区二区三| 亚洲欧美天堂在线| 亚洲成人在线观看视频| 日av在线播放| 91久久在线视频| 亚洲一级电影| 久久亚洲AV无码专区成人国产| 亚洲国产日韩av| 可以直接在线观看的av| 国产精品自拍小视频| 午夜亚洲福利| 亚洲欧美色图视频| 91.成人天堂一区| 91九色在线播放| 天堂一区二区三区| 国产成人免费在线观看不卡| 日韩熟女精品一区二区三区| 亚洲日本中文字幕免费在线不卡| 黄色成人在线| 狠狠色综合欧美激情| 欧美aⅴ一区二区三区视频| 欧洲第一无人区观看| 亚洲免费精彩视频| 国产美女视频一区二区| 黄色影院一级片| 亚洲婷婷在线视频| 深夜福利在线观看直播| 成人一区二区电影| 国产日韩欧美一区| 午夜爽爽爽男女免费观看| 亚洲乱码av中文一区二区|