SpringCloud對服務(wù)內(nèi)某個client進(jìn)行單獨配置的操作步驟
問題
我們的微服務(wù)項目用的是springCloud,某個微服務(wù)接口因為數(shù)據(jù)處理量大,出現(xiàn)了接口超時的情況,我們需要單獨修改這一個feignClient的超時時間。
解決過程
一開始項目只是在application文件里面進(jìn)行了全局的簡單配置,搜索了一下,添加了一個配置類寫在@FeignClient注解的參數(shù)里
@Configuration public class MyFeignConfig { @Bean Request.Options feignOptions(){ return new Request.Options(20000, TimeUnit.MILLISECONDS,20000, TimeUnit.MILLISECONDS,false); } } @FeignClient(value = "app", configuration = {FeignClientConfig.class,MyFeignConfig.class}, fallbackFactory = ApprovalClientFallBack.class) public interface AppClient {}
測試后發(fā)現(xiàn)并沒有解決問題,還是在超時,于是點進(jìn)報錯的源碼debug了一下
發(fā)現(xiàn)這個option并不是我上面配置類配置的值
一路往上點,找到option被寫入進(jìn)去的地方FeignClientFactoryBean#configureUsingConfiguration
可以看到這里的option是通過context拿到的,接著點進(jìn)去
這個類就是傳遞配置的地方,一個name有一個配置列表
這里的configuration是Autowired注入進(jìn)去的,但是最后option卻沒有拿到,于是考慮難道是配置沒注入進(jìn)去?
找到@FeignClient的參數(shù)注冊的代碼FeignClientsRegistrar#registerFeignClients
注意這里的registerClientConfiguration和getClientName方法,getClientName拿到每個FeignClient的name,然后把configuration注入到那個name下。問題出現(xiàn)了A服務(wù)有很多個FeignClient,我只需要對其中的一個進(jìn)行特殊配置,但是所有的FeignClient注解的value值都是一樣的,這里獲得的name也就是一樣的,那么后面注冊的configuration就會把前面的覆蓋掉,導(dǎo)致我們自己寫的配置失效
點進(jìn)getClientName方法
看代碼,只要FeignClient注解的contextId有值,就會直接取contextId而不取value或者name,那么給需要特殊配置的Client寫上contextId是不是配置就生效了
@FeignClient(value = "app",contextId = "appSpecial", configuration = {FeignClientConfig.class,MyFeignConfig.class}, fallbackFactory = ApprovalClientFallBack.class) public interface AppClient {}
測試后發(fā)現(xiàn)所有服務(wù)的超時時間都變成20000了
這里有個坑要注意,配置類不能有@Configuration注解,否則會被全局掃描到,變成了全局配置。去掉@Configuration后測試,問題解決。
問題解決
綜上
因為配置文件配置的優(yōu)先級高于配置類,所以刪掉application文件里的配置,采用配置類配置。
在項目統(tǒng)一的FeignClientConfig里加上統(tǒng)一的超時時間配置
@Configuration public class FeignClientConfig { /** * 配置header */ @Bean public RequestInterceptor requestInterceptor() { return new FeignClientInterceptor(); } /** * 配置統(tǒng)一的超時時間 */ @Bean Request.Options feignOptions(){ return new Request.Options(10000, TimeUnit.MILLISECONDS,10000, TimeUnit.MILLISECONDS,false); } }
對需要單獨配置的client添加自定義配置
public class MyFeignConfig { @Bean Request.Options feignOptions(){ return new Request.Options(20000, TimeUnit.MILLISECONDS,20000, TimeUnit.MILLISECONDS,false); } } @FeignClient(value = "app", contextId = "appSpecial", configuration = {FeignClientConfig.class, MyFeignConfig.class}, fallbackFactory = ClientFallBack.class) public interface AppClient {}
以上就是SpringCloud對服務(wù)內(nèi)某個client進(jìn)行單獨配置的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud對client單獨配置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java編程實現(xiàn)獲取服務(wù)器IP地址及MAC地址的方法
這篇文章主要介紹了java編程實現(xiàn)獲取機器IP地址及MAC地址的方法,實例分析了Java分別針對單網(wǎng)卡及多網(wǎng)卡的情況下獲取服務(wù)器IP地址與MAC地址的相關(guān)技巧,需要的朋友可以參考下2015-11-11Spring整合多數(shù)據(jù)源實現(xiàn)動態(tài)切換的實例講解
下面小編就為大家?guī)硪黄猄pring整合多數(shù)據(jù)源實現(xiàn)動態(tài)切換的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Java實現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式,java復(fù)制文件的方式其實有不少種,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09springboot整合mybatis的超詳細(xì)過程(配置模式+注解模式)
這篇文章主要介紹了springboot整合mybatis的詳細(xì)過程(配置模式+注解模式),這里我使用的是配置模式+注解模式所以需要配置全局文件,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04