你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何将服务总线与 RabbitMQ 集成

在本指南中,我们将学习如何将消息从 RabbitMQ 发送到服务总线。

以下是可以利用这些功能的几个应用场景:

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

列表还在继续扩充,但是我们可以通过将 RabbitMQ 桥接到 Azure 来解决大多数此类用例的问题

首先,你需要通过在此处注册来创建一个免费 Azure 帐户

登录到你的帐户后,请转到 Azure 门户并创建一个新的 Azure 服务总线命名空间。 命名空间是消息传递组件(如队列和主题)所在的范围容器。

添加新的 Azure 服务总线命名空间

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

创建资源

然后选择“集成”并单击“Azure 服务总线”以创建消息传递命名空间:

选择 Azure 服务总线

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

创建命名空间

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

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

创建命名空间确认

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

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

创建我们的 Azure 服务总线队列

现在你已经有了 Azure 服务总线命名空间,请单击左侧 Queues 下的 Entities 按钮,以便添加新队列:

创建队列

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

启用 RabbitMQ Shovel 插件

为了将消息从 RabbitMQ 发送到 Azure 服务总线,我们将使用 RabbitMQ 附带的 Shovel 插件。 可以使用以下命令启用插件及其可视化界面:

rabbitmq-plugins enable rabbitmq_shovel_management

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

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

将 RabbitMQ 连接到 Azure 服务总线

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

添加 SAS 策略

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

创建策略后,单击它即可查看主连接字符串。 我们将使用它让 RabbitMQ 与 Azure 服务总线对话:

获取 SAS 策略

选中复选框“显示 AMQP 连接字符串”,以获取 RabbitMQ Shovel 预期的 AMQP 格式的连接字符串。 在下一步骤中将使用它。

现在,在浏览器中打开 RabbitMQ 管理插件 http://localhost:15672/#/dynamic-shovels 并转到 Admin -> Shovel Management,可以在其中添加新的 shovel,以便将消息从 RabbitMQ 队列发送到 Azure 服务总线队列。

添加 RabbitMQ Shovel

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

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

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

amqps://rabbitmq-shovel:StringOfRandomChars@rabbitmq.servicebus.windows.net:5671/?sasl=plain

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

将消息从 RabbitMQ 发布到 Azure 服务总线

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

发布第一条消息

返回 Azure 并检查队列。 单击左侧面板中的 Service Bus Explorer,然后单击“速览”按钮。 如果一切顺利,你会看到队列现在有一条消息。 耶,恭喜!

Azure 服务总线队列

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

队列速览

让我们回顾一下

恭喜! 你获得了很多成果! 你已成功将消息从 RabbitMQ 发送到 Azure 服务总线,让我们回顾一下这些步骤:

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

通过执行前面的步骤,你集成了组织中位于 Azure 之外的区域。 Shovel 插件允许你将消息从 RabbitMQ 发送到 Azure 服务总线。 这具有巨大的优势,因为你现在可以允许受信任的第三方将其应用与你的 Azure 部署连接起来。

归根到底,消息传递就是为了启用连接,而我们刚刚使用此方法建立了一个新连接。

后续步骤