Compartilhar via

如何将Service Bus与 RabbitMQ 集成

本指南介绍如何将消息从 RabbitMQ 发送到Service Bus。

下面是一些可以利用这些功能的方案:

  • Edge Setups:我们有一个边缘设置,用于将消息发送到 RabbitMQ,但我们希望将这些消息转发到 Azure Service Bus 进行进一步处理,因此可以使用许多 Azure 大数据功能
  • 混合云:贵公司刚刚收购了一家使用 RabbitMQ 满足其消息传递需求的第三方。 它们在不同的云上。 虽然它们过渡到Azure但可以通过将 RabbitMQ 与 Azure Service Bus 桥接来开始共享数据。
  • 第三方集成:第三方使用 RabbitMQ 作为代理,并希望将其数据发送给我们,但其不在我们的组织内。 我们可以向他们提供 SAS 密钥,使他们能够访问一组有限的Azure Service Bus队列,他们可以将消息转发到其中。

类似的例子还有很多,但我们可以通过将RabbitMQ连接到Azure来解决其中大多数用例。

首先,需要通过注册 here

登录到帐户后,转到 Azure 门户并创建新的 Azure Service Bus namespace。 命名空间是消息传递组件(例如队列和主题)所在的作用域容器。

添加新 Azure Service Bus 命名空间

在Azure门户中,单击“大加号”按钮添加新资源

创建资源

然后选择“集成”并单击Azure Service Bus以创建消息命名空间:

 选择Azure服务总线

系统会提示你输入命名空间信息。 选择要使用的Azure订阅。 如果没有资源组,可以新建一个。

创建命名空间

rabbitmq 使用 Namespace name,但它可以是你想要的任何内容。 然后为位置设置 China East。 选择 Basic 作为价格段。

如果一切正常,你应该会看到以下确认屏幕:

创建命名空间确认

然后返回到Azure门户,你将看到其中列出的新 rabbitmq 命名空间。 单击该资源以访问它,然后添加队列。

具有新命名空间的资源列表

创建我们的Azure Service Bus队列

有了Azure Service Bus命名空间后,请单击左侧的 Queues 按钮,在 Entities 下,以便添加新队列:

创建队列

队列的名称将是 from-rabbitmq,以提醒消息来自何处。 你可以将所有其他选项保留为默认值,但也可以更改它们来满足应用的需求。

启用 RabbitMQ Shovel 插件

若要将消息从 RabbitMQ 寄送到 Azure Service Bus,我们将使用与 RabbitMQ 一起打包的 Shovel 插件。 可以使用以下命令启用此插件及其可视化界面:

rabbitmq-plugins enable rabbitmq_shovel_management

你可能需要以 root 身份运行该命令。

现在是时候获取将 RabbitMQ 连接到 Azure所需的凭据了。

将 RabbitMQ 连接到 Azure Service Bus

需要为队列创建共享访问策略 (SAS),以便 RabbitMQ 可以向其发布消息。 使用 SAS 策略,你可以指定允许哪个外部方对你的资源执行操作。 这里的构思是允许 RabbitMQ 发送消息,但不侦听或管理队列。

添加 SAS 策略

勾选 Send 框,然后单击 Create 以实施我们的 SAS 策略。

创建策略后,单击它即可查看主连接字符串。 我们将使用它让 RabbitMQ 与Azure Service Bus交谈:

获取 SAS 策略

选中复选框“显示 AMQP connection string”,以获取 RabbitMQ Shovel 预期的 AMQP 格式的 connection string。 在下一阶段中你将使用它。

现在,在浏览器中打开 RabbitMQ 管理插件,http://localhost:15672/#/dynamic-shovels并转到 Admin -> Shovel Management,在那里您可以添加新的搬运工具,负责将消息从 RabbitMQ 队列发送到 Azure Service Bus 队列。

添加 RabbitMQ Shovel

在此处调用你的 Shovel azure 并选择 AMQP 0.9.1 作为源协议。 在屏幕截图中,我们有 amqp://,这是将我们连接到本地 RabbitMQ 服务器的默认 URI。 请确保使它适应你的当前部署。

对于队列,可以使用 azure 作为队列的名称。 如果该队列不存在,RabbitMQ 会为你创建它。 你还可以选择已存在的队列的名称。 可以让其他选项保留默认值。

然后,对于 destination,选择 AMQP 1.0 作为协议。 在 URI 字段中,输入从上一步获取的连接字符串。 它应如下所示:

amqps://rabbitmq-shovel:StringOfRandomChars@rabbitmq.servicebus.chinacloudapi.cn:5671/?sasl=plain

Address 字段中,我们将输入Azure Service Bus队列的名称,在本例中,它称为 from-rabbitmq。 单击 Add Shovel 后,你的设置应该已准备好开始接收消息。

将消息从 RabbitMQ 发布到 Azure Service Bus

在 RabbitMQ 管理界面中,可以转到 Queues,选择 azure 队列,然后搜索 Publish message 面板。 其中会显示一个窗体,可让你直接将消息发布到队列。 对于我们的示例,只需将 first message 添加为 Payload 并点击 Publish Message

发布第一条消息

返回Azure并检查队列。 在左侧面板中单击Service Bus Explorer,然后单击Peek按钮。 如果一切顺利,你会看到队列现在包含一条消息。 好极了,恭喜你!

Azure Service Bus Queue

但请确保消息是你从 RabbitMQ 发送的消息。 选择 Peek 选项卡,并单击 Peek 按钮以检索队列中最后的消息。 单击该消息以检查其内容。 你应该会看到类似下图的内容,其中列出了你的 first message

队列速览

让我们回顾一下

恭喜! 你已取得了很多成果! 你设法将消息从 RabbitMQ 获取到Azure Service Bus,让我们回顾一下这些步骤:

  1. 创建Azure Service Bus命名空间
  2. 向命名空间添加队列
  3. 向队列添加 SAS 策略
  4. 获取队列连接字符串
  5. 启用 RabbitMQ shovel 插件和管理界面
  6. 从门户获取已转换为RabbitMQ的AMQP格式的Azure服务总线连接字符串。
  7. 将新的 Shovel 添加到 RabbitMQ,并将其连接到 Azure Service Bus。
  8. 发布消息

通过遵循前面的步骤,你已将组织中不在 Azure 上的区域进行了集成。 Shovel 插件允许你将消息从 RabbitMQ 传送到 Azure Service Bus。 这具有巨大的优势,因为现在可以允许受信任的第三方将其应用与Azure部署连接。

归根到底,消息传递就是启用连接,而我们刚刚使用此技术打开了一个新连接。

高级场景

如果需要对 request-reply 等模式的支持,无论是 RabbitMQ 端发起的还是从Azure Service Bus端回复的,反之亦然,都需要更高级的工具。 NServiceBus Messaging Bridge 支持跨多个其他消息中转站技术的请求-回复和发布-订阅

后续步骤