0

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

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

  1. 第一个构造函数,它采用类类型并且 URL 是硬编码的,所以如果我在这个参数中添加一个 eureka next server 查询,它只是一个实例的硬编码 url,这不是负载平衡的。某种解决方法可能是我创建该客户端的原型作用域或类似的短期作用域 bean,并始终获得调用的“下一个 url”。这增加了在我制作的每个课程中使用客户端的负担。至少在我看来。也许我可以在原型设计周围添加某种单例辅助 bean,但正如我所见,这又不是一个好的设计

  2. 我想也许我可以从 Target 接口创建一个 EurekaTarget,但是当然没有任何方法表明任何“生命周期结束”的东西,甚至是 apply 方法。我想这可能是在进行服务调用之前调用的一个点,但我看到多个调用它,所以我不得不更改所有调用的 url。

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

4

1 回答 1

2

我猜你正在使用Spring Boot?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);
} 
于 2019-09-13T08:19:50.350 回答