首页 > 解决方案 > 如何将阻塞的 Feign 客户端转换为反应性的 Feign 客户端

问题描述

简介
1. 我们有很多 Spring 微服务,一些完全响应式 (spring-webflux) 和一些旧式 (spring-web)。
2. 我们使用 Feign 将我们微服务中的 API(和客户端)定义为接口,并在我们的控制器中实现它们。
3. 每个微服务可能对这两种类型都有依赖。

Objective
为了防止代码重复,在普通 Feign 客户端的基础上生成 Reactive Feign 客户端(反之亦然)。

我已经开发了一个 (PoC) Maven 插件,它读取Feign
接口并生成具有相同签名但响应式返回类型的响应式接口。
1. 这是一个愚蠢的想法吗?如果是这样,我应该怎么做才能让我们的客户同时支持这两种技术而不会重复代码?
2. 市场上是否有我可以使用的工具/解决方案?(或者我应该继续使用我的 Maven 插件吗?)

标签: spring-cloud-feignfeign

解决方案


Feign 包含简单的Reactive 流支持,允许使用 Reactive 返回类型。该库将方法执行包装在 Reactive 包装器中。它不是“一直响应式”,方法执行仍然是阻塞的,但它可以集成到现有的 Reactive 执行链中。

要使用提供的库,请将其作为依赖项包含:

<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-reactive-wrappers</artifactId>
   <version>10.4.0</version>
</dependency>

并为您想要的反应流实现使用适当的构建器,支持 Reactor 和 RxJava2+。

public class ExampleReactor {
  public static void main(String args[]) {
    GitHubReactor gitHub = ReactorFeign.builder()      
      .target(GitHubReactor.class, "https://api.github.com");

    List<Contributor> contributors = gitHub.contributors("OpenFeign", "feign")
      .collect(Collectors.toList())
      .block();
  }
}

您可以使用此库来帮助您入门。我们的路线图包括在不久的将来提供全面的响应式支持。


推荐阅读