【问题标题】:Programmatically created Feign client and Eureka target以编程方式创建的 Feign 客户端和 Eureka 目标
【发布时间】:2020-01-12 22:51:43
【问题描述】:

几天前我开始学习微服务中的容错解决方案。我的生态系统中有一些微服务,它们现在与 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。

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

【问题讨论】:

    标签: java spring-cloud-feign resilience4j


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 2018-09-08
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2016-03-27
      相关资源
      最近更新 更多