前言
今天在使用微服務調用時服務之間調用超時,報錯如下:
feign.RetryableException: Read timed out executing POST http://******
也可能會有人在服務都成功啓動的時候第一次訪問會有報錯的情況發生,但是之後又恢復正常訪問。
解決辦法:
首先第一次調用失敗後面正常:要解決此問題那麼讓需要實例化的類提前創建,而不是在第一次調用的時候創建。
原因:主要是Ribbon進行客戶端負載均衡的Client並不是在服務啓動的時候就初始化好的,而是在調用的時候纔會去創建相應的Client,所以第一次調用的耗時不僅僅包含發送HTTP請求的時間,還包含了創建RibbonClient的時間,這樣一來如果創建時間速度較慢,同時設置的超時時間又比較短的話,很容易就會出現上面所描述的顯現。
配置:
#預加載配置,默認爲懶加載
ribbon:
eager-load:
enabled: true
clients: zoo-plus-email
zoo-plus-email:
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
參數說明:
ribbon.eager-load.enabled : 開啓Ribbon的飢餓加載模式
ribbon.eager-load.clients: 指定需要飢餓加載的服務名
後面是對單個服務配置連接讀取時間。
配置ribbon可以全部服務配置:
ribbon:
ReadTimeout: 15000
ConnectTimeout: 60000