向客户端隐藏 Spring 消息传递基础结构

Hiding Spring Messaging Infrastructure from Clients

我正在开发一项使用 Spring 进行消息传递和集成的服务。该服务有一个入站消息通道,客户端可以使用它向服务发送控制信息,还有一个出站消息通道,服务可以使用它向感兴趣的客户端发送事件信息。

我希望服务可以部署在客户端位于不同地址 spaces 并使用消息传递技术(例如 zeromq 或 AMQP)与服务通信的场景中,以及在以下场景中客户端驻留在与服务相同的地址 space 并使用基本的 POJO 调用与服务通信。

在后一种情况下 - 客户端和服务在同一地址 space - 我很清楚如何使用 MessagingGateway 之类的东西来隐藏从客户端到服务的调用的消息传递基础结构。但是,我不太清楚如何向希望从服务异步接收事件信息的客户端隐藏消息传递基础结构。

使用 Spring 集成来执行此操作的首选方法是什么?

ZeroMQ 没有可被视为消息代理的持久存储。从技术上讲,我们没有任何可以依赖的中介。只要存在通信的一方,我们就会丢失数据。这就是我对 ZeroMQ binder 的五个看法。

通过简单的 Spring 集成,当您仍想使用 ZeroMQ 通道适配器作为应用程序之间的契约以及对目标用户隐藏消息传递基础结构的内容时,您确实可以使用 @MessagingGateway发送.

对于异步接收(又名订阅),我建议查看 Reactor Flux 对集成流程的支持。一种选择是使用 IntegrationFlowDefinition.toReactivePublisher()。另一种是使用 Flux.from(FluxMessageChannel)。然后,您只需使用所有这些 Reactor 运算符为最终用户带来高级 API 来订阅此流并使用。

在文档中查看更多内容:https://docs.spring.io/spring-integration/docs/current/reference/html/reactive-streams.html#reactive-streams

最后,当然可以使用Spring Cloud Stream 及其功能支持,让最终用户只专注于某个微服务的业务逻辑。只有你的问题是没有 ZeroMQ 活页夹,而且可能不会。