SpringCloud对服务内某个client进行单独配置的操作步骤

 更新时间:2023年10月19日 08:59:49   作者:LxyrichBos  
我们的微服务项目用的是springCloud,某个微服务接口因为数据处理量大,出现了接口超时的情况,我们需要单独修改这一个feignClient的超时时间,所以本文介绍了SpringCloud对服务内某个client进行单独配置的操作步骤,需要的朋友可以参考下

问题

我们的微服务项目用的是springCloud,某个微服务接口因为数据处理量大,出现了接口超时的情况,我们需要单独修改这一个feignClient的超时时间。

解决过程

一开始项目只是在application文件里面进行了全局的简单配置,搜索了一下,添加了一个配置类写在@FeignClient注解的参数里

@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 {}

测试后发现并没有解决问题,还是在超时,于是点进报错的源码debug了一下

image.png

image.png

发现这个option并不是我上面配置类配置的值

一路往上点,找到option被写入进去的地方FeignClientFactoryBean#configureUsingConfiguration

image.png

可以看到这里的option是通过context拿到的,接着点进去

image.png

这个类就是传递配置的地方,一个name有一个配置列表

image.png

这里的configuration是Autowired注入进去的,但是最后option却没有拿到,于是考虑难道是配置没注入进去?

找到@FeignClient的参数注册的代码FeignClientsRegistrar#registerFeignClients

image.png

注意这里的registerClientConfiguration和getClientName方法,getClientName拿到每个FeignClient的name,然后把configuration注入到那个name下。问题出现了A服务有很多个FeignClient,我只需要对其中的一个进行特殊配置,但是所有的FeignClient注解的value值都是一样的,这里获得的name也就是一样的,那么后面注册的configuration就会把前面的覆盖掉,导致我们自己写的配置失效

点进getClientName方法

image.png

看代码,只要FeignClient注解的contextId有值,就会直接取contextId而不取value或者name,那么给需要特殊配置的Client写上contextId是不是配置就生效了

@FeignClient(value = "app",contextId = "appSpecial",  configuration = {FeignClientConfig.class,MyFeignConfig.class}, fallbackFactory = ApprovalClientFallBack.class)
public interface AppClient {}

测试后发现所有服务的超时时间都变成20000了
这里有个坑要注意,配置类不能有@Configuration注解,否则会被全局扫描到,变成了全局配置。去掉@Configuration后测试,问题解决。

问题解决

综上

因为配置文件配置的优先级高于配置类,所以删掉application文件里的配置,采用配置类配置。
在项目统一的FeignClientConfig里加上统一的超时时间配置

@Configuration
public class FeignClientConfig {

    /**
     * 配置header
     */
    @Bean
    public RequestInterceptor requestInterceptor() {
        return new FeignClientInterceptor();
    }
    /**
     * 配置统一的超时时间
     */
    @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对服务内某个client进行单独配置的操作步骤的详细内容,更多关于SpringCloud对client单独配置的资料请关注脚本之家其它相关文章!

相关文章

  • spring boot配置dubbo方式(properties)

    spring boot配置dubbo方式(properties)

    这篇文章主要介绍了spring boot配置dubbo方式(properties),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Springboot使用异步请求提高系统的吞吐量详解

    Springboot使用异步请求提高系统的吞吐量详解

    这篇文章主要介绍了Springboot使用异步请求提高系统的吞吐量详解,和同步请求相对,异步不需要等待响应,随时可以发送下一次请求,如果是同步请求,需要将信息填写完整,再发送请求,服务器响应填写是否正确,再做修改,需要的朋友可以参考下
    2023-08-08
  • SpringAop实现原理及代理模式详解

    SpringAop实现原理及代理模式详解

    Spring的AOP就是通过动态代理实现的,使用了两个动态代理,分别是JDK的动态代理和CGLIB动态代理,本文重点给大家介绍下SpringAop实现原理及代理模式,感兴趣的朋友一起看看吧
    2022-04-04
  • 利用springmvc处理模型数据

    利用springmvc处理模型数据

    这篇文章主要介绍了如何利用springmvc 处理模型数据,帮助大家更好的理解和学习使用springmvc,感兴趣的朋友可以了解下
    2021-03-03
  • IDEA如何将右下角提示框禁止弹出问题

    IDEA如何将右下角提示框禁止弹出问题

    这篇文章主要介绍了IDEA如何将右下角提示框禁止弹出问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Javaweb 鼠标移入移出表格颜色变化的实现

    Javaweb 鼠标移入移出表格颜色变化的实现

    这篇文章主要介绍了Javaweb 鼠标移入移出表格颜色变化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java递归处理单位人员组织机构树方式

    java递归处理单位人员组织机构树方式

    这篇文章主要介绍了java递归处理单位人员组织机构树方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java Swing JCheckBox复选框的实现方法

    Java Swing JCheckBox复选框的实现方法

    这篇文章主要介绍了Java Swing JCheckBox复选框的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java中方法的重写与成员变量的隐藏

    Java中方法的重写与成员变量的隐藏

    这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量),文中给大家介绍了java中的重写知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • Git设置和取消代理的方法

    Git设置和取消代理的方法

    今天小编就为大家分享一篇关于Git设置和取消代理的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论