成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

本篇作為《Spring Cloud微服務實戰》一書關于Spring Cloud Zuul網關在Dalston版本對異常處理的補充。沒有看過本書的讀書也不要緊,可以先閱讀我之前的兩篇博文:《Spring Cloud實戰小貼士:Zuul統一異常處理(一)》《Spring Cloud實戰小貼士:Zuul統一異常處理(二)》,這兩篇文章都詳細介紹和分析了Spring Cloud Zuul在過濾器設計中對異常處理的不足。同時,在這兩篇文章中,也針對不足之處做了相應的解決方案。不過,這些方案都是基于Brixton版本所做的,在***的Dalston版本中,Spring Cloud Zuul做了一些優化,所以我們不再需要做這些擴展就已經能夠正確的處理異常信息了。那么,在Dalston版中,Spring Cloud Zuul中做了怎么樣的修改以達到之前我們自己擴展的效果呢?

過濾器類型的變更

讀者是否還記得我們之前分析了Spring Cloud Zuul自帶的核心過濾器有哪些呢?我們先根據下圖回憶一下:

這次主要將SendErrorFilter過濾器的類型從POST改為了ERROR,所以核心過濾器變成了如下圖的結構:

處理邏輯的變化

既然過濾器類型發生了變化,那么請求的處理生命周期就會有所變化。在變化之前,各階段過濾器的流轉如下圖所示:

針對異常情況,在圖中我們標出了不同的顏色。從pre和route階段拋出的異常將會進入error階段,再進入到post階段進行返回。由于SendErrorFilter需要判斷請求上下文中是否包含error.status_code屬性:有的話就用SendErrorFilter處理錯誤結果;沒有的話就用SendResponseFilter返回正常結果,但是error.status_code屬性默認是在各個階段過濾器中自己put進去的,這就導致,各個階段過濾器拋出異常之后,是沒有辦法返回錯誤結果的。因此,我們擴展了一個ErrorFilter來捕獲異常,然后手工的設置error.status_code屬性,讓SendErrorFilter能正常運作。

通過上面你的改造,從pre和route階段的異常都能處理了,但是post階段拋出異常后,是不會再進入post階段的,這使得ErrorFilter設置了設置error.status_code屬性之后,也沒有過濾器去組織返回結果,所以我們通過繼承SendErrorFilter在error階段增加了一個返回錯誤信息的過濾器。

而這次在Dalston版本中,做了很巧妙的變動:就是上文所述的對SendErrorFilter過濾器類型的變更,這一變動使得所有階段的異常都會被SendErrorFilter處理,直接解決的上面的第二個問題。當然只是做個變動還是不夠的,為了區分SendErrorFilter和SendResponseFitler分別處理出現異常和未出現異常的情況,修改原來根據error.status_code屬性判斷的邏輯,而是改為根據請求上下文中是否包含Throwable來作為基本依據,而這個對象是在過濾器出現異常之后,Zuul往請求上下文中置入的,所以可以更為準確的判斷當前請求處理是否出現了異常,而不再需要我們之前擴展的ErrorFilter了。

  1. public class SendErrorFilter extends ZuulFilter {    
  2.     @Override 
  3.     public boolean shouldFilter() { 
  4.         RequestContext ctx = RequestContext.getCurrentContext(); 
  5.         return ctx.containsKey("error.status_code"
  6.                 && !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false); 
  7.     } 
  8.     ... 
  9. public class SendResponseFilter extends ZuulFilter { 
  10.     @Override 
  11.     public boolean shouldFilter() { 
  12.         RequestContext context = RequestContext.getCurrentContext(); 
  13.         return context.getThrowable() == null 
  14.             && (!context.getZuulResponseHeaders().isEmpty() 
  15.                 || context.getResponseDataStream() != null 
  16.                 || context.getResponseBody() != null); 
  17.     } 
  18.     ... 

所以,***修改之后,整個處理邏輯變為如下圖所示的流程:

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

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-05-18 14:14:25

過濾器Spring ClouZuul

2017-05-19 15:13:05

過濾器Spring ClouZuul

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流程注解

2017-04-12 14:43:01

Spring ClouZuul過濾器

2024-08-05 10:03:53

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技術棧公眾號

主站蜘蛛池模板: 日韩有码一区 | 午夜精品久久久久久久久久久久久 | 亚洲精品九九 | 一级免费毛片 | 久久久123 | 亚洲综合一区二区三区 | 天堂在线www| 日本高清中文字幕 | 91精品国产欧美一区二区 | av三级在线观看 | 成人精品一区二区三区四区 | 二区在线视频 | 久久免费精品视频 | 国产免费一区二区 | 午夜丰满少妇一级毛片 | www.欧美.com | 1000部精品久久久久久久久 | 午夜av电影 | 欧美高清视频 | 欧美最猛黑人xxxx黑人 | 久久久999成人 | 午夜日韩精品 | 日本特黄a级高清免费大片 国产精品久久性 | 成人a在线观看 | 国产www.| 男女羞羞视频在线 | 国产精品a久久久久 | 成人精品国产一区二区4080 | 亚洲激情在线观看 | 国产日韩免费观看 | 精品熟人一区二区三区四区 | 国产高清视频在线观看播放 | av日韩高清 | 久久亚洲一区二区 | www日本在线 | 在线免费观看成人 | 午夜爱爱毛片xxxx视频免费看 | 福利影院在线看 | 手机三级电影 | 国产免费人成xvideos视频 | www.99热.com|