在 Windows Docker 容器中使用 MSMQ





5.00/5 (1投票)
快速概述以及在 Windows 容器内运行完整 .NET Framework 4.6.1 控制台应用程序的示例,该应用程序从 MSMQ 队列读取和写入。
引言
很多应用程序使用 MSMQ 在进程和服务之间进行消息传递。直到去年,将这些应用程序迁移到 Docker 容器意味着重写或至少重写所使用的消息传递。
自从宣布 MSMQ 将在 Windows 容器中可用之后,至少不需要这样做了。请不要误解我的意思,我很高兴重写一些应用程序并完全删除 MSMQ,将应用程序拆分为更易于管理的微服务、.NET Core 等。但与所有人一样,时间始终是一个因素。
MSMQ 队列设置
这是我遇到困难的地方。为了使 Docker 容器内的服务连接到远程 MSMQ,需要设置某些权限。确保您要连接的队列已添加 Everyone 和 ANONYMOUS LOGON,并具有 FullControl 权限。
测试应用程序和布局
为了测试 MSMQ 以及如何在容器中使用它,我决定编写一个快速且小的“虚拟”控制台应用程序。 为了适应大多数现有解决方案,它必须是完整的 .NET Framework。
该应用程序非常简单,具有 MSMQ 读取器和 MSMQ 写入器。它将从某处远程计算机上的一个队列读取,并将消息转发到远程计算机上的另一个队列。
为了方便起见,我只是在应用程序中构建了一个快捷方式,可以将消息从本地运行的控制台发送到远程 MSMQ 队列。 然后,这些消息将被 Docker 容器内的控制台服务拾取。
一些代码和 Docker 命令
Dockerfile
dockerfile 将从 Microsoft/windowsservercore 基础镜像(版本 1803)创建所需的镜像。 在容器上启用 MSMQ Windows 功能。(请注意,如果运行该容器的主机不是至少 Windows 10 版本 1803 或 Windows Server 2016 版本 1803,这将不会成功)。 将测试应用程序复制到容器中并设置入口点。
# escape=`
FROM microsoft/windowsservercore:1803
RUN powershell -Command Enable-WindowsOptionalFeature -Online -FeatureName MSMQ-Server -All
COPY . C:\test
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';
$ProgressPreference = 'SilentlyContinue';"]
WORKDIR C:\test\app
ENTRYPOINT C:\test\app\TestDockerMsmq.exe
从 Dockerfile 创建的镜像启动容器
在我的测试过程中,我以交互方式启动了容器。 这样,我可以轻松地检查控制台应用程序上的日志,因为消息是从 MSMQ 读取的。
队列名称通过将卷挂载到容器来收集。 这样,可以再次执行相同的容器以测试不同的队列。 服务启动后,会立即加载一个 *queues.json* 文件,该文件位于应用程序路径下的“*Configs*”文件夹中。 示例“*C:\test\app\Configs*”。
此文件仅包含队列名称
{
"ReadFromQueueName": "FORMATNAME:DIRECT=TCP:{your server ip}\\private$\\meta.in",
"WriteToQueueName": "FORMATNAME:DIRECT=TCP:{your server ip}\\private$\\meta.out"
}
容器运行后,您将看到控制台应用程序连接到您的 MSMQ 队列以开始读取。 发送到此队列的任何消息都将被拾取并转发。
消息是通过使用 /writeonly
参数运行相同的应用程序发送的。 以仅发送方身份运行时,需要更新 *queues.json* 文件。 将 WriteToQueueName
队列名称设置为与 docker 容器中的服务将从中读取的队列名称相同...
瞧,通过 Docker 实现不错的 MSMQ 消息传递。
需要记住的要点
总的来说,从最初的测试来看,MSMQ 消息传递在 Windows Docker 容器中运行得相当顺利。
只要满足并到位某些标准
- Windows 主机必须至少是版本 1803。
- Windows Docker 基础镜像必须至少是版本 1803。
- 在相关的 MSMQ 队列上设置安全设置
- Everyone 和 ANONYMOUS LOGON 需要“完全控制”权限。
使用 Docker 快乐编码...
历史
- 2019 年 2 月 27 日:初始版本