如何设计具有外部阻塞 API 调用的响应式微服务?

Posted

技术标签:

【中文标题】如何设计具有外部阻塞 API 调用的响应式微服务?【英文标题】:How to design reactive microservices, which have external blocking API calls? 【发布时间】:2019-03-12 08:04:19 【问题描述】:

我有一些微服务,它们应该在 WebFlux 框架之上运行。每个服务器都有自己的带有 Mono 或 Flux 的 API。我们使用的是 Spring 支持的 MongoDB(Spring Data MongoDb Reactive)。

问题是外部阻塞 API,我必须在我的系统中使用它。

我有一个解决方案。我可以将阻塞 API 调用包装在专用线程池中,并将其与 CompletableFuture 一起使用。

还有什么可以解决我的问题吗?我认为,全新的 Rsocket 无法解决我的问题。

【问题讨论】:

阻塞API是指简单的http请求-响应类型API? spring docs.spring.io/spring-framework/docs/5.0.0.M1/… 存在响应式 HTTP 客户端。 @DavidSzalai 是的,我的意思是简单的 http 请求-响应类型 API。 我明白了。然后,如果它使用非阻塞 IO,则可以使用我链接的响应式 Web 客户端(您应该检查一下,但我认为确实如此)。如果您考虑一下,专用的线程池和用期货包装阻塞 api 调用并不会使其成为非阻塞。它只是将“阻塞”部分外包给另一个线程池。简单来说,非阻塞的整个目的是不等待响应,而是在响应到达时得到通知(例如以事件的形式),因此它需要一些低级别的操作系统协调。 【参考方案1】:

1.如果可能,您可以使用 WebClient 类将阻塞 API 调用更改为响应式方式。

参考资料:

    Reference guide WebClient API A simple, complete sample

2.如果阻塞 API 不能更改为响应式 API,我们应该有一个专用的、经过良好调整的线程池并在那里隔离阻塞代码。 还有一个例子here。

【讨论】:

【参考方案2】:

我不明白为什么不能在 Flux 或 Mono 中封装阻塞 API 调用。如果你觉得演员模型更容易,你也可以integrate Akka with Spring。

【讨论】:

【参考方案3】:

RSocket 应该是一个完美的选择,很好的教程让你开始

https://www.baeldung.com/spring-boot-rsocket

https://spring.io/blog/2020/04/06/getting-started-with-rsocket-spring-boot-channels

【讨论】:

以上是关于如何设计具有外部阻塞 API 调用的响应式微服务?的主要内容,如果未能解决你的问题,请参考以下文章

实战SpringCloud响应式微服务系列教程(第六章)

SpringCloud分布式微服务搭建

升级微服务架构5:API网关

在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?

如何从 Spring Boot 应用程序调用外部 JWT API 服务 [关闭]

Firebase 云功能,具有对外部 api 的基本身份验证的获取请求