SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟
問(wèn)題
我們的微服務(wù)項(xiàng)目用的是springCloud,某個(gè)微服務(wù)接口因?yàn)閿?shù)據(jù)處理量大,出現(xiàn)了接口超時(shí)的情況,我們需要單獨(dú)修改這一個(gè)feignClient的超時(shí)時(shí)間。
解決過(guò)程
一開始項(xiàng)目只是在application文件里面進(jìn)行了全局的簡(jiǎn)單配置,搜索了一下,添加了一個(gè)配置類寫在@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 {}
測(cè)試后發(fā)現(xiàn)并沒有解決問(wèn)題,還是在超時(shí),于是點(diǎn)進(jìn)報(bào)錯(cuò)的源碼debug了一下


發(fā)現(xiàn)這個(gè)option并不是我上面配置類配置的值
一路往上點(diǎn),找到option被寫入進(jìn)去的地方FeignClientFactoryBean#configureUsingConfiguration

可以看到這里的option是通過(guò)context拿到的,接著點(diǎn)進(jìn)去

這個(gè)類就是傳遞配置的地方,一個(gè)name有一個(gè)配置列表

這里的configuration是Autowired注入進(jìn)去的,但是最后option卻沒有拿到,于是考慮難道是配置沒注入進(jìn)去?
找到@FeignClient的參數(shù)注冊(cè)的代碼FeignClientsRegistrar#registerFeignClients

注意這里的registerClientConfiguration和getClientName方法,getClientName拿到每個(gè)FeignClient的name,然后把configuration注入到那個(gè)name下。問(wèn)題出現(xiàn)了A服務(wù)有很多個(gè)FeignClient,我只需要對(duì)其中的一個(gè)進(jìn)行特殊配置,但是所有的FeignClient注解的value值都是一樣的,這里獲得的name也就是一樣的,那么后面注冊(cè)的configuration就會(huì)把前面的覆蓋掉,導(dǎo)致我們自己寫的配置失效
點(diǎn)進(jìn)getClientName方法

看代碼,只要FeignClient注解的contextId有值,就會(huì)直接取contextId而不取value或者name,那么給需要特殊配置的Client寫上contextId是不是配置就生效了
@FeignClient(value = "app",contextId = "appSpecial", configuration = {FeignClientConfig.class,MyFeignConfig.class}, fallbackFactory = ApprovalClientFallBack.class)
public interface AppClient {}
測(cè)試后發(fā)現(xiàn)所有服務(wù)的超時(shí)時(shí)間都變成20000了
這里有個(gè)坑要注意,配置類不能有@Configuration注解,否則會(huì)被全局掃描到,變成了全局配置。去掉@Configuration后測(cè)試,問(wèn)題解決。
問(wèn)題解決
綜上
因?yàn)榕渲梦募渲玫膬?yōu)先級(jí)高于配置類,所以刪掉application文件里的配置,采用配置類配置。
在項(xiàng)目統(tǒng)一的FeignClientConfig里加上統(tǒng)一的超時(shí)時(shí)間配置
@Configuration
public class FeignClientConfig {
/**
* 配置header
*/
@Bean
public RequestInterceptor requestInterceptor() {
return new FeignClientInterceptor();
}
/**
* 配置統(tǒng)一的超時(shí)時(shí)間
*/
@Bean
Request.Options feignOptions(){
return new Request.Options(10000, TimeUnit.MILLISECONDS,10000, TimeUnit.MILLISECONDS,false);
}
}
對(duì)需要單獨(dú)配置的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對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud對(duì)client單獨(dú)配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringCloud配置客戶端ConfigClient接入服務(wù)端
- SpringCloudConfig之client端報(bào)錯(cuò)Could?not?resolve?placeholder問(wèn)題
- springcloud client指定注冊(cè)到eureka的ip與端口號(hào)方式
- SpringCloud?Feign使用ApacheHttpClient代替默認(rèn)client方式
- SpringCloud全面解析@FeignClient標(biāo)識(shí)接口的過(guò)程
- SpringCloud引入feign失敗或找不到@EnableFeignClients注解問(wèn)題
相關(guān)文章
java實(shí)現(xiàn)Date轉(zhuǎn)換為string的五種常見實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Date轉(zhuǎn)換為string的五種常見實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-01-01
Spring中的REST分頁(yè)的實(shí)現(xiàn)代碼
本文將介紹在REST API中實(shí)現(xiàn)分頁(yè)的基礎(chǔ)知識(shí)。我們將專注于使用Spring Boot和Spring Data 在Spring MVC中構(gòu)建REST分頁(yè),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
JAVA中ListIterator和Iterator詳解與辨析(推薦)
這篇文章主要介紹了JAVA中ListIterator和Iterator詳解與辨析,需要的朋友可以參考下2017-04-04
java 將byte中的有效長(zhǎng)度轉(zhuǎn)換為String的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇java 將byte中的有效長(zhǎng)度轉(zhuǎn)換為String的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
詳細(xì)分析java并發(fā)之volatile關(guān)鍵字
這篇文章主要介紹了java并發(fā)之volatile關(guān)鍵字的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
詳解如何在spring boot中使用spring security防止CSRF攻擊
這篇文章主要介紹了詳解如何在spring boot中使用spring security防止CSRF攻擊,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

