以编程方式创建 Feign 客户端和 Eureka 目标

Programmatically created Feign client and Eureka target

前几天开始学习微服务的容错解决方案。我的生态系统中有一些微服务,它们现在与 Eureka 服务查找互连。我使用 FeignClient 从一个到另一个调用。正如我听说和读到的那样,Hystrix 正在进行维护,我想知道我是否可以在 Feign 中使用 Resilience4J 而不是 Hystrix。好吧,至少不是现在看起来的注释级别。我找到了一个很棒的 Feign.Builder 适配器,可以在 FeignClient 之上添加 resilience4j 容错功能作为装饰器 (https://github.com/resilience4j/resilience4j/tree/master/resilience4j-feign),所以我想使用它。

所以我用了这个,将功能加在一起,并将默认的编码器、解码器等项目添加到 feign 构建器中。事实证明,我当然必须通过 .target 调用来完成我的代码,这会创建我的客户端代理,而我无法用 Eureka 以一种好的方式真正做到这一点:

  1. 第一个构造函数,它采用class类型并且URL是硬编码的,所以如果我在这个参数中添加一个eureka next server query,它只是一个对其中一个实例进行了硬编码 url,这不是负载平衡的。一些变通办法可能是我创建原型作用域或类似的此客户端的短期作用域 bean,并始终获得 "next url" 进行调用。这增加了我制作的每个 class 中使用客户端的负担。至少如我所见。也许我可以在原型设计周围添加某种单例帮助程序 bean,但正如我所见,这又不是一个好的设计

  2. 我想也许我可以从 Target 接口创建一个 EurekaTarget,但是当然 none 的方法指示任何 "end of lifecycle" 的东西,甚至不包括 apply 方法。我想也许这是在进行服务调用之前调用的一个点,但我看到多次调用它所以我不得不为所有调用更改 url。

您知道执行此迁移的更好解决方案吗?

我猜你正在使用 Spring 引导? Resilience4j 的下一个版本 v1.0.0 将支持 @FeignClient 注解。 有一个 PR 添加了功能 -> https://github.com/resilience4j/resilience4j/pull/579

然后您可以按如下方式使用它:

@FeignClient(name = DUMMY_FEIGN_CLIENT_NAME)
@CircuitBreaker(name = DUMMY_FEIGN_CLIENT_NAME)
public interface DummyFeignClient {

    String DUMMY_FEIGN_CLIENT_NAME = "dummyFeignClient";

    @GetMapping(path = "/api/{param}")
    void doSomething(@PathVariable(name = "param") String param);
}