精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲自拍电影| 蜜桃视频www网站在线观看| 激情久久五月天| 欧美激情视频播放| 蜜臀av一区二区三区有限公司| 成人国产网站| 亚洲老妇xxxxxx| 久久伦理网站| 91禁在线观看| 国产一区二区你懂的| 中文字幕精品—区二区| av电影中文字幕| 久久久人成影片一区二区三区在哪下载| 亚洲人亚洲人成电影网站色| 国产一区在线观| 亚洲天堂狠狠干| 99精品福利视频| 久久视频在线观看免费| 成年人在线观看av| 亚洲一区二区免费在线观看| 欧美色中文字幕| 日韩欧美国产综合在线| 成人短视频在线| 国产欧美一区二区三区网站| 国产视频精品网| 国产手机精品视频| 免费成人av资源网| 欧美最近摘花xxxx摘花| 久久综合色综合| 99久久久久久中文字幕一区| 国产一区二区三区在线观看网站 | 精品亚洲永久免费| 欧美成人激情| 亚洲天堂av网| 熟女俱乐部一区二区视频在线| 深夜激情久久| 欧美一区二区福利视频| 在线观看日本一区二区| 国产精品字幕| 在线观看国产91| 日韩毛片在线免费看| 日韩久久久久久久久久久久| 中文在线a天堂| 美女视频一区免费观看| 欧美精品成人91久久久久久久| 日本免费网站视频| 精品久久影院| 亚洲欧洲国产伦综合| 色呦呦一区二区| 欧美三级电影在线| 亚洲精品国产成人| 性囗交免费视频观看| 91精品短视频| 亚洲高清色综合| 超碰caoprom| 欧美日韩一区二区三区在线电影| 亚洲第一天堂无码专区| 亚洲国产精品无码久久久久高潮| 国产一区在线电影| 亚洲国产成人久久综合一区| 日韩av无码一区二区三区不卡 | 丝袜美腿亚洲色图| 国产盗摄xxxx视频xxx69| 波多野结衣黄色| 免费成人美女在线观看| 91精品久久久久久久久青青| 国产乱码精品一区二三区蜜臂| 久久99热这里只有精品| 91传媒视频在线观看| 亚洲va欧美va| wwwwxxxxx欧美| 日韩一二三区不卡在线视频| 亚洲天天影视| 亚洲最快最全在线视频| 免费在线激情视频| 色豆豆成人网| 日韩一区二区在线看| 性久久久久久久久久久| 国产真实有声精品录音| 久久精品福利视频| 国产精品99re| 日韩在线观看一区二区| 成人性生交大片免费看小说| 亚洲第一免费视频| 国产亚洲1区2区3区| 亚洲在线色站| 国内高清免费在线视频| 日韩欧美国产中文字幕| 福利片一区二区三区| 亚洲乱码一区| 亚洲免费影视第一页| 国产色无码精品视频国产| 亚洲无线视频| 国产精品久久久久aaaa九色| 国产女人高潮时对白| 91在线视频免费观看| 丝袜足脚交91精品| 97超碰免费在线| 欧美亚洲禁片免费| 亚洲中文字幕无码一区| 色中色综合网| 欧美性视频精品| 国产黄色片网站| 亚洲国产成人一区二区三区| 成人免费观看cn| 伊人久久大香| 日韩欧美一级精品久久| 中文字幕99页| 婷婷激情图片久久| 日韩av片电影专区| 黄色av网站免费在线观看| 国产丝袜美腿一区二区三区| 一区二区视频在线观看| 午夜伦理在线视频| 欧美日韩一区精品| 午夜理伦三级做爰电影| 在线看片一区| 91精品综合久久| 免费**毛片在线| 91黄色免费观看| 色噜噜在线观看| 欧美不卡在线| 成人黄色免费在线观看| av资源网在线观看| 欧美午夜精品久久久久久人妖 | 97在线视频国产| www久久久com| 最新热久久免费视频| 青青草av网站| 国产一区二区三区四区五区传媒 | 五月婷婷激情视频| 99久久99久久免费精品蜜臀| 欧美黄网在线观看| 日韩中文字幕在线一区| 久久久精品视频在线观看| 中文人妻熟女乱又乱精品| 久久久久久久网| 国产成人在线免费看| 日韩精品亚洲aⅴ在线影院| 久热99视频在线观看| 一级片aaaa| 国产精品美女久久福利网站| 日本免费观看网站| 精品72久久久久中文字幕| 欧洲成人在线视频| 欧美捆绑视频| 在线影视一区二区三区| av男人的天堂av| 毛片一区二区| 日韩精品久久久| 欧美性片在线观看| 中文字幕欧美精品日韩中文字幕| 日韩精品一区二区亚洲av观看| 久久久91精品国产一区二区精品| 日韩精品一区中文字幕| 日韩激情一区| 91亚洲精品在线| 午夜伦理大片视频在线观看| 亚洲第一男人天堂| 中文人妻av久久人妻18| 中文字幕免费观看一区| www.超碰97.com| 中文字幕乱码亚洲无线精品一区| 亚洲a区在线视频| 免费污视频在线| 日韩电影大全免费观看2023年上| 中文字幕视频网| 国产欧美一区二区在线观看| 亚洲综合激情视频| 狠狠综合久久| 欧美一区二区三区在线免费观看| 久久亚洲精品爱爱| 久久天堂av综合合色| 亚洲欧美另类日韩| 日本韩国精品一区二区在线观看| 国产农村妇女精品一区| 国产老妇另类xxxxx| 青青青免费在线| 精品国产乱码久久久久久果冻传媒| 国产精品日本精品| av免费看在线| 亚洲精品有码在线| 艳妇乳肉豪妇荡乳av| 一区二区三区高清| 免费污网站在线观看| 国产资源精品在线观看| 99爱视频在线| 国产精品久久久久无码av| 国产区日韩欧美| 成人a在线观看高清电影| 久久免费高清视频| 成人在线免费观看| 亚洲成人精品视频在线观看| 久草视频在线免费| 亚洲成人综合视频| 欧美88888| 91美女片黄在线| 亚洲综合123| 日韩精品一区第一页| 菠萝蜜视频在线观看入口| 成人6969www免费视频| 国产久一道中文一区| 99久久这里有精品| 日韩男女性生活视频| 欧美大胆的人体xxxx| 中日韩午夜理伦电影免费| 午夜成人免费影院| 欧美一区二区免费视频| 亚洲视屏在线观看| 狠狠色噜噜狠狠狠狠97| 欧美卡一卡二卡三| 国产精品家庭影院| 一区二区三区久久久久| 懂色av一区二区三区免费观看| 日韩肉感妇bbwbbwbbw| 亚洲在线日韩| 国产freexxxx性播放麻豆| 91九色精品| 一区二区冒白浆视频| 国产免费播放一区二区| 久久99精品久久久久久水蜜桃 | 欧美日韩在线精品| 国产亚洲成av人片在线观黄桃| 亚洲va久久久噜噜噜| 国产亚洲人成a在线v网站| 国产极品精品在线观看| 亚洲欧洲美洲av| 97精品视频在线| 爱看av在线入口| 欧美噜噜久久久xxx| 国产视频中文字幕在线观看| 色妞一区二区三区| 香蕉视频国产在线观看| 一区二区成人av| www.视频在线.com| 中文字幕免费国产精品| 98在线视频| 日韩中文视频免费在线观看| 日韩在线免费电影| 深夜福利91大全| 夜级特黄日本大片_在线| 丝袜情趣国产精品| 男人的天堂在线视频免费观看 | 国产福利91精品| 日本中文字幕在线不卡| 国产成人综合亚洲网站| 国产裸体视频网站| 国产不卡一区视频| 国产chinese中国hdxxxx| 成人黄色在线视频| 久久久亚洲av波多野结衣| 久久色成人在线| 日韩人妻无码精品综合区| 国产欧美精品一区| 婷婷国产成人精品视频| 亚洲人成人一区二区在线观看| 国产人妻精品一区二区三区不卡| 综合在线观看色| 欧美黑人一级片| 亚洲国产精品久久久久婷婷884| 中文在线观看免费网站| 第一福利永久视频精品| 欧美亚洲另类小说| 欧美精品tushy高清| 亚洲xxx在线| 亚洲欧美成人网| 一区二区三区视频在线观看视频| 欧美精品在线第一页| 9999热视频在线观看| 国产精品精品一区二区三区午夜版| www.久久| 国产日韩精品一区观看| 久久av资源| 99re99热| 国产精品一区毛片| 成年人三级黄色片| 国产69精品一区二区亚洲孕妇| 熟女俱乐部一区二区| 中文字幕一区二区三区蜜月| 久久久久久久久久久97| 91福利小视频| av一级黄色片| 亚洲免费高清视频| 八戒八戒神马在线电影| 日本精品性网站在线观看| 日韩伦理一区二区| 精品欧美一区二区在线观看视频 | 欧美成人免费小视频| 中文在线а√在线8| 成人在线激情视频| 欧美亚洲大陆| 好吊色视频988gao在线观看| 久久电影一区| 波多野吉衣在线视频| 国产欧美日韩不卡| 日韩三级视频在线| 正在播放一区二区| 国产一二三在线观看| 欧美多人乱p欧美4p久久| 精品国产欧美日韩一区二区三区| 成人精品一二区| 日韩电影二区| 97超碰青青草| 粉嫩蜜臀av国产精品网站| 长河落日免费高清观看| 欧美日韩日本国产| www.97超碰| 久久精品视频网站| 国产亚洲一区二区手机在线观看| 成人欧美一区二区| 国产精品99一区二区三| www日韩视频| 91在线视频播放地址| 久久久久久欧美精品se一二三四| 欧美日韩在线播放| 国产色a在线| 欧美综合在线第二页| 精品国产乱子伦一区二区| 黄色a级在线观看| 蜜臀va亚洲va欧美va天堂| 三上悠亚ssⅰn939无码播放| 亚洲成人黄色影院| www.久久伊人| 久久福利网址导航| 亚洲精品777| 一区视频二区视频| 美女在线一区二区| 欧美亚洲色综久久精品国产| 一本色道久久综合亚洲91| 亚洲 国产 欧美 日韩| 久久免费视频网站| 99re6热只有精品免费观看| 国产资源第一页| 国内精品视频一区二区三区八戒| 精品一区二区6| 欧美色区777第一页| 1024国产在线| 成人在线免费观看视视频| 亚洲电影在线一区二区三区| www.cao超碰| 最新日韩av在线| 性一交一乱一乱一视频| 欧美—级高清免费播放| 国产 日韩 欧美 综合 一区| 成人黄色大片网站| 99久久精品免费| 久久久久久91亚洲精品中文字幕| 精品亚洲国产视频| 欧美理论影院| 亚洲美女搞黄| 黑人巨大精品欧美黑白配亚洲| 国产大学生自拍| 精品电影一区二区三区| 色戒汤唯在线观看| 欧美一区激情视频在线观看| 日本女人一区二区三区| 美女三级黄色片| 日韩欧美国产麻豆| 国产蜜臀av在线播放| 久久国产精品99久久久久久丝袜| 天使萌一区二区三区免费观看| 日本欧美一区二区三区不卡视频| 欧美日本一区二区三区| 欧美24videosex性欧美| 精品免费一区二区三区蜜桃| 日韩经典中文字幕一区| 免费看一级大片| 亚洲韩国青草视频| 日韩成人影音| 老司机午夜免费福利视频| 成人午夜碰碰视频| 超碰在线观看91| 不卡av在线播放| 久久精品色综合| 一本岛在线视频| 亚洲风情在线资源站| 黄色在线播放| 91久久精品国产91久久性色tv| 中文一区二区| 91传媒免费观看| 亚洲精品美女在线| 成人性片免费| 黄页免费在线观看视频| 国产精品久久久久一区二区三区 | 亚洲欧美激情插 | 日韩中文字幕不卡视频| 99久久人爽人人添人人澡| 狠狠热免费视频| 亚洲成人久久影院| seseavlu视频在线| 成人av中文| 捆绑紧缚一区二区三区视频| 日本天堂在线视频| 久久久电影免费观看完整版| 亚洲永久精品唐人导航网址| 日本一二三四区视频| 欧洲一区二区三区在线| 国产精品电影| 日韩不卡一二区| 国产精品久久久久三级|