content:[2021-02-26 18:43:59.939][http-nio-8080-exec-11][ERROR][c.l.c.c.r.RestCartServiceImpl:50] [reqId:7C0AB48A63C843C99CE5BC6A4ED85244] <getMyCartDetail> 操作異常: feign.RetryableException: Read timed out executing POST http://cic-product-service/cic-product/getProductListByIds at feign.FeignException.errorExecuting(FeignException.java:249) at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:129) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) at feign.ReflectiveFeignProxy162.getProductListByIds(Unknown Source)
問題:在application.yaml中配置的feign的超時一直不生效四濒,在網(wǎng)上也找不到相應(yīng)的合理解決方案摔桦,通常的答案是對feign依賴的底層ribbon設(shè)置超時來解決巨税,但這個不是官方推薦的方式吟温,所以我就產(chǎn)生了跟蹤源碼的興趣父能。
解決方案:首先我是通過對@FeignClient注解源碼進行了斷點跟蹤饥伊,看下在服務(wù)啟動時犯祠,spring boot是如何加載OpenFeign的超時配置的,最后跟蹤到
FeignClientFactoryBean的configureUsingProperties方法讀取了feign的配置
feign:
okhttp:
enabled: true
httpclient:
#關(guān)閉默認的httpclient
enabled: false
#整個連接池最大連接數(shù)
max-connections: 200
#每個路由的最大連接窖铡,默認50
max-connections-per-route: 50
client:
config:
default: #使用默認的feignclient時疗锐,超時可以生效
connectTimeout: 111000
readTimeout: 111000
跟蹤到這兒坊谁,就可以知道在我們對@FeignClient不進行重寫或者不額外指定configuration的配置時,他是默認加載default配置滑臊,而這個default配置默認超時是2秒
要想更改這個默認超時時間需要按照官方推薦的格式口芍,才能生效,如下:
feign:
client:
config:
default: #這里就是指的所有被加載的默認FeignClient實現(xiàn)的服務(wù)配置都生效
connectTimeout: 111000
readTimeout: 111000
按照配置設(shè)置后雇卷,又對該服務(wù)配置做了驗證和壓測鬓椭,在4核8g的mac本上,查詢購物車服務(wù)支持150個并發(fā)关划,異常率0%小染,比之前的70%異常率,大大降低祭玉,至此完美解決線上問題氧映。