在这篇文章中,我们将介绍如何使用 C# 创建一个简单的 Worker Service 应用程序,并在 Centos上进行部署。Worker Service 是 .NET Core 提供的一个新模板,用于创建长期运行的后台服务应用程序。它特别适合用来处理各种后台任务,例如消息队列处理、日志处理等。
在开始之前,请确保你的开发环境中已经安装了以下软件:
首先,我们使用 Vs2022创建一个新的 Worker Service 项目。
我们启动Docker
打开 Worker.cs
文件,你会看到一个初始的 Worker 类。我们将这个类修改为一个简单的时间记录器,每隔一秒钟记录一次当前时间。
首先,打开 Worker.cs
文件:
C#using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace MyWorkerService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken); // 每隔1秒钟记录一次时间
}
}
}
}
在本地运行你的 Worker Service,确保它能够正常工作。
我这里安装Windows Docker Desktop
你应该会在控制台中看到 Worker Service 每隔一秒钟输出一次当前时间。
在项目根目录创建一个 Dockerfile
,用于容器化我们的应用。内容如下:
Docker# 使用微软提供的官方 .NET Core SDK 镜像 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["MyWorkerService.csproj", "."] RUN dotnet restore "./MyWorkerService.csproj" COPY . . WORKDIR "/src/" RUN dotnet build "MyWorkerService.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "MyWorkerService.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MyWorkerService.dll"]
打开命令提示符或 PowerShell。
导航到包含 Dockerfile 的项目目录的上一层目录,这里很重要,我的Dockerfile 在MyWorkerService目录下
Bashdocker build -f .\MyWorkerService\Dockerfile -t myworkservice .
在我的windows docker desktop 中可以管理这个镜像了。
安装.net6 sdk
C#sudo yum install -y dotnet-sdk-6.0
运行服务
C#dotnet MyWorkerService.dll
在 CentOS 上后台运行 .NET Worker Service 可以使用系统的 Systemd 服务管理器来达成。这将允许你的服务自动启动、停止和重启,并在系统启动时自动运行。
创建一个新的 Systemd 服务文件来管理你的 Worker Service。
Bashsudo nano /etc/systemd/system/myworkerservice.service
将以下内容粘贴到服务文件中:
Ini[Unit]
Description=My .NET Worker Service
[Service]
WorkingDirectory=/var/MyWorkerService
ExecStart=/usr/bin/dotnet /var/MyWorkerService/MyWorkerService.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=your-username
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
请根据实际情况调整以下参数:
WorkingDirectory
: 你的应用程序的发布目录。ExecStart
: 执行应用程序的命令。User
: 运行服务的用户。保存并关闭文件(在 nano 中按 CTRL+O
保存,然后按 CTRL+X
退出编辑器)。
Bashsudo systemctl daemon-reload
现在可以启动并配置你的 Worker Service 在系统启动时自动运行:
Bashsudo systemctl start myworkerservice
sudo systemctl enable myworkerservice
使用以下命令检查服务状态:
Bashsudo systemctl status myworkerservice
你应该会看到类似以下的输出表明服务正在运行:
C#● myworkerservice.service - My .NET Worker Service
Loaded: loaded (/etc/systemd/system/myworkerservice.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2021-10-07 14:47:38 UTC; 13min ago
Main PID: 12345 (dotnet)
CGroup: /system.slice/myworkerservice.service
└─12345 /usr/bin/dotnet /var/MyWorkerService/MyWorkerService.dll
你可以使用以下命令来管理你的服务:
Bash# 启动服务
sudo systemctl start myworkerservice
# 停止服务
sudo systemctl stop myworkerservice
# 重启服务
sudo systemctl restart myworkerservice
# 查看服务状态
sudo systemctl status myworkerservice
通过这篇文章,我们学习了如何使用 C# 创建一个简单的 Worker Service,并使用 Docker 将其容器化后部署到 Centos上。这一过程展示了如何将 .NET Core 应用与现代的容器技术结合起来,为跨平台的应用部署提供了有力支持。希望这篇文章对你有所帮助!
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!