几天前我开始学习微服务中的容错解决方案。我的生态系统中有一些微服务,它们现在与 Eureka 服务查找互连。我使用 FeignClient 从一个到另一个进行调用。正如我听到和读到的,Hystrix 正在进入维护阶段,我想知道我是否可以在 Feign 中使用 Resilience4J 而不是 Hystrix。好吧,至少现在看来不是从注释级别来看。我发现了一个很棒的 Feign.Builder 适配器,可以在 FeignClient 之上作为装饰器添加韧性4j 容错功能( https://github.com/resilience4j/resilience4j/tree/master/resilience4j-feign ),所以我想使用它。
所以我使用了这个,将功能添加到一起,并将默认编码器、解码器等项添加到 feign 构建器中。事实证明,我当然必须使用 .target 调用来完成我的代码,该调用创建我的客户端代理,但我无法真正以一种好的方式使用 Eureka 来完成此操作:
第一个构造函数,它采用类类型并且 URL 是硬编码的,因此如果我将 eureka next 服务器查询添加到此参数中,它只是其中一个实例的硬编码 url,这不是加载均衡。某种解决方法可能是我创建该客户端的原型(prototype)作用域或类似的短期作用域 bean,并始终获取调用的“下一个 url”。这给我在每堂课中使用客户端增加了很多负担。至少在我看来是这样。也许我可以在原型(prototype)设计周围添加某种单例辅助 bean,但正如我所见,这并不是一个好的设计
我想也许我可以从 Target 接口(interface)创建一个 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/