欢迎访问Spring Cloud中国社区

我们致力于成为中国最专业的Spring Boot和Spring Cloud交流社区。推荐使用Github直接登录,欢迎加微信号Software_King进入社区微信交流群。若发现网站bug欢迎反馈!

@FeignClient 相同的name,如何实现多配置?

chap · 29天前 · 402 ·

问题

在使用@FeignClient时,可以使用自定义配置。

@FeignClient(name="hello2", path = "${hello2.restprefix}", configuration = JAXRSFeignConfiguration.class)
@Path("person")
public interface PersonApi {
@FeignClient(name="hello2", configuration = SpringMVCFeignConfiguration.class)
@RequestMapping("user")
public interface UserApi {

如上所示,两个feignclient, 当我使用同一个namehello2时,userApiconfiguration就会被覆盖为JAXRSFeignConfiguration.class

查看源码得知,在spring cloud feign中,以name来作为configuration的key, 实例化对象时,同样以name来寻找configuration。同样的name,configuration会被覆盖。

    protected <T> T get(FeignContext context, Class<T> type) {
        T instance = context.getInstance(this.name, type);
        if (instance == null) {
            throw new IllegalStateException("No bean found of type " + type + " for "
                    + this.name);
        }
        return instance;
    }

而且,spring cloud feign默认使用ribbon作负载均衡,使用name做服务名来寻找服务实例。
这就导致了一个服务只能有一个configuration

但在我的项目中,一个服务是需要多个configuration的。
项目原使用springmvc,现在使用jersey,导致两者共存于一个项目中。另外,有些API,调用的超时时间也不一样,也需要单独设置。

之前没有这方面经验,不知道各位是如何解决这个问题的,或者是如何避免这个问题的?感谢