溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springcloud feign首次調用100%失敗怎么解決

發布時間:2021-06-23 13:53:12 來源:億速云 閱讀:453 作者:chen 欄目:開發技術

這篇文章主要講解了“springcloud feign首次調用100%失敗怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“springcloud feign首次調用100%失敗怎么解決”吧!

敘述

在高并發情況下發布應用時,經常會發現監控中有很多超時報錯或者斷路器打開,下圖中可以看到監控情況,測試時也會偶現第一次feign調用出錯,第二次就會恢復正常。

springcloud feign首次調用100%失敗怎么解決

分析

大家都知道,這里feign底層是集成的ribbon,這里ribbon也會有http連接池,這里的連接池是長連接,定時初始化一批并銷毀舊連接,這里還包括一些上下文需要初始化,但是在容器初始化好時,ribbon底層的client是未初始化的,當第一次調用時,有一個初始化過程會導致超時,一般情況下會說需要調整超時時間,但是在電商高并發情況下,這里肯定時不現實的,響應請求都需要ms級別。

解決方案

ribbon饑餓加載

這里可以通過配置ribbon饑餓加載來減少出錯次數,如下:

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

這里為什么說不能完全解決呢?因為在發布時流量切換的瞬間,流量太大,并不是僅僅ribbon需要初始化,hystrix、web容器線程池等都需要初始化或者擴容,這里也需要耗時,所以這里的饑餓加載僅僅只是做到了發布時減少錯誤數。

zuul饑餓加載

網關作為對外請求的入口,zuul內部使用Ribbon調用其他服務,Spring Cloud默認在第一次調用時懶加載Ribbon客戶端。zuul同樣需要維護一個相對的子應用環境的上下文,所以也需要啟動時饑餓加載。

zuul:
  ribbon:
    eager-load:
      enabled: true

springcloud 中Feign調用常見問題

注: 本文基于Springcloud Edgware版本

一、Feign調用首次失敗問題

1、Feign簡介:

Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,Feign 整合了Ribbon。

2、原因分析:

Feign整合Hystrix組件后,Hystrix默認的超時時間是1秒,如果超過這個時間尚未響應,將會進入自定義的fallback代碼,往往首次請求會比較慢(由于Ribbon是懶加載的,在首次請求時,才會開始初始化相關類),這個響應時間可能就大于1秒了,出現調用失敗

3、解決方案

(1)增加Hystrix的超時時間,默認為1s

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

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

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

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

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

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

feign:
 hystrix:
  enabled: false

二、Feign整合Hystrix之后日志顯示問題

1、解決方案

Feign整合Hystrix之后,當調用失敗會走fallback邏輯,造成日志不顯示,往往我們需要看日志分析原因,進行故障排查。

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

feign:
  hystrix:
    enabled: true

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

在客戶端FeignClient注解配置相對應的回滾類,fallbackFactory = LogFallbackFactory.class,name屬性為注冊中心其他服務的名稱

/**
 * @description:fegin調用客戶端
 *
 * @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調用失敗邏輯
 * @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;
            }
        };
    }
}

調用失敗會打印異常信息

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調用時定義的fallback不生效

Springcloud Dalston之前得到版本,Feign默認已經開啟了Hystrix熔斷器,從Dalaton版本開始,默認關閉Hystrix支持,需手動開啟,在application.yaml中添加如下配置

feign:
  hystrix:
    enabled: true

感謝各位的閱讀,以上就是“springcloud feign首次調用100%失敗怎么解決”的內容了,經過本文的學習后,相信大家對springcloud feign首次調用100%失敗怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女