我几天前开始学习微服务中的容错解决方案。我的生态系统中有一些微服务,现在它们已与Eureka服务查找互连。我使用FeignClient从一个呼叫到另一个。正如我听到和阅读的那样,Hystrix即将投入维护,我想知道是否可以在Feign中使用Resilience4J代替Hystrix。好吧,至少现在看来并非如此。我发现了一个很棒的Feign.Builder适配器,可以在FeignClient上方将resilience4j容错功能添加为装饰器(https://github.com/resilience4j/resilience4j/tree/master/resilience4j-feign),因此我想使用它。

因此,我使用了此功能,将功能加在一起,并将默认的编码器,解码器等项添加到了伪装生成器中。事实证明,我必须使用.target调用来完成我的代码,该调用创建了我的客户端代理,而我不能用一种很好的方式用Eureka做到这一点:


第一个构造函数采用类类型,并且URL进行了硬编码,因此,如果我向该参数添加一个eureka next服务器查询,则它只是其中一个实例的硬编码url,因此不会实现负载平衡。某种解决方法可能是,我创建了该客户端的prototype-scope或类似的短期作用域bean,并始终获得该调用的“下一个URL”。这增加了我在每个班级使用客户的负担。至少如我所见。也许我可以在原型周围添加某种单例助手bean,但是正如我所见,这也不是一个好的设计
我以为也许可以从Target接口创建EurekaTarget,但是当然没有一种方法可以指示任何“生命周期结束”的事情,甚至没有apply方法。我认为也许这是在进行服务调用之前已被调用的一点,但是我看到有多次调用它,因此我必须更改所有调用的URL。


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

最佳答案

我猜你在用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);
}

关于java - 以编程方式创建Feign客户和Eureka目标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57883352/

10-10 14:31