最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式

 更新時間:2021年06月24日 09:11:58   作者:zf12178  
這篇文章主要介紹了SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

如何優(yōu)雅地處理微服務(wù)間調(diào)用的異常

現(xiàn)在微服務(wù)架構(gòu)盛行,其中spring cloud方案就很具有代表。

那么在微服務(wù)之間進行調(diào)用,如果被調(diào)用的服務(wù)掛了,調(diào)用方如何感知呢?

一、加上hystrix熔斷

在定義feignClient的地方指定熔斷,如下圖

熔斷

當(dāng)被調(diào)用服務(wù)不可用或者被調(diào)用方發(fā)生錯誤的時候,會觸發(fā)熔斷,但是,如果被調(diào)用方拋出異常,調(diào)用方怎么知道究竟是出了什么問題呢?

那,這就出現(xiàn)了

二、feign全局異常處理

我們不得不提到feign提供的一個接口叫做ErrorDecoder, 是用來處理feign異常的,有一個方法需要實現(xiàn) public Exception decode(String s, Response response)

如下圖:

在這里插入圖片描述

這樣就會替換它默認(rèn)的feign異常處理,這樣就可以捕捉全局的異常了,但是又帶來一個新的問題,如果使用這個ErrorDecoder,得關(guān)閉熔斷,否者這里拋出的FeignBadRequestException異常又會被hystrix吞掉,那,有沒有更好的辦法呢?

在被調(diào)用的controller方法里面捕捉全局異常,發(fā)生錯誤的時候,把異常保存一個對象里面,然后用該對象進行服務(wù)間的通信,調(diào)用方收到結(jié)果再檢查是否包含錯誤,這個方式確實可以解決,但,這肯定不是個好辦法;那么有沒有更好的辦法呢?跳出ErrorDecoder后,會經(jīng)過在AbstractCommand里面的一個executeCommandAndObserve方法里面有個function叫做 handleFallback

由此可知,當(dāng)拋出的異常是HystrixBadRequestException時,直接拋出異常,不再經(jīng)過fallback,那么我們的解決辦法就有了,那就是調(diào)整FeignBadRequestException 的繼承對象,如圖

調(diào)整異常繼承方案

現(xiàn)在,就實現(xiàn)了服務(wù)端不可用和服務(wù)端報錯的異常分離,但是可能,有的同學(xué)已經(jīng)注意到了,F(xiàn)eignClientErrorDecoder這個異常處理類里面是是針對狀態(tài)為SERVICE_UNAVAILABLE的進行了特別處理,為社么要這樣?這是因為與被調(diào)用方約定當(dāng)狀態(tài)碼為 SERVICE_UNAVAILABLE 的時候視為被調(diào)用方主動拋出的異常

需要注意的地方

我們的被調(diào)用方除了提供微服務(wù)之間調(diào)用,很可能也提供了面向前端的接口,為了封裝我們程序內(nèi)部的異常,通常我們會定義個全局異常捕捉類,即使報錯了,我們也提供一個友好的交互方式,比如下面這樣

第一處我們除了系統(tǒng)內(nèi)部拋出的異常,第二處處理其它異常,也就是說,不管拋出什么錯,該服務(wù)都會返回一個狀態(tài)值為200的信息出去,那么問題來了,我們微服務(wù)間的調(diào)用也會被處理成200,從而導(dǎo)致feign會以為服務(wù)是正常的,正常返回結(jié)果了,沒有報錯,那怎么辦?

三、針對內(nèi)部調(diào)用的特殊處理

當(dāng)然,你可能想到了,我們可以在提供給內(nèi)部使用的接口進行異常轉(zhuǎn)換,然后讓全局異常處理處不進行這樣的處理,但是,每個內(nèi)部接口都要進行全局異常捕捉,然后轉(zhuǎn)換,這,明顯不是最好的做法

四、通過注解標(biāo)記為接口為內(nèi)部調(diào)用接口

先定義一個注解,直接上圖

注解

我們定義該注解為方法和類上都可以使用,然后再定義處理程序

在這里插入圖片描述

處理程序要做一件事情,就是在程序方法異常的時候,將http狀態(tài)碼設(shè)置為我們約定的SERVICE_UNAVAILABLE,然后看下怎么使用

標(biāo)記異常

這樣我們把該方法標(biāo)記為了供內(nèi)部使用的接口,當(dāng)然,同樣也可以將注解放在類上,這樣就可以把該類的全部方法標(biāo)記為內(nèi)部調(diào)用。

至此,我們現(xiàn)在調(diào)用其它服務(wù)的方法,就可以調(diào)用本地的一樣了,當(dāng)然,如果你想在調(diào)用其它服務(wù)的方法報錯后想繼續(xù)執(zhí)行其它邏輯,同樣也可以,直接catch FeignBadRequestException 這個異常就可以了

微服務(wù)間調(diào)用異常改參

兩個微服務(wù)之間通過feign調(diào)用時,后臺拋出異常:

feign.RetryableException: Read timed out executing POST

解決方法:

在你的yml文件中添加

ribbon:  
  ReadTimeout: 60000  
  ConnectTimeout: 60000

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于SpringSecurity簡介以及和Shiro的區(qū)別

    關(guān)于SpringSecurity簡介以及和Shiro的區(qū)別

    這篇文章主要介紹了關(guān)于SpringSecurity簡介以及和Shiro的區(qū)別,在Java應(yīng)用安全領(lǐng)域,Spring Security會成為被首先推崇的解決方案,就像我們看到服務(wù)器就會聯(lián)想到Linux一樣順理成章,需要的朋友可以參考下
    2023-07-07
  • Java之字節(jié)碼以及優(yōu)勢案例講解

    Java之字節(jié)碼以及優(yōu)勢案例講解

    這篇文章主要介紹了Java之字節(jié)碼以及優(yōu)勢案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    這篇文章給大家詳細(xì)介紹了SpringBoot中Bean生命周期自定義初始化和銷毀方法,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Java ConcurrentHashMap用法案例詳解

    Java ConcurrentHashMap用法案例詳解

    這篇文章主要介紹了Java ConcurrentHashMap用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java對象與json對象之間互相轉(zhuǎn)換實現(xiàn)方法示例

    java對象與json對象之間互相轉(zhuǎn)換實現(xiàn)方法示例

    這篇文章主要介紹了java對象與json對象之間互相轉(zhuǎn)換實現(xiàn)方法,結(jié)合實例形式分析了java對象與json對象相互轉(zhuǎn)換實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • ElasticSearch6.2.3+head插件安裝的方法步驟

    ElasticSearch6.2.3+head插件安裝的方法步驟

    這篇文章主要介紹了ElasticSearch6.2.3+head插件安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之無權(quán)無向圖

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之無權(quán)無向圖

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之無權(quán)無向圖?,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼

    Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼

    這篇文章主要介紹了Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java正則判斷日期格式是否正確的方法示例

    Java正則判斷日期格式是否正確的方法示例

    這篇文章主要介紹了Java正則判斷日期格式是否正確的方法,結(jié)合實例形式分析了Java針對日期字符串正則判斷的相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • IDEA運行導(dǎo)入的javaweb項目tomcat正常,但是運行失敗404問題

    IDEA運行導(dǎo)入的javaweb項目tomcat正常,但是運行失敗404問題

    這篇文章主要介紹了IDEA運行導(dǎo)入的javaweb項目tomcat正常但是運行失敗404問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論

菏泽市| 邵东县| 锦屏县| 武功县| 文成县| 长宁县| 芜湖县| 蓬溪县| 双辽市| 康定县| 项城市| 邳州市| 苍梧县| 察雅县| 古交市| 梁河县| 贵南县| 恩施市| 石景山区| 洛阳市| 高台县| 民县| 贵阳市| 东光县| 社会| 乐至县| 嘉峪关市| 新安县| 交城县| 军事| 宝清县| 安图县| 永福县| 崇仁县| 含山县| 甘肃省| 红安县| 梁平县| 澳门| 禹州市| 德清县|