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

标签 java spring-cloud-feign resilience4j

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

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

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

  2. 我想也许我可以从 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/

相关文章:

java - 如何调用 parking 票(parker, parker)?

spring-cloud-feign - feign如何获取所请求接口(interface)的头数据

java - 无法配置 Feign Client 超时

java - Spring Boot执行器健康端点+动态弹性4j断路器

java - 带有比较加三元运算符表达式的表达式 "a==1 ? 1 : 0"是原子的吗?

Java 多对象 JFrame

spring - 如何让多个 Fe​​ignClient-s 使用相同的 serviceId/name?

spring-boot - 不清楚的断路 "fallback"行为

java - Resilience4j Retry - 记录来自客户端的重试尝试?

java.util.function.BiConsumer<R,R>) 不适用(无法推断类型变量 R