带有阻塞IO的Spring Boot是否真的适合微服务?

时间:2018-02-11 14:56:37

标签: spring-boot microservices blocking

有许多教程和文章(包括官方网站)将spring boot作为构建微服务的好工具。

假设我们有一些其他api端点(用户配置文件),它聚合来自多个服务的数据(用户服务,统计服务,朋友服务)。

为实现此目的,用户配置文件端点对这些服务进行3次http调用。

但是在Spring中,请求是阻塞的,正如我所看到的,服务器将很快耗尽可用资源(线程)来在这样的系统中提供请求。

所以对我来说,构建这样的系统是非常低效的方式(与非阻塞框架相比,比如play!framework或node.js)

我错过了什么吗?

P.S。:我不是指今年春季5的新webflux框架。

2 个答案:

答案 0 :(得分:1)

没有人阻止您使用Spring Boot构建异步微服务架构:)。

这些方面的东西:

enter image description here

服务可以将事件放入队列(例如RabbitMQ),而不是一个服务同步调用另一个服务。事件将传递给订阅这些事件的服务。

使用RabbitMQ及其"交换"概念,事件提供服务甚至不需要消费者的事件。

可以在此处找到使用Spring Boot代码详细说明此内容的博文:https://reflectoring.io/event-messaging-with-spring-boot-and-rabbitmq/

答案 1 :(得分:1)

这不是Spring的限制,而是与应用程序架构有关。

例如,您使用的场景通常使用聚合设计模式解决 enter image description here

虽然这种解决方案非常普遍,但它具有同步的限制,因此具有阻塞性。此类场景中的异步行为应以特定于应用程序的方式实现。

话虽如此,如果您必须调用其他服务以便能够响应来自客户端(外部)的请求,这通常是架构问题。如果您使用HTTP或异步消息传递(使用请求 - 回复模式),这无关紧要,外部客户端的总体响应时间将会很糟糕

另外,我已经看到很多应用程序对外部客户端使用同步REST调用,但是当内部MicroServices之间需要通信时,它应该始终是异步的。您可以在此处阅读有关此主题的有趣论文MicroServices Messaging Patterns