.NET Core中的跨平台后台服务(想想Windows Service / unix守护程序)?

Cross-platform background service in .NET Core (think windows service/unix daemon)?

因此,我有一个由API和Windows服务(由Topshelfpackage)组成的应用程序,该应用程序使用RabbitMQ连续侦听事件并按需处理数据。

出于教育和娱乐的目的,我尝试将其重写为等效的设置,该设置将在.NET Core和unix上运行(例如,在AWS的docker容器中)

如果我想跨平台使用.NET Core来实现与Windows服务等效的东西(永远运行的后台进程),最好的方法是什么?


Windows服务本身就是一个控制台应用程序,符合Windows Service Control Manager的接口规则和协议。您可以使用.net核心控制台应用程序作为主机在两个平台上实现相同的功能,这需要做一些额外的配置才能使其表现得更像真实的服务/守护程序。

的Linux

例如对于Linux,您可以使用SystemD。
您首先需要使用以下内容创建一个SystemD配置文件:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=daemon service
After=network.target

[Service]
ExecStart=/usr/bin/dotnet $(pwd)/bin/daemonsrv.dll 10000
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

然后配置SystemD以使其了解您的服务配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# Copy service file to a System location
sudo cp daemonsrv.service /lib/systemd/system

# Reload SystemD and enable the service, so it will restart on reboots

sudo systemctl daemon-reload
sudo systemctl enable daemonsrv

# Start service
sudo systemctl start daemonsrv

# View service status
systemctl status daemonsrv

视窗

对于Windows,您应该执行大多数相同的操作,但使用不同的工具集。您将必须使用第三方服务管理器来避免紧密的Windows绑定。
例如。您可以使用NSSM。这是带有相关示例的精美文章-.Net Core控制台应用程序作为Windows服务。

在Windows的情况下,您仍然可以将普通Windows服务设置用作主机。并为您的Unix环境编写另一个主机(控制台应用程序主机)。他们两个都可以共享业务逻辑,只有它们对系统事件做出反应的方式会有所不同。

希望有帮助。


请参阅Worker Services(.NET Core 3.x):

您可以从新的Visual Studio 2019 Worker Service项目模板创建一个模板,也可以使用.NET CLI创建一个模板:

dotnet new worker

另请参阅:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1