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单独配置的资料请关注脚本之家其它相关文章!

相关文章

  • java实现Date转换为string的五种常见实现方法

    java实现Date转换为string的五种常见实现方法

    这篇文章主要为大家详细介绍了java实现Date转换为string的五种常见实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • Spring中的REST分页的实现代码

    Spring中的REST分页的实现代码

    本文将介绍在REST API中实现分页的基础知识。我们将专注于使用Spring Boot和Spring Data 在Spring MVC中构建REST分页,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 浅谈springboot如何保证多线程安全

    浅谈springboot如何保证多线程安全

    这篇文章主要介绍了springboot如何保证多线程安全,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JAVA中ListIterator和Iterator详解与辨析(推荐)

    JAVA中ListIterator和Iterator详解与辨析(推荐)

    这篇文章主要介绍了JAVA中ListIterator和Iterator详解与辨析,需要的朋友可以参考下
    2017-04-04
  • java8 集合之Stack详解及实例

    java8 集合之Stack详解及实例

    这篇文章主要介绍了java8 集合之Stack详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • idea 默认路径修改从C盘更改到D盘

    idea 默认路径修改从C盘更改到D盘

    本文主要介绍了idea 默认路径修改从C盘更改到D盘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • java 将byte中的有效长度转换为String的实例代码

    java 将byte中的有效长度转换为String的实例代码

    下面小编就为大家带来一篇java 将byte中的有效长度转换为String的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java接口幂等性的实现方式

    java接口幂等性的实现方式

    本文介绍了在不同层面上实现Java接口幂等性的方法,包括使用幂等表、Nginx+Lua和Redis、以及SpringAOP,通过这些方法,可以确保接口在多次请求时只执行一次,避免重复处理和数据不一致,每种方法都有其适用场景和优势,通过实际测试验证了幂等性逻辑的有效性
    2025-01-01
  • 详细分析java并发之volatile关键字

    详细分析java并发之volatile关键字

    这篇文章主要介绍了java并发之volatile关键字的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解如何在spring boot中使用spring security防止CSRF攻击

    详解如何在spring boot中使用spring security防止CSRF攻击

    这篇文章主要介绍了详解如何在spring boot中使用spring security防止CSRF攻击,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论