一段时间以来,我一直在开展围绕生态系统的项目** IoT **(物联网)使用** SBC **(单板计算机)例如** Raspberry Pi **。在 IoT 生态系统中,** Message Broker **是那些组件之一,我想说是基本的,它可以实现“铁块”之间的通信。

** MQTT **协议实际上是**机器对机器(M2M)**连接之王,随着物联网概念的演进和传播越来越流行。 MQTT 协议可以被认为是** AMQP **的轻量级和简化模拟,同样基于模型** 发布/订阅 **,但提供了更小的网络占用空间并且可以使用通过计算能力有限的小型设备。

有许多开源和付费的 MQTT 消息代理可供使用,例如:

  • 蚊子

  • HiveMQ

  • 阿帕奇 ActiveMQ

  • 兔MQ

  • 二郎MQTT(EMQ)

** Apache ActiveMQ ** 是最流行的开源、多协议、基于 Java 的消息代理之一。它支持行业标准协议,因此用户可以从各种语言和平台的客户端选择中受益。 ActiveMQ 目前有两个“版本”:“经典”5.x 代理和用于基于事件的消息传递应用程序的“新一代”Artemis 代理(** 事件驱动的消息传递应用程序 **)。当 Artemis 达到与代码库 5.x 的功能相当的水平时,它将成为 ActiveMQ 6。

在我的项目中,我通常使用 RabbitMQ(还有CloudAMQP)和 Apache ActiveMQ。我最近开始尝试将 Apache ActiveMQ Artemis 作为消息代理安装在 Raspberry Pi 上。

在本文中,我想向您展示如何为** ARM **平台构建自己的 Apache ActiveMQ Artemis Docker 映像,然后在 Raspberry Pi 上运行。

1 .从哪儿开始?

我们首先进入ActiveMQ Artemis项目的主页,然后从这里,我们立即指向 ** Easy Docker Creation ** 部分。

ActiveMQ Artemis 提供了一些简单的脚本来开始使用 Docker。为了能够为 ARM 平台生成 Docker 映像,大约两周前,我有机会为 ActiveMQ Artemis 项目做出贡献,扩展了模块artemis-docker。

在继续之前,让我们看看要求是什么:

  1. git 是可选的。如果可以从 GitHub 下载格式为zip的项目;

  2. JDK 8 或 11。建议使用 JDK 11 创建自己的 Docker SNAPSHOT 镜像来构建源代码,因为 artemis-docker 模块允许您从的镜像开始为 ARM 创建 Docker 镜像 ** AdoptOpenJDK 11 * *;

  3. Maven 3.x 是可选的。如果您可以使用项目中包含的 Maven 包装器 (mvnw);

  4. Docker 19.x/20.x;

5.Docker Buildx。对于 19.03 以后的 Docker 版本,buildx 已包含在内,无需单独安装;

  1. Docker Hub 上的存储库,用于托管我们要创建的 Docker 映像。然后有必要帮助安装在您的 Raspberry Pi 上创建的 Docker 映像。

因此,让我们从运行 ActiveMQ Artemis 项目的克隆开始。出于我们的目的,我们还可以克隆项目的 Git 存储库,而无需携带所有历史记录:git clone --depth 1 https://github.com/apache/activemq-artemis.git

2 .让我们创建我们的 Docker 镜像

感谢模块artemis-docker,我们有许多选项来获取不同的 Docker 镜像:

1.为ActiveMQ Artemis官方版本创建Docker镜像;

  1. 为本地分发创建Docker镜像,即为从源构建中获得的SNAPSHOT版本;

3、基于CentOS和Debian镜像用Java 8创建Docker镜像;

  1. 在 AdoptOpenJDK 的实现中使用 Java 11 创建基于 Ubuntu 的 Docker 镜像;

  2. 为 ARM (ARMv7 / ARM64) 创建 Docker 镜像。

artemis-docker 模块的readme.md清楚地描述了如何追求上面列出的选项。我们将重点介绍如何为 ARM 创建 Docker 映像,既适用于 ActiveMQ Artemis 的正式版本,也适用于 SNAPSHOT 版本,后者用于在正式版本发布之前测试新功能。

为 SNAPSHOT 版本创建 ARM 的 Docker 映像涉及以下步骤。 SNAPSHOT 的当前版本(在本文发表时)是 2.18.0。

  1. 克隆 del 存储库 di ActiveMQ Artemis。

  2. 构建项目以获得 SNAPSHOT 分发。

  3. 准备本地部署的 Docker 文件。

  4. 根据 ARM e push sul 存储库 Docker Hub 构建 dell’immagine Docker。

项目的构建时间根据您机器的计算能力而变化,例如,在我的 Mac Book Pro(2017 年中)i7-7660U 和 16GByte 的 RAM 上大约需要 5 分钟(没有运行单元测试)。 Docker 镜像构建操作在推送和拉取操作中花费的时间最多,这取决于互联网可用的连接性。

如果您没有良好的网络连接,您可能会遇到如下错误:

  1. 计算缓存键失败:参考“layer-sha256:f60421c1f”提交失败:大小验证失败:2292149 !u003d24043427:前置条件失败

2.net/http:TLS握手超时

  1. 复制失败:意外状态:504 Gateway Time-out

满足上述四个步骤所需的命令如下所示。

# 1. Clone the repository
$ git clone --depth 1 https://github.com/apache/activemq-artemis.git

# 2. Build of the project
$ cd activemq-artemis

# If you want skip the test use the -DskipTests argument
$ mvn clean install

# 3. Prepare the Docker file
$ cd artemis-docker
$ ./prepare-docker.sh --from-local-dist --local-dist-path ../artemis-distribution/target/apache-artemis-2.18.0-SNAPSHOT-bin/apache-artemis-2.18.0-SNAPSHOT

# 4. Build the Docker image for ARM. You should replace the {your-username} and {your-repository-name} placeholders with your values
$ cd ../artemis-distribution/target/apache-artemis-2.18.0-SNAPSHOT-bin/apache-artemis-2.18.0-SNAPSHOT
$ docker buildx build --platform linux/arm64,linux/arm/v7 --push -t {your-username}/{your-repository-name}:2.18.0-SNAPSHOT -f ./docker/Dockerfile-adoptopenjdk-11 .

进入全屏模式 退出全屏模式

如果prepare-docker.sh脚本(第3步)执行成功,在屏幕上应该会看到如下图所示,即脚本(Docker文件和运行容器的脚本)这些是在 docker 目录中创建的,该目录又位于 ActiveMQ Artemis 分发目录中,此外,您将找到有用的信息以继续构建 Docker 映像。

图 1 - Docker 映像构建准备脚本输出

图 1 – Docker 镜像构建准备脚本输出

对于 Docker 映像构建命令(第 4 步),您应该将 ** {your-username} ** / ** {your-repository-name} ** 占位符替换为您的值。在我的情况下,这转化为 ** amusarra / apache-artemis **。

图2-执行buildx命令为ARM生成Docker镜像

图 2 – 执行 buildx 命令为 ARM 生成 Docker 映像

执行第 4 步后,您应该会在 Docker Hub 存储库中看到 ActiveMQ Artemis 版本 2.18.0-SNAPSHOT 映像。下图特别显示了我的 amusarra / apache-artemis 存储库的内容。

图 3 - 构建和推送后 Docker Hub 仓库 amusarra/apache-artemis 的内容

图 3 – 构建和推送后 Docker Hub 存储库 amusarra/apache-artemis 的内容

如果我们要准备 ActiveMQ Artemis 版本 2.16.0(当前发布版本)的 Docker 镜像,步骤减少到两个:

  1. 为发布版本(本例为 2.16.0)准备 Docker 文件;

  2. 为 ARM 构建 Docker 映像并推送到您的 Docker Hub 存储库。

# 1. Prepare the Docker file
$ cd artemis-docker
$ ./prepare-docker.sh --from-release --artemis-version 2.16.0
# 2. Build the Docker image for ARM
$ cd _TMP_/artemis/2.16.0
$ docker buildx build --platform linux/arm64,linux/arm/v7 --push -t {your-username}/{your-repository-name}:2.16.0 -f ./docker/Dockerfile-adoptopenjdk-11 .

进入全屏模式 退出全屏模式

下图显示了 ** prepare-docker.sh ** 脚本的输出,与第一次运行不同的是,它下载了 ActiveMQ Artemis 的 2.16.0 版本,然后显示了脚本(Docker 文件和用于运行容器的脚本)已在 docker 目录中创建(该目录又包含在 _TMP_/artemis/2.16.0/docker 目录中),还显示了继续构建 Docker 映像的有用信息。

图 4 - Docker 映像构建准备脚本输出

图 4 – Docker 镜像构建准备脚本输出

此时,您的 Docker Hub 存储库中应该有 ActiveMQ Artemis 版本 2.16.0 和 2.18.0-SNAPSHOT。

图 5 - 执行 buildx 命令为 ARM生成 Docker 映像

图 5 – 执行 buildx 命令为 ARM 生成 Docker 映像

3.树莓派:拉 e 跑

** 我们终于到了!** 您准备好从我们的 Docker 存储库中提取映像,然后获取一个运行 ActiveMQ Artemis 实例的容器了吗?

在继续之前,我们必须满足一个要求:** Docker 19.x / 20.x 必须正确安装在 Raspberry Pi 上**。关于 Raspberry Pi 型号,我推荐版本 4 和至少具有 4GByte RAM 内存的型号。就我而言,我有一个 8GB RAM 的 Raspberry Pi 4、Ubuntu 20.04.02 LTS 操作系统和 Docker 20.10.3。

图6-neofetch的树莓派4系统信息

图 6 – neofetch 提供的 Raspberry Pi 4 系统信息

一旦满足要求,就可以使用以下命令拉取并运行 Artemis ActiveMQ 容器。我们会拉取这两个版本的 Docker 镜像,即使我们稍后会使用 2.16.0 版本。

# 1. Pull the Docker Images of the ActiveMQ Artemis (2.16.0 and 2.18.0-SNAPSHOT)
$ docker pull amusarra/apache-artemis:2.18.0-SNAPSHOT
$ docker pull amusarra/apache-artemis:2.16.0
# 2. Run the ActiveMQ Artemis 2.16.0
$ docker run --rm -d --name activemq-artemis-2160 -p 61616:61616 -p 8161:8161 -p 1883:1883 amusarra/apache-artemis:2.16.0

进入全屏模式 退出全屏模式

在容器执行命令中,我们指定了哪些 TCP/IP 端口应该导出到外部,本例中:console (8161), MQTT (1883) and Multi-ProtocolCORE, MQTT, AMQP, STOMP, HORNETQ, OPENWIRE。

下图是刚刚启动成功的Artemis ActiveMQ容器的日志。其他图显示了对 Artemis ActiveMQ 管理面板的访问,其登录凭据(默认情况下)为 artemis / artemis。

图7-查看ActiveMQ Artemis Docker容器的日志

图 7 – 查看 ActiveMQ Artemis Docker 容器的日志

图8-ActiveMQ Artemis管理控制台登录页面

图 8 – ActiveMQ Artemis 管理控制台的登录页面

图 9 - ActiveMQ Artemis 查看当前状态

图 9 – ActiveMQ Artemis 视图当前状态

4 .一个非常快速但有效的测试

现在我们已经在 Raspberry Pi 上设置了基于 Artemis ActiveMQ 的 Message Broker,让我们尝试做一个简单的测试,其中包括:

1.创建一个主题,其中生产者将发送一条包含CPU温度的消息(JSON格式);

2.创建一个生产者,每5秒读取一次CPU温度,并将读取到的值发送到之前创建的topic上;

3.订阅主题以读取发布的值。

我们将使用名称为 ** RPI4.cpu-temp ** 的主题调用该主题,我们将使用后面的第一个命令创建该主题。相反,下一个命令负责每 5 秒读取一次 CPU 温度并在新创建的主题上发布消息。这两个命令都使用二进制** artemis **,它是服务器管理工具的一部分。

# 1. Create the topic RPI4.cpu-temp
$ docker exec -it activemq-artemis-2160 \
/bin/bash ./bin/artemis queue create --user artemis --password artemis \
--address RPI4 --anycast --durable --purge-on-no-consumers \
--auto-create-address --name cpu-temp

# 2. Send CPU Temperature on the topic RPI4.cpu-temp
$ while true; \
do docker exec -it activemq-artemis-2160 \
/bin/bash ./bin/./artemis producer --clientID rpi4 --destination topic://RPI4.cpu-temp --message "$(echo -n '{"cpu-temperature":'; cat /sys/class/thermal/thermal_zone*/temp | sed -e 's/\(.\)..$/.\1/'; echo -n '}')" --message-count 1 --user artemis --password artemis; \
sleep 5; \
done

进入全屏模式 退出全屏模式

下图显示了 RPI4.cpu-temp 主题上的 post message 命令正在运行。通过访问管理控制台,可以查看有关会话数、连接数的一些详细信息,并查看哪些是该主题的当前使用者。

图 10 - 生成消息到主题 RPI4.cpu-temp

图 10 – 向主题 RPI4.cpu-temp 生成消息

图 11 - 在 ActiveMQ Artemis 上浏览会话

图 11 – 在 ActiveMQ Artemis 上浏览会话

图 12 - 在 ActiveMQ Artemis 上浏览消费者

图 12 – 在 ActiveMQ Artemis 上浏览消费者

图 13 - 浏览 ActiveMQ Artemis 上的连接

图 13 – 浏览 ActiveMQ Artemis 上的连接

要订阅主题 RPI4.cpu-temp 以便能够读取 CPU 温度值,我们可以为简单起见使用非常常见的 MQTT 客户端。在我的例子中,我在 macOS 上使用了应用程序MQTT Explorer,下图显示了与 Message Broker 的连接配置和接收到的数据的显示,也是图形形式。

图14-MQTT Explorer连接配置

图 14 – MQTT Explorer 连接配置

图 15 - MQTT Explorer 添加主题 RPI4.cpu-temp

图 15 – MQTT Explorer 添加主题 RPI4.cpu-temp

图 16 - MQTT Explorer 查看 RPI4.cpu-temp 上的数据

图 16 – RPI4.cpu-temp 上的 MQTT Explorer 视图数据

在我的 iPhone 上,我使用了MQTT Analyzer应用程序,但 Android 平台上仍有类似的应用程序,例如MQTT 终端。下图显示了应用程序在读取主题 RPI4.cpu-temp 的值时的一些屏幕截图。

图 17 - MQTT Analyzer 连接设置

图 17 – MQTT 分析器连接设置

图 18 - MQTT Analyzer 读取主题 RPI4.cpu-temp 的值

图 18 – MQTT 分析器读取主题 RPI4.cpu-temp 的值

在这一点上,我想说我们可以对获得的结果感到满意。有了这个 Message Broker,IoT 领域可能的应用真的是数不胜数,有无限的想象空间。

5 .资源

下面我给大家留下一系列资源,对深入分析很有用。

  1. ActiveMQ Artemis 项目首页(https://activemq.apache.org/components/artemis/)

2.轻松创建Docker(https://github.com/apache/activemq-artemis/tree/master/artemis-docker)

  1. Apache ActiveMQ Artemis 文档(https://activemq.apache.org/components/artemis/documentation/)

4.Raspberry PI Sense HAT:如何通过 MQTT 在 CloudAMQP 上发布数据

5.Raspberry Pi:如何运行 Apache Karaf 4.2 Docker 容器

6.Docker:如何为 ARM 和 ARM64 创建 Apache Karaf 镜像

  1. Raspberry Pi 3 物联网 (https://www.packtpub.com/product/internet-of-things-with-raspberry-pi-3/9781788627405)

  2. 物联网实用 Python 编程(https://www.packtpub.com/product/practical-python-programming-for-iot/9781838982461)

6 .结论

** 您是否认为即使在 ARM 硬件架构上也能轻松安装 Apache ActiveMQ Artemis?**

感谢 Docker 和 ARM 的合作伙伴关系(见Docker 宣布与 Arm的合作伙伴关系)于 2019 年 4 月宣布,今天我们能够在 *_linux/arm\ 架构上运行 Artemis ActiveMQ Docker 容器。*_的树莓派。

感谢** buildx **(来自 Docker),我们可以使用 Docker 为 ARM 和 x86 创建 ** 多架构 ** 映像。感谢 buildx 工具,我们能够为 ** linux / arm64 ** 和 ** linux / arm / v7 ** 准备 Artemis ActiveMQ 映像,然后我们用它在 Raspberry Pi 上安装多协议消息代理服务.

文章ActiveMQ Artemis: Easy Docker Creation also for ARM似乎是Antonio Musarra 的博客上的第一篇文章。

[](http://feeds.feedburner.com /~ff/dontesta/blog?au003dsW9_qASq1-0:mvRYvlHjFAc:dnMXMwOfBR0)[](http://feeds.feedburner.com/~ff/dontesta/blog?au003dsW9_qASq1-0:mvRYvlHjFAc: D7DqB2pKExk)[](http://feeds .feedburner.com/~ff/dontesta/blog?au003dsW9_qASq1-0:mvRYvlHjFAc:F7zBnMyn0Lo)[](http://feeds.feedburner.com/~ff/dontesta/blog?au003dsW9_qASq1- 0:mvRYvlHjFAc:V_sGLiPBpWU)[![]10024](http:// /feeds.feedburner.com/~ff/dontesta/blog?au003dsW9_qASq1-0:mvRYvlHjFAc:KwTdNBX3Jqk)[](http://feeds.feedburner.com/~ff/dontesta/blog?au003d sW9_qASq1-0:mvRYvlHjF交流:gIN9vFwOqvQ)

[](https://res.cloudinary.com/practicaldev/image/fetch/s--Qa7jXlpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/ %257Er/dontesta/blog/%257E4/sW9_qASq1-0)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐