我正在开发一个基于微服务的应用程序。它是由约建造的。 30 个微服务,通常其中一些微服务通过 RabbitMQ 相互通信。
此类服务的配置文件中有交换器、队列和路由键的名称 (
application.yml
)。
所有相应的 bean(包括绑定)都是在 @Configuration
中创建的。
所有这些都是在服务启动时自动创建的。
由于这是一个启动项目,其特点是在设计、交换器重命名、路由键、队列等方面进行了大量更改。
因此,如果有一个可以管理所有必要绑定的中心位置,那就太好了。 因此,您必须在一处重命名交换和/或路由密钥。 另一个优点是透明度 - 一个文本文件包含有关哪些服务依赖于哪些交易所的信息。
此类管理组件的配置可能如下所示:
services:
service1: s1
binding1:
exchange: e1
queue1: s1q1
routing-key: rk1
binding2:
exchange: e1
queue1: s1q2
routing-key: rk2
...
service2: s2
binding1:
exchange: e2
queue1: s2q1
routing-key: rk3
binding2:
exchange: e2
queue1: s2q1
routing-key: rk4
...
...
并且
service1
的配置可以只包含队列名称:
config:
queue1: s1q1
queue2: s1q2
...
服务将仅创建队列和管理组件 - 交换和绑定。
我正在考虑创建额外的服务,其唯一目的是创建绑定。 但我不确定我是否不会重新发明轮子。
有这样的实用程序(也许是 RabbitMQ 插件)可以解决这个问题吗?
这是应用于 EDA 的治理的一流示例。它避免了不受控制的意大利面条路由。服务应该简单地将消息馈送到该服务的输入队列中,然后将其处理的事件提升到其专用的输出队列。其事件从其私有输出队列(在企业周围公开)的路由不是单个服务关心的问题,也不应受其影响。这应该在声明性文件中单独和集中控制 - 一种 EDA 全局编排任务控制 (EventOrchestration.yml)。然后,发布自动化脚本会读取此配置,以配置消息代理的路由。 我是 RabbitMQ 的新手,也想要一个答案 - 今天才开始阅读。它可以通过 Azure 服务总线以及转发和过滤规则来完成。转发规则根据消息的标头或有效负载属性路由事件。但看起来 RabbitMQ 中也存在类似的东西,通过根据消息中的路由键在交换级别设置路由规则。