天天看點

SpringBoot 關于Feign的逾時時間配置

走過路過不要錯過

點選藍字關注我們

今天項目現場提過來一個問題 “公司發過來的封裝好的 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 定義的接口形成代理類然後進行配置,

contextId

是目前 FeignClient 相關參數在 FeignContext 上下文中的 key,通過 contextId 來區分不同 FeignClient 的配置,如果 contextId 沒有配置則使用 name 作為上限文中的 key,與逾時時間之外的其他相關配置詳見

FeignClientConfiguration

至此,問題解決。