25. 辅助角色服务
25.1 关于辅助角色服务
.NET Core 3.0 新增了 Worker Service 的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成 Windows服务 或 Linux 守护程序。
目前微软提供了两种方式创建长时间运行的后台服务:
- 共宿主方式:中小型项目推荐,无需单独部署
Windows/Linux服务 - 独立
Worker Service方式:需独立部署Windows/Linux服务
25.2 共宿主方式
共宿主方式指的是在现有的 Web 或其他应用程中创建类文件并派生自 BackgroundService 类即可。这种方式的典型特点就是和应用共生存周期,应用启动时启动,应用结束停止运行。
推荐中小型项目使用这种方式。
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace YourPoject.Web.Core;
public class Worker : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Console.WriteLine(DateTime.Now);
// 延迟 1 秒
await Task.Delay(1000, stoppingToken);
}
}
}
之后在 Startup.cs 中注册即可:
services.AddHostedService<Worker>();
25.2.1 最佳实践
最好的实践方式是创建独立的类库项目:YourProject.BackgroundServices,之后添加 YourPoject.Application 和 YourPoject.Core 层引用,将所有的 Worker 放在该层,同时创建 Startup.cs 类进行 Worker 统一注册,如:
using Microsoft.Extensions.DependencyInjection;
namespace YourProject.BackgroundServices;
public sealed class Startup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<Worker>();
services.AddHostedService<Worker2>();
}
}
25.3 独立 Worker Service 方式
独立 Worker Service 方式的主要特点就是它是一个独立的项目,和现有的项目没有直接关联关系,需要分开独立部署。
推荐中大型项目使用这种方式,也就是独立 部署成 Windows Service 或者 Linux 守护进程,具有独立生存周期,即使应用故障了也不会影响它的运行。
25.3.1 如何创建 Worker Service
通过 Visual Studio 2019 提供的 Worker Service 可直接创建。如图:
25.3.2 创建 Worker
当我们创建好 Worker Service 项目时,已经自带了一个 Worker 类并继承自 BackgroundService 基类。
Worker 正是我们辅助角色的主要工作类,在这里我们编写我们所有的业务逻辑。通常 Worker 默认格式为:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FurionWorkers
{
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}", DateTime.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
}
当我们创建了 Worker 类之 后,需要在 Program.cs 中进行注册,如:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace FurionWorkers
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
如果使用了 Furion 包后可实现自动注册,请同时确保 Worker 声明为 public 级别。