4

我已经定义了一个 REST 接口,它使用不同的 Spring Boot 应用程序实现spring.application.namespring.application.name在我的业务中不能相同)。

如何只定义一个 Feign Client,并且可以访问所有 SpringBootApplication REST 服务?

SpringBootApplication A(spring.application.name=A) 和 B(spring.application.name=) 有这个 RestService:

@RestController
@RequestMapping(value = "/${spring.application.name}")
public class FeignRestService {

    @Autowired
    Environment env;

    @RequestMapping(path = "/feign")
    public String feign() {
        return env.getProperty("server.port");
    }
}

另一个 SpringBootApplication C:

@FeignClient(name="SpringApplication A or B")
public interface FeignClientService {

    @RequestMapping(path = "/feign")
    public String feign();
}

在 SpringBootApplication C 中,我想使用 FeignClientService 来访问 A 和 B。你有什么想法吗?

4

2 回答 2

3

是的,您可以创建一个 Feign 客户端,并根据需要重新使用它来调用 Eureka 目录中的不同命名服务(您使用 spring-cloud-netflix 标记了问题)。这是您如何执行此操作的示例:

@Component
public class DynamicFeignClient {

  interface MyCall {
    @RequestMapping(value = "/rest-service", method = GET)
    void callService();
  }

  FeignClientBuilder feignClientBuilder;

  public DynamicFeignClient(@Autowired ApplicationContext appContext) {
    this.feignClientBuilder = new FeignClientBuilder(appContext);
  }

  /*
   * Dynamically call a service registered in the directory.
   */

  public void doCall(String serviceId) {

    // create a feign client

    MyCall fc =
        this.feignClientBuilder.forType(MyCall.class, serviceId).build();

    // make the call

    fc.callService();
  }
}

调整调用接口以满足您的要求,然后您可以将DynamicFeignClient实例注入并使用到您需要使用它的 bean 中。

几个月来,我们一直在生产中使用这种方法来询问数十种不同的服务,以获取版本信息和其他有用的运行时执行器数据等内容。

于 2019-04-01T09:52:18.777 回答
0

您可能已经想通了,但这可能会帮助任何正在寻找相同问题答案的人。您需要为使用服务的每个服务客户端配置 Feign 客户端。

不可能使用同一个 Feign 客户端来调用不同的服务,因为 Feign 客户端与您定义的服务相关联。

于 2018-04-27T14:02:55.013 回答