java-异步消息传递和微服务

我正在计划开发基于微服务的体系结构应用程序,在阅读Ronnie Mitra的《微服务体系结构》一书时,我决定使用kafka进行内部通信.马特·麦克拉蒂;迈克·阿蒙森;伊拉克里·纳达雷什维利说:

letting microservices directly interact with message brokers (such as
RabbitMQ, etc.) is rarely a good idea. If two microservices are
directly communicating via a message-queue channel, they are sharing a
data space (the channel) and we have already talked, at length, about
the evils of two microservices sharing a data space. Instead, what we
can do is encapsulate message-passing behind an independent
microservice that can provide message-passing capability, in a loosely
coupled way, to all interested microservices.

enter image description here

我正在使用Netflix Eureka进行服务注册和发现,Zuul作为边缘服务器和Hystrix.
这样说,在实践中,如何实现这种微服务?如何使我的微服务脱离通讯渠道(在本例中为Kafka)?
实际上,我是直接与该频道进行互动,因此在发布者/订阅者和kafka之间没有多余的层.

更新06/02/2018

更确切地说,我们有两个微服务:一个是发布有关某个主题的新闻(activemq,kafka …),另一个是订阅该主题的微服务,并对正在通过的消息进行一些操作.因此,我们有这些与消息代理(通道)耦合的服务…我们在代码中具有“嵌入”消息代理的api,例如,如果要更改消息代理,则必须更改所有使用了消息代理的api的微服务.因此,他们建议使用微服务(在我假设的照片中是事件中心),它是各种消息的“调度程序”.这样,它是与通道交互的唯一组件.

最佳答案
一般前言-如果不需要,请不要这样做.如果您要处理大量事件和事件备份问题等,那么引入队列系统将是一个很大的改进.但是,如果您没有遇到任何问题,则直接服务通信的复杂性可能会更好.

回到您的问题-听起来您想抽象化与队列的通信,因为您担心用其他系统替换队列的工作-正确吗?

在这种情况下,您可以执行建议的操作-在中间开发新服务.这伴随着物理服务的所有负担(包括部署,扩展等).

或者,第二种选择是编写一个客户端库,该客户端库以所需的方式抽象队列,并允许您在需要参与队列的所有服务中重用它.这样,您无需为此目的而物理部署另一服务,但是您仍然可以完全控制队列接口的外观,并且只需一个代码就可以合并更改(至少朝着更改的方向).队列).只要您确定库的面向应用程序的一侧足够稳定,就可以使用.

但是,同样,当您不确定是否需要所有复杂性时,请不要在第一次迭代中进行任何操作. (过度设计是危险的事情)

转载注明原文:java-异步消息传递和微服务 - 代码日志