SpringCloud feign微服務調用之間的異常處理方式
如何優(yōu)雅地處理微服務間調用的異常
現在微服務架構盛行,其中spring cloud方案就很具有代表。
那么在微服務之間進行調用,如果被調用的服務掛了,調用方如何感知呢?
一、加上hystrix熔斷
在定義feignClient的地方指定熔斷,如下圖
當被調用服務不可用或者被調用方發(fā)生錯誤的時候,會觸發(fā)熔斷,但是,如果被調用方拋出異常,調用方怎么知道究竟是出了什么問題呢?
那,這就出現了
二、feign全局異常處理
我們不得不提到feign提供的一個接口叫做ErrorDecoder, 是用來處理feign異常的,有一個方法需要實現 public Exception decode(String s, Response response)
如下圖:
這樣就會替換它默認的feign異常處理,這樣就可以捕捉全局的異常了,但是又帶來一個新的問題,如果使用這個ErrorDecoder,得關閉熔斷,否者這里拋出的FeignBadRequestException異常又會被hystrix吞掉,那,有沒有更好的辦法呢?
在被調用的controller方法里面捕捉全局異常,發(fā)生錯誤的時候,把異常保存一個對象里面,然后用該對象進行服務間的通信,調用方收到結果再檢查是否包含錯誤,這個方式確實可以解決,但,這肯定不是個好辦法;那么有沒有更好的辦法呢?跳出ErrorDecoder后,會經過在AbstractCommand里面的一個executeCommandAndObserve方法里面有個function叫做 handleFallback
由此可知,當拋出的異常是HystrixBadRequestException時,直接拋出異常,不再經過fallback,那么我們的解決辦法就有了,那就是調整FeignBadRequestException 的繼承對象,如圖
現在,就實現了服務端不可用和服務端報錯的異常分離,但是可能,有的同學已經注意到了,FeignClientErrorDecoder這個異常處理類里面是是針對狀態(tài)為SERVICE_UNAVAILABLE的進行了特別處理,為社么要這樣?這是因為與被調用方約定當狀態(tài)碼為 SERVICE_UNAVAILABLE 的時候視為被調用方主動拋出的異常
需要注意的地方
我們的被調用方除了提供微服務之間調用,很可能也提供了面向前端的接口,為了封裝我們程序內部的異常,通常我們會定義個全局異常捕捉類,即使報錯了,我們也提供一個友好的交互方式,比如下面這樣
第一處我們除了系統(tǒng)內部拋出的異常,第二處處理其它異常,也就是說,不管拋出什么錯,該服務都會返回一個狀態(tài)值為200的信息出去,那么問題來了,我們微服務間的調用也會被處理成200,從而導致feign會以為服務是正常的,正常返回結果了,沒有報錯,那怎么辦?
三、針對內部調用的特殊處理
當然,你可能想到了,我們可以在提供給內部使用的接口進行異常轉換,然后讓全局異常處理處不進行這樣的處理,但是,每個內部接口都要進行全局異常捕捉,然后轉換,這,明顯不是最好的做法
四、通過注解標記為接口為內部調用接口
先定義一個注解,直接上圖
我們定義該注解為方法和類上都可以使用,然后再定義處理程序
處理程序要做一件事情,就是在程序方法異常的時候,將http狀態(tài)碼設置為我們約定的SERVICE_UNAVAILABLE,然后看下怎么使用
這樣我們把該方法標記為了供內部使用的接口,當然,同樣也可以將注解放在類上,這樣就可以把該類的全部方法標記為內部調用。
至此,我們現在調用其它服務的方法,就可以調用本地的一樣了,當然,如果你想在調用其它服務的方法報錯后想繼續(xù)執(zhí)行其它邏輯,同樣也可以,直接catch FeignBadRequestException 這個異常就可以了
微服務間調用異常改參
兩個微服務之間通過feign調用時,后臺拋出異常:
feign.RetryableException: Read timed out executing POST
解決方法:
在你的yml文件中添加
ribbon: ReadTimeout: 60000 ConnectTimeout: 60000
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springBoot啟動時讓方法自動執(zhí)行的幾種實現方式
這篇文章主要介紹了springBoot啟動時讓方法自動執(zhí)行的幾種實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03教你使用eclipse?搭建Swt?環(huán)境的全過程
本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12