首页 > 其他分享 >Spring Cloud全解析:服务调用之多个FeignClient调用服务名称相同

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

时间:2024-09-29 10:45:31浏览次数:5  
标签:FeignClient 调用 name get Spring value contextId String

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

参考文献

标签:FeignClient,调用,name,get,Spring,value,contextId,String
From: https://www.cnblogs.com/life-time/p/18439134

相关文章

  • [含文档+PPT+源码等]精品基于springboot实现的原生Andriod高校师生二手用品交易系统AP
    基于SpringBoot实现的原生Android高校师生二手用品交易系统APP的背景主要可以从以下几个方面来阐述:一、社会与环保背景资源循环利用与环保意识:随着经济的快速发展和人们生活水平的提高,闲置物品的数量不断增加。高校作为知识和文化的聚集地,师生们的环保意识日益增强,对于资源......
  • [含文档+PPT+源码等]精品基于springboot实现的原生Andriod校园二手电子物品交易系统
    基于SpringBoot实现的原生Android校园二手电子物品交易系统的背景可以从多个方面来阐述,以下是一个详细的背景分析:一、环保与可持续发展的需求绿色消费理念:在全球环保意识日益增强的背景下,绿色消费和可持续发展成为重要的社会议题。校园二手电子物品交易系统的建立,旨在推动资......
  • JMeter调用python脚本
    JMeter调用python脚本前提具备python环境具备jdk环境一、编写python脚本python脚本如下:importrandom#随机一个1~100的随机数print(random.randint(1,100))二、使用BeanShell取样器调用python脚本Stringcommand="pythonD:\\apache-jmeter-5.5\\bin\\test.py"......
  • pbootcms模板栏目页如何调用当前栏目的文章
    在PBootCMS中,如果你想在模板栏目页调用当前栏目的文章,可以使用模板标签 {pboot:list} 来实现。以下是一个具体的例子,展示如何调用当前栏目的文章:示例代码假设你想在一个栏目页上显示当前栏目的最新10篇文章,可以使用以下模板标签:{pboot:listnum=10scode={sort:scode}pag......
  • Codesys3.5 封装库 和 库的调用
    1、库的建立第一步。 2、新建个文件夹,方便管理哦 3、然后在文件右键》添加对象中添加几个pou   4、随便建立几个。 4、设置工程信息,也就库信息哦双击工程信息弹出 5、最后就是生成库文件哦。   6、调用刚才的库,要新建一个工程哦。   7......
  • SpringBoot+Docker +Nginx 部署前后端项目
    部署SpringBoot项目(通关版)一、概述使用java-jar命令直接部署项目的JAR包和使用Docker制作镜像进行部署是两种常见的部署方式。以下是对这两种方式的概述和简要的优劣势分析:1.1、使用java-jar命令直接部署项目的JAR包概述:通过java-jar直接部署项目的JAR包是最简单直......
  • 【含文档+PPT+源码】基于SpringBoot的体育馆管理系统的设计与实现
    项目背景与意义近年来,随着人们生活水平的提高和健康意识的增强,体育馆作为提供体育锻炼和休闲娱乐的重要场所,其使用频率和管理难度也在不断增加。传统的体育馆管理模式通常依赖于人工记录和手动操作,不仅效率低下,而且容易出现错误和遗漏,难以适应现代社会的快节奏和高效率要求。......
  • 【含文档+PPT+源码】基于SpringCloud微服务的船舶交易平台的设计与实现
    项目背景与意义随着全球经济的快速发展,航运业成为国际贸易中不可或缺的一环。船舶交易平台作为航运业的重要组成部分,为船舶买卖、租赁等交易提供了便利和高效的途径。在传统的船舶交易中,买卖双方往往需要通过中介机构来进行交易,这不仅增加了交易的时间和成本,还存在信息不透明......
  • Spring Boot 进阶-Spring Boot的全局异常处理机制详解
      我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了trycatchfinally语句。  大量的......
  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
    SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法springboot、maven、mybatisplus、sql、日志、控制台、console、log背景在baomidou.com学习mybatisPlus入门的过程中,接触到表名和关键词冲突,加注解加表名引号后问题解决。不过我还想,在控制台打印一下执行......