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

embedded/2024/12/23 18:53:59/

文章目录

    • name相同问题


name相同问题

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

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

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

java">@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();
}

为什么可以这样解决呢?

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

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

java">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注册

java">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相同问题

http://www.ppmy.cn/embedded/120152.html

相关文章

vue3路由

使用 定义组件 新建components文件夹&#xff0c;新建About、News、Home组件 Home组件 <template><div class"home"><img src"http://www.atguigu.com/images/index_new/logo.png" alt""></div></template>&l…

提示词工程 (Prompt Engineering) 最佳实践

prompt Engineering 概念解析 提示工程是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力&#xf…

vue限定类型上传文件 最简单实践(单个可文件、可图片)

这个是为了文件导入弄的&#xff0c;内部运维人员使用的 目前还没做删除文件的交互 <el-uploadclass"upload-demo"ref"upload":before-upload"handleBeforeUpload"action"#"accept".xls,.xlsx":limit"1">&l…

Threejs中使用A*算法寻路导航

<!DOCTYPE html> <html><head><title>Threejs中使用A*算法寻路导航&#xff0c;Threejs室内室外地图导航</title><script type"text/javascript" src"libs/three.js"></script><script type"text/javas…

vue单点登录异步执行请求https://xxx.com获取并处理数据

一、请求一个加密地址获取access_token再拼接字符串再次请求 接口返回数据 异步执行请求该地址获取数据并处理 二、请求代码第二步使用 access_token 获取 auth_key // 第二步&#xff1a;使用 access_token 获取 auth_keyconst access_token tokenData.access_token;const …

表格理解有什么大模型可以用

表格理解&#xff08;Table Understanding&#xff09;任务可以使用多种大模型&#xff0c;其中一些主流的模型包括&#xff1a; Tapas&#xff08;Table Parser&#xff09;&#xff1a;Tapas 是 Google 提出的基于 BERT 的表格问答模型&#xff0c;能够处理表格数据并生成自然…

成都睿明智科技有限公司抖音开店怎么样?

在当下这个日新月异的数字时代&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;而抖音作为短视频与社交电商的完美结合体&#xff0c;已成为众多品牌竞相追逐的新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其敏锐的市…

二叉树的递归遍历

方法论 确定递归函数的参数和返回值 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在递归函数里加上这个参数&#xff0c; 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件 写完了递归算法, 运行的时候&#xff0c;经常会遇到栈溢…