走過路過不要錯過
點選藍字關注我們
今天項目現場提過來一個問題 “公司發過來的封裝好的 springboot 項目中的 feign 調用逾時時間需要修改”,細問之後,具體的需求場景是這樣的:
1、首先要對 feign 的逾時時間做設定
2、然後具體的要求是,隻要對某一個微服務的其中一個接口進行特殊配置,對其餘的所有接口做一個統一配置
公司 feign 版本 spring-cloud-starter-openfeign 2.2.3.RELEASE ,其他版本自行嘗試
基于 @FeignClient 的聲明式接口調用
一個實際的代碼示例:
@FeignClient(name = "${microservice.servicename.id:shanhy-id}", path = "/${microservice.servicename.id:shanhy-id}",
url = "${microservice.serviceurl.id:}")
public interface IdFeignClient {
(代碼略)
}
複制
順着這個問題,我思考了一下,扒了下 feign 調用的相關源碼,下面直接給出結論(因為比較忙時間有限這裡就不做源碼分析了):
1、feign 調用與逾時有關的參數分為 連接配接逾時時間
connect-timeout
和 讀取逾時時間
read-timeout
2、這兩個參數的預設值分别為 10秒 和 60秒
3、如果要對這兩個參數進行配置,那麼對應的配置方法如下
feign.client.config.default.connect-timeout=5000
feign.client.config.default.read-timeout=30000
複制
(機關毫秒)
4、目前代碼工程中有好幾個 @FeignClient 聲明,分别調用了不同的其他服務,如果要單獨為這個
shanhy-id
服務設定這兩個逾時時間,那麼對應的配置方法如下:
feign.client.config.shanhy-id.connect-timeout=2000
feign.client.config.shanhy-id.read-timeout=5000
複制
注意和預設的差別就是中間那一段,将 default 替換為 shanhy-id,這個和 @FeignClient 中的 name 屬性一緻
5、如果需要針對某一個服務中的某一個或幾個接口做特殊配置,那麼就為這個特殊接口單獨寫一個 @FeignClient 接口定義,并為設定一個 contextId 設定一個和 name 不重名的名字,保證唯一,下面是例子:
@FeignClient(name = "${microservice.servicename.id:shanhy-id}", path = "/${microservice.servicename.id:shanhy-id}",
url = "${microservice.serviceurl.id:}", contextId = "shanhy-id-2" )
public interface IdFeignClient {
(代碼略)
}
複制
然後對應的配置為:
feign.client.config.shanhy-id-2.connect-timeout=3000
feign.client.config.shanhy-id-2.read-timeout=15000
複制
其實系統啟動的時候,會為每一個 @FeignClient 定義的接口形成代理類然後進行配置,是目前 FeignClient 相關參數在 FeignContext 上下文中的 key,通過 contextId 來區分不同 FeignClient 的配置,如果 contextId 沒有配置則使用 name 作為上限文中的 key,與逾時時間之外的其他相關配置詳見
contextId
FeignClientConfiguration
至此,問題解決。