当前位置: 首页 > news >正文

Spring Cloud全解析:服务调用之多个FeignClient调用服务名称相同


文章目录

    • name相同问题


name相同问题

在使用@FeignClient的时候,发现多个@FeignClient中的name相同就无法启动,当然了,这是因为bean名称重复了,创建bean的时候报的错,但是如何解决呢?

A bean with that name has already been defined and overriding is disabled

可以配置不同的contextId来进行解决

@FeignClient(name = "SPRINGCLOUD2-PROVIDER",contextId = "DeptClient",fallbackFactory = DeptClientFallBackFactory.class)
public interface DeptClient {@GetMapping(value = "/dept/get/{id}")CommonResult<Dept> get(@PathVariable("id") long id);@GetMapping("/timeout")String timeout();
}@FeignClient(name = "SPRINGCLOUD2-PROVIDER",contextId = "DeptClient1",fallbackFactory = DeptClientFallBackFactory.class)
public interface DeptClient1 {@GetMapping(value = "/dept/get/{id}")CommonResult<Dept> get(@PathVariable("id") long id);@GetMapping("/timeout")String timeout();
}

为什么可以这样解决呢?

String name = getClientName(attributes);
registerClientConfiguration(registry, name,attributes.get("configuration"));

在FeignClientsRegistrar中进行@FeignClient注册时,对于bean的名称是调用getClientName(Map<String, Object> client)方法来获取的

private String getClientName(Map<String, Object> client) {if (client == null) {return null;}String value = (String) client.get("contextId");if (!StringUtils.hasText(value)) {value = (String) client.get("value");}if (!StringUtils.hasText(value)) {value = (String) client.get("name");}if (!StringUtils.hasText(value)) {value = (String) client.get("serviceId");}if (StringUtils.hasText(value)) {return value;}throw new IllegalStateException("Either 'name' or 'value' must be provided in @"+ FeignClient.class.getSimpleName());
}

代码也比较简单,可以看到是先获取的contextId,如果配置了 contextId 就会用 contextId,如果没有配置就会取 value 然后是 name 最后是 serviceId

获取到clientName之后进行bean注册

private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,Object configuration) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class);builder.addConstructorArgValue(name);builder.addConstructorArgValue(configuration);registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(),builder.getBeanDefinition());
}

拼接的beanName就是clientName.FeignClientSpecification

参考文献

  • name相同问题

相关文章:

  • 在Pycharm中安装Cv2
  • Page<T>类型数据间的复制
  • Spring-bean实例化的方式
  • LeetCode 每日一题 2024/9/23-2024/9/29
  • 计算机毕业设计 基于Python国潮男装微博评论数据分析系统的设计与实现 Django+Vue 前后端分离 附源码 讲解 文档
  • 基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现
  • React学习笔记(四)——React 组件生命周期
  • 负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。
  • 【源码+文档+调试讲解】智能校园点餐管理系统springboot
  • 物联网系统中高精度压力检测方案_压力变送器
  • 15分钟学 Python 第29天 : 数据库基础
  • “不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费
  • 磁盘管理器
  • 多表查询。
  • 在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.1)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • DOM的那些事
  • Druid 在有赞的实践
  • Laravel Mix运行时关于es2015报错解决方案
  • orm2 中文文档 3.1 模型属性
  • React-Native - 收藏集 - 掘金
  • scrapy学习之路4(itemloder的使用)
  • Vue2 SSR 的优化之旅
  • 不上全站https的网站你们就等着被恶心死吧
  • 搭建gitbook 和 访问权限认证
  • 复习Javascript专题(四):js中的深浅拷贝
  • 后端_ThinkPHP5
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 排序(1):冒泡排序
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 线上 python http server profile 实践
  • 想写好前端,先练好内功
  •  一套莫尔斯电报听写、翻译系统
  • 数据库巡检项
  • ​520就是要宠粉,你的心头书我买单
  • # SpringBoot 如何让指定的Bean先加载
  • #Linux(帮助手册)
  • $nextTick的使用场景介绍
  • (06)Hive——正则表达式
  • (1)Android开发优化---------UI优化
  • (2022 CVPR) Unbiased Teacher v2
  • (23)mysql中mysqldump备份数据库
  • (floyd+补集) poj 3275
  • (java)关于Thread的挂起和恢复
  • (Note)C++中的继承方式
  • (办公)springboot配置aop处理请求.
  • (分布式缓存)Redis哨兵
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)Flink Watermark
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)基于IDEA的JAVA基础10
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **PHP分步表单提交思路(分页表单提交)