struts启动过滤器异常_面试必备:网关异常了怎么办?如何做全局异常处理?
歡迎關注頭條號:老顧聊技術
精品原創技術分享,知識的組裝工
目錄
前言
我們平時在用SpringMVC的時候,只要是經過DispatcherServlet處理的請求,可以通過@ControllerAdvice和@ExceptionHandler自定義不同類型異常的處理邏輯。
具體可以參考老顧以前的文章,有過介紹
SpringMVC中提供的自定義異常體系在Spring-WebFlux中并不適用,其實原因很簡單,兩者底層的運行容器并不相同。WebExceptionHandler是Spring-WebFlux的異常處理器頂層接口,因此追溯到子類可以追蹤到DefaultErrorWebExceptionHandler是Spring Cloud Gateway的全局異常處理器,配置類是ErrorWebFluxAutoConfiguratio。
為什么要自定義異常處理
我們看一下上圖,網關在整個架構中的作用是
1、路由服務端應用的請求到后端應用
2、(聚合)后端應用的響應轉發到服務端應用
假設網關服務總是正常的前提下:
對于第1點來說,假設后端應用不能平滑無損上線,會有一定的幾率出現網關路由請求到一些后端的“僵尸節點(請求路由過去的時候,應用更好在重啟或者剛好停止)”,這個時候會路由會失敗拋出異常,一般情況是Connection Refuse。
對于第2點來說,假設后端應用沒有正確處理異常,那么應該會把異常信息經過網關轉發回到服務端應用,這種情況理論上不會出現異常。
其實還有第3點隱藏的問題,網關如果不單單承擔路由的功能,還包含了鑒權、限流等功能,如果這些功能開發的時候對異常捕獲沒有做完善的處理甚至是邏輯本身存在BUG,有可能導致異常沒有被正常捕獲處理,走了默認的異常處理器DefaultErrorWebExceptionHandler,默認的異常處理器的處理邏輯可能并不符合我們預期的結果。
如何自定義異常處理
我們可以先看默認的異常處理器的配置類ErrorWebFluxAutoConfiguration:
注意到兩個Bean實例ErrorWebExceptionHandler和DefaultErrorAttributes都使用了@ConditionalOnMissingBean注解,也就是我們可以通過自定義實現去覆蓋它們。先自定義一個CustomErrorWebFluxAutoConfiguration(除了ErrorWebExceptionHandler的自定義實現,其他直接拷貝ErrorWebFluxAutoConfiguration):
errorWebExceptionHandler方法中替換自定義的ErrorWebExceptionHandler
自定義的JsonErrorWebExceptionHandler如下:
上面的代碼中,三個注意點
1、getErrorAttributes用來自定義返回參數,當然小伙伴可以根據自身業務,更細致的區分返回參數。
2、getHttpStatus返回Http的狀態碼,也可以結合業務區分不同的狀態碼
3、異常時如何返回JSON而不是HTML?
getRoutingFunction方法,默認優先以Html格式返回
改為JSON格式,如下:
測試
測試場景一:只啟動網關,下游服務不啟動的情況下直接調用下游服務:
測試場景二:下游服務正常啟動和調用,網關自身拋出異常。 過濾器中加入代碼int a=1/0會產生異常。
總結
網關的異常處理是非常重要的,任何一個項目都需要自行定義本業務相關的異常,小伙伴可以關注自己公司的業務,是不是都有自定義異常?今天老顧就分享到這里。
---End---
最近老顧上傳了微服務網關的分享課程,請大家多多支持
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的struts启动过滤器异常_面试必备:网关异常了怎么办?如何做全局异常处理?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火狐浏览器 xml 解析错误:文档元素后
- 下一篇: 双流棠湖中学怎么样_棠湖中学教师团队荣获