编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

环境准备
步骤一:创建 Worker Service 项目
步骤二:编写 Worker Service 代码
步骤三:测试 Worker Service
步骤四:创建 Dockerfile
步骤五:构建 Docker 镜像
步骤六:在 Centos上运行 直接运行
Centos上创建服务
创建 Systemd 服务文件
重新加载 Systemd 服务配置
启动并启用服务
验证服务是否正在运行
管理服务
结论

在这篇文章中,我们将介绍如何使用 C# 创建一个简单的 Worker Service 应用程序,并在 Centos上进行部署。Worker Service 是 .NET Core 提供的一个新模板,用于创建长期运行的后台服务应用程序。它特别适合用来处理各种后台任务,例如消息队列处理、日志处理等。

环境准备

在开始之前,请确保你的开发环境中已经安装了以下软件:

  • .NET SDK 6.0 或更高版本
  • Ubuntu 20.04 或更高版本(或其他兼容的 Linux 发行版)
  • Docker(用于容器化部署)

步骤一:创建 Worker Service 项目

首先,我们使用 Vs2022创建一个新的 Worker Service 项目。

image.png

我们启动Docker

image.png

步骤二:编写 Worker Service 代码

打开 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秒钟记录一次时间 } } } }

image.png

步骤三:测试 Worker Service

在本地运行你的 Worker Service,确保它能够正常工作。

我这里安装Windows Docker Desktop

image.png 你应该会在控制台中看到 Worker Service 每隔一秒钟输出一次当前时间。

步骤四:创建 Dockerfile

在项目根目录创建一个 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"]

步骤五:构建 Docker 镜像

打开命令提示符或 PowerShell。

导航到包含 Dockerfile 的项目目录的上一层目录,这里很重要,我的Dockerfile 在MyWorkerService目录下

Bash
docker build -f .\MyWorkerService\Dockerfile -t myworkservice .

image.png

在我的windows docker desktop 中可以管理这个镜像了。

步骤六:在 Centos上运行 直接运行

安装.net6 sdk

C#
sudo yum install -y dotnet-sdk-6.0

运行服务

C#
dotnet MyWorkerService.dll

image.png

Centos上创建服务

在 CentOS 上后台运行 .NET Worker Service 可以使用系统的 Systemd 服务管理器来达成。这将允许你的服务自动启动、停止和重启,并在系统启动时自动运行。

创建 Systemd 服务文件

创建一个新的 Systemd 服务文件来管理你的 Worker Service。

Bash
sudo 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 退出编辑器)。

重新加载 Systemd 服务配置

Bash
sudo systemctl daemon-reload

启动并启用服务

现在可以启动并配置你的 Worker Service 在系统启动时自动运行:

Bash
sudo systemctl start myworkerservice sudo systemctl enable myworkerservice

验证服务是否正在运行

使用以下命令检查服务状态:

Bash
sudo 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 许可协议。转载请注明出处!