SpringCloud对服务内某个client进行单独配置

news/2024/12/30 3:23:54/

文章目录

      • 问题
      • 解决过程
      • 问题解决

问题

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


解决过程

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

@Configuration
public class MyFeignConfig {@BeanRequest.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*/@Beanpublic RequestInterceptor requestInterceptor() {return new FeignClientInterceptor();}/*** 配置统一的超时时间*/@BeanRequest.Options feignOptions(){return new Request.Options(10000, TimeUnit.MILLISECONDS,10000, TimeUnit.MILLISECONDS,false);}
}

对需要单独配置的client添加自定义配置

public class MyFeignConfig {@BeanRequest.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 {}

http://www.ppmy.cn/news/1162424.html

相关文章

【数据挖掘】数据挖掘、关联分析、分类预测、决策树、聚类、类神经网络与罗吉斯回归

目录 一、简介二、关于数据挖掘的经典故事和案例2.1 正在影响中国管理的10大技术2.2 从数字中能够得到什么?2.3 一个网络流传的笑话(转述)2.4 啤酒与尿布2.5 网上书店关联销售的案例2.6 数据挖掘在企业中的应用2.7 交叉销售 三、数据挖掘入门3.1 什么激发了数据挖掘…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言,NXP官方uboot一定会支持不止 IMX6ULL芯片的代码,也不止支持 一种架构,还支持其他芯片或架构的源码文件。 为了方便阅读代码,vscode软件可…

学信息系统项目管理师第4版系列31_信息系统工程

1. 信息系统战略三角突出了业务战略、信息系统和组织机制之间的必要一致性 1.1. 【高23上选07】 2. 软件工程 2.1. 软件工程方法是完成软件工程项目的技术手段,它支持整个软件生命周期 2.2. 软件工程使用的工具是人们在开发软件的活动中智力和体力的扩展与延伸 …

负载均衡、代理和动静分离的战略

一、Nginx简介 1.1 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 1.2正向代理与反向代理 1.2.1正向代理 正向代理:如果把局域网外的 Internet 想象…

用于细胞定位的指数距离变换图--Exponential Distance Transform Maps for Cell Localization

论文:Exponential Distance Transform Maps for Cell Localization Paper Link: Exponential Distance Transform Maps for Cell Localization Code(有EDT Map的生成方式): https://github.com/Boli-trainee/MHFAN 核…

算法通过村第十五关-超大规模|白银笔记|经典问题

文章目录 前言从40个亿中产生一个不存在的整数位图存储数据的原理使用10MB来存储如何确定分块的区间 用2GB内存在20亿的整数中找到出现次数最多的数从100亿个URL中查找的问题40亿个非负整数中找出两次的数。总结 前言 提示:人生之中总有空白,但有时&…

使用bisect模块进行二分查找操作 bisect.bisect()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用bisect模块 进行二分查找操作 bisect.bisect() 选择题 请问bisect.bisect(c,2)的结果是: import bisect print("【执行】c [1,2,2,6,7]") c [1,2,2,6,7] print(c…

点云从入门到精通技术详解100篇-基于3D点云的曲面文字检测

目录 前言 国内外研究现状 自然场景文本检测任务面临的挑战 自然场景文本检测的研究现状