亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何解決springcloud feign 首次調(diào)用100%失敗的問(wèn)題

 更新時(shí)間:2021年06月23日 11:38:13   作者:lipengxs  
這篇文章主要介紹了如何解決springcloud feign 首次調(diào)用100%失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

敘述

在高并發(fā)情況下發(fā)布應(yīng)用時(shí),經(jīng)常會(huì)發(fā)現(xiàn)監(jiān)控中有很多超時(shí)報(bào)錯(cuò)或者斷路器打開,下圖中可以看到監(jiān)控情況,測(cè)試時(shí)也會(huì)偶現(xiàn)第一次feign調(diào)用出錯(cuò),第二次就會(huì)恢復(fù)正常。

分析

大家都知道,這里feign底層是集成的ribbon,這里ribbon也會(huì)有http連接池,這里的連接池是長(zhǎng)連接,定時(shí)初始化一批并銷毀舊連接,這里還包括一些上下文需要初始化,但是在容器初始化好時(shí),ribbon底層的client是未初始化的,當(dāng)?shù)谝淮握{(diào)用時(shí),有一個(gè)初始化過(guò)程會(huì)導(dǎo)致超時(shí),一般情況下會(huì)說(shuō)需要調(diào)整超時(shí)時(shí)間,但是在電商高并發(fā)情況下,這里肯定時(shí)不現(xiàn)實(shí)的,響應(yīng)請(qǐng)求都需要ms級(jí)別。

解決方案

ribbon饑餓加載

這里可以通過(guò)配置ribbon饑餓加載來(lái)減少出錯(cuò)次數(shù),如下:

ribbon:
  # 饑餓加載
  eager-load:
    # 是否開啟饑餓加載
    enabled: true
    # 饑餓加載的服務(wù)
    clients: demo-goods,demo-product

這里為什么說(shuō)不能完全解決呢?因?yàn)樵诎l(fā)布時(shí)流量切換的瞬間,流量太大,并不是僅僅ribbon需要初始化,hystrix、web容器線程池等都需要初始化或者擴(kuò)容,這里也需要耗時(shí),所以這里的饑餓加載僅僅只是做到了發(fā)布時(shí)減少錯(cuò)誤數(shù)。

zuul饑餓加載

網(wǎng)關(guān)作為對(duì)外請(qǐng)求的入口,zuul內(nèi)部使用Ribbon調(diào)用其他服務(wù),Spring Cloud默認(rèn)在第一次調(diào)用時(shí)懶加載Ribbon客戶端。zuul同樣需要維護(hù)一個(gè)相對(duì)的子應(yīng)用環(huán)境的上下文,所以也需要啟動(dòng)時(shí)饑餓加載。

zuul:
  ribbon:
    eager-load:
      enabled: true

springcloud 中Feign調(diào)用常見(jiàn)問(wèn)題

注: 本文基于Springcloud Edgware版本

一、Feign調(diào)用首次失敗問(wèn)題

1、Feign簡(jiǎn)介:

Feign是一個(gè)聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡(jiǎn)單。使用Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,F(xiàn)eign 整合了Ribbon。

2、原因分析:

Feign整合Hystrix組件后,Hystrix默認(rèn)的超時(shí)時(shí)間是1秒,如果超過(guò)這個(gè)時(shí)間尚未響應(yīng),將會(huì)進(jìn)入自定義的fallback代碼,往往首次請(qǐng)求會(huì)比較慢(由于Ribbon是懶加載的,在首次請(qǐng)求時(shí),才會(huì)開始初始化相關(guān)類),這個(gè)響應(yīng)時(shí)間可能就大于1秒了,出現(xiàn)調(diào)用失敗

3、解決方案

(1)增加Hystrix的超時(shí)時(shí)間,默認(rèn)為1s

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds:  10000

(2)配置餓加載(推薦使用)

ribbon:
  eager-load:
    clients:  project1,project2
    enabled:  true

(3)禁用Hystrix超時(shí)(不推薦使用)

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled:  false

(4)為fegin全局禁用hystrix(此種方式較為極端,不建議使用)

feign:
 hystrix:
  enabled: false

二、Feign整合Hystrix之后日志顯示問(wèn)題

1、解決方案

Feign整合Hystrix之后,當(dāng)調(diào)用失敗會(huì)走fallback邏輯,造成日志不顯示,往往我們需要看日志分析原因,進(jìn)行故障排查。

(1)在application中配置,開區(qū)Feign對(duì)Hystrix的支持

feign:
  hystrix:
    enabled: true

(2)編寫Feigin的客戶端以及回滾類

在客戶端FeignClient注解配置相對(duì)應(yīng)的回滾類,fallbackFactory = LogFallbackFactory.class,name屬性為注冊(cè)中心其他服務(wù)的名稱

/**
 * @description:fegin調(diào)用客戶端
 *
 * @author: LUOYUAN
 * @date: 2019-08-07-10:33
 * @function:
 */
@FeignClient(name = "eureka-log",path = "/api/log",fallbackFactory = LogFallbackFactory.class)
public interface LogFeignClient {
    
    @RequestMapping(value = "list", method = RequestMethod.GET)
    public String logList();
}
/**
 * @description:feign調(diào)用失敗邏輯
 * @author: LUOYUAN
 * @date: 2019-08-07-10:34
 * @function:
 */
@Slf4j
public class LogFallbackFactory implements FallbackFactory<LogFeignClient> {
    @Override
    public LogFeignClient create(Throwable throwable) {

        return new LogFeignClient() {
            @Override
            public String logList() {
                log.info("query log fallback reason was:",throwable);
                return null;
            }
        };
    }
}

調(diào)用失敗會(huì)打印異常信息

query log fallback reason was:
feign.RetryableException: Connection refused: connect executing GET http://eureka-log/api/log/list
at feign.FeignException.errorExecuting(FeignException.java:132)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)

三、Feign調(diào)用時(shí)定義的fallback不生效

Springcloud Dalston之前得到版本,F(xiàn)eign默認(rèn)已經(jīng)開啟了Hystrix熔斷器,從Dalaton版本開始,默認(rèn)關(guān)閉Hystrix支持,需手動(dòng)開啟,在application.yaml中添加如下配置

feign:
  hystrix:
    enabled: true

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

相關(guān)文章

  • SpringBoot集成Devtools實(shí)現(xiàn)熱更新

    SpringBoot集成Devtools實(shí)現(xiàn)熱更新

    DevTools是開發(fā)者工具集,主要用于簡(jiǎn)化開發(fā)過(guò)程中的熱部署問(wèn)題,熱部署是指在開發(fā)過(guò)程中,當(dāng)代碼發(fā)生變化時(shí),無(wú)需手動(dòng)重啟應(yīng)用,系統(tǒng)能夠自動(dòng)檢測(cè)并重新加載修改后的代碼,本文給大家介紹了SpringBoot集成Devtools實(shí)現(xiàn)熱更新,需要的朋友可以參考下
    2024-08-08
  • SpringBoot集成SpringSecurity安全框架方式

    SpringBoot集成SpringSecurity安全框架方式

    這篇文章主要介紹了SpringBoot集成SpringSecurity安全框架方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring Boot集成Swagger接口分類與各元素排序問(wèn)題

    Spring Boot集成Swagger接口分類與各元素排序問(wèn)題

    這篇文章主要介紹了Spring Boot集成Swagger接口分類與各元素排序問(wèn)題,首先我們需要對(duì)Swagger中的接口也就是以Controller 層作為第一級(jí)梯度進(jìn)行組織的,Controller在我們實(shí)際開發(fā)中,與其他具體接口之間是存在一對(duì)多的關(guān)系,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建)

    springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建)

    這篇文章主要介紹了springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建),需要的朋友可以參考下
    2020-08-08
  • JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解

    JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解

    這篇文章主要介紹了JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • JavaWeb中的簡(jiǎn)單分頁(yè)完整代碼(推薦)

    JavaWeb中的簡(jiǎn)單分頁(yè)完整代碼(推薦)

    這次主要是講解一下通過(guò)登錄后對(duì)得到的數(shù)據(jù)進(jìn)行分頁(yè),首先我們新建一個(gè)登錄頁(yè)面login.jsp,因?yàn)槲覀冎饕獙W(xué)習(xí)的分頁(yè),所以登錄驗(yàn)證的部分沒(méi)有提到。關(guān)于javaweb中的分頁(yè)代碼大家通過(guò)本文學(xué)習(xí)吧
    2016-11-11
  • Maven實(shí)現(xiàn)自己的starter依賴

    Maven實(shí)現(xiàn)自己的starter依賴

    本文主要介紹了Maven實(shí)現(xiàn)自己的starter依賴,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java執(zhí)行Linux命令的方法

    java執(zhí)行Linux命令的方法

    這篇文章主要介紹了java執(zhí)行Linux命令的方法,涉及對(duì)Java中Runtime.exec()函數(shù)的應(yīng)用,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    這篇文章主要介紹了IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot 集成 Druid過(guò)程解析

    SpringBoot 集成 Druid過(guò)程解析

    這篇文章主要介紹了SpringBoot 集成 Druid過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論