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