65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Windows Docker 容器中使用 MSMQ

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2019年2月27日

CPOL

3分钟阅读

viewsIcon

17410

downloadIcon

712

快速概述以及在 Windows 容器内运行完整 .NET Framework 4.6.1 控制台应用程序的示例,该应用程序从 MSMQ 队列读取和写入。

引言

很多应用程序使用 MSMQ 在进程和服务之间进行消息传递。直到去年,将这些应用程序迁移到 Docker 容器意味着重写或至少重写所使用的消息传递。

自从宣布 MSMQ 将在 Windows 容器中可用之后,至少不需要这样做了。请不要误解我的意思,我很高兴重写一些应用程序并完全删除 MSMQ,将应用程序拆分为更易于管理的微服务、.NET Core 等。但与所有人一样,时间始终是一个因素。

MSMQ 队列设置

这是我遇到困难的地方。为了使 Docker 容器内的服务连接到远程 MSMQ,需要设置某些权限。确保您要连接的队列已添加 EveryoneANONYMOUS 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 队列上设置安全设置
    • EveryoneANONYMOUS LOGON 需要“完全控制”权限。

使用 Docker 快乐编码...

历史

  • 2019 年 2 月 27 日:初始版本
© . All rights reserved.