springcloud線上發佈超時系列文章:
springcloud線上發佈超時方案之feign優化(ribbon飢餓加載)
springcloud線上發佈超時方案之grpc優化
springcloud線上發佈超時方案之終極殺招:預熱(測試用例)
在高併發情況下發布應用時,經常會發現監控中有很多超時報錯或者斷路器打開,下圖中可以看到監控情況,測試時也會偶現第一次feign調用出錯,第二次就會恢復正常。
問題分析
大家都知道,這裏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