欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Spring Cloud全解析:服务调用之多个FeignClient调用服务名称相同

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

2024/10/25 10:24:40 来源:https://blog.csdn.net/Lxn2zh/article/details/142630479  浏览:    关键词: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相同问题

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com