spring-cloud-feign - 如何将阻塞的 Feign 客户端转换为反应性的 Feign 客户端
问题描述
简介
1. 我们有很多 Spring 微服务,一些完全响应式 (spring-webflux) 和一些旧式 (spring-web)。
2. 我们使用 Feign 将我们微服务中的 API(和客户端)定义为接口,并在我们的控制器中实现它们。
3. 每个微服务可能对这两种类型都有依赖。
Objective
为了防止代码重复,在普通 Feign 客户端的基础上生成 Reactive Feign 客户端(反之亦然)。
我已经开发了一个 (PoC) Maven 插件,它读取Feign
接口并生成具有相同签名但响应式返回类型的响应式接口。
1. 这是一个愚蠢的想法吗?如果是这样,我应该怎么做才能让我们的客户同时支持这两种技术而不会重复代码?
2. 市场上是否有我可以使用的工具/解决方案?(或者我应该继续使用我的 Maven 插件吗?)
解决方案
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();
}
}
您可以使用此库来帮助您入门。我们的路线图包括在不久的将来提供全面的响应式支持。
推荐阅读
- go - 在 Go 程序中使用 select 时会出现死锁
- ios - 请求系统权限时,SwiftUI 工作表被关闭
- jasper-reports - 表中的意外过滤器
- webpack - Webpack 配置 - 检索 [name] 作为 mini-css-extract-plugin 中的变量
- python - 在插入两列数据框而不是一列时了解 scipy 的 shapiro 行为
- arrays - 如何在 postgres 中使用多个数组对象查询 jsonb 以获取不同列而不是不同行的结果
- python - 从给定包含开始和结束索引的 ndarray 的二维数组中提取
- c - 循环条件不会停止程序
- sql-server - 如何获取在存储过程中执行的存储过程的自定义错误?
- http - Julia 在 HTTP WebSocket 块中挂起异常