
.net core 3.1 服务承载【Workservice】
NET CORE 3.0
新增了Worker Services
的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成windows Service
或linux守护程序
。
目录
WorkerService优点
独立部署,多种宿主选择
支持模式 |
---|
控制台 |
Windows Service |
systemd |
避免程序池回收问题
Demo
创建WorkService项目
修改内容
将我们以前的相关内容添加到项目中
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
// 获取命令行的参数
.ConfigureHostConfiguration(builder => builder.AddCommandLine(args))
.ConfigureAppConfiguration((context, builder) => builder
.AddJsonFile("appsettings.json", false)
// 添加不同环境的json
.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true)
)
.ConfigureServices((hostContext, services) =>
{
var fakeMetricsCollector = new FakeMetricsCollector();
services
.AddSingleton<IProcessorMetricsCollector>(fakeMetricsCollector)
.AddSingleton<INetworkMetricsCollector>(fakeMetricsCollector)
.AddSingleton<IMemoryMetricsCollector>(fakeMetricsCollector)
.AddSingleton<IMetricsDeliverer, FakeMetricsDeliverer>()
.AddSingleton<IHostedService, Worker>()
// 添加配置
.AddOptions()
.Configure<MetricsCollectionOptions>(hostContext.Configuration.GetSection("MetricsCollection"));
});
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IProcessorMetricsCollector _processorMetricsCollector;
private readonly INetworkMetricsCollector _networkMetricsCollector;
private readonly IMetricsDeliverer _metricsDeliverer;
private readonly IMemoryMetricsCollector _memoryMetricsCollector;
private readonly IOptions<MetricsCollectionOptions> _optionsAccessor;
public Worker(
IProcessorMetricsCollector processorMetricsCollector,
INetworkMetricsCollector networkMetricsCollector,
IMetricsDeliverer metricsDeliverer,
IMemoryMetricsCollector memoryMetricsCollector,
IOptions<MetricsCollectionOptions> optionsAccessor,
ILogger<Worker> logger)
{
_logger = logger;
_processorMetricsCollector = processorMetricsCollector;
_networkMetricsCollector = networkMetricsCollector;
_metricsDeliverer = metricsDeliverer;
_memoryMetricsCollector = memoryMetricsCollector;
_optionsAccessor = optionsAccessor;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
// 执行的方法
await Callback();
}
catch (Exception ex)
{
_logger.LogError(ex, $"Job {nameof(Worker)} threw an exception!");
}
// 间隔的时间
await Task.Delay(_optionsAccessor.Value.CaptureInterval);
}
}
private async Task Callback()
{
// 通过不同指标获取实例
var performanceMetrics = new PerformanceMetrics()
{
Memory = _memoryMetricsCollector.GetUsage(),
Network = _networkMetricsCollector.GetThroughput(),
Processor = _processorMetricsCollector.GetUsage()
};
await _metricsDeliverer.DeliverAsync(performanceMetrics);
}
}
测试运行
部署到Windows服务运行
添加相关依赖包
在项目中添加nuget包:Microsoft.Extensions.Hosting.WindowsServices
添加WindowsService方法
然后在Program.cs
类,将UseWindowsService()
添加到HostBuilder
中去
.UseWindowsService()
发布项目
然后在该目录下通过命令窗口发布项目
dotnet publish -c Release -o C:\WorkerPub
然后我们到C:\WorkerPub
目录下查看发布情况。
创建WorkerService服务
然后使用sc.exe
工具来管理服务,输入一下命令创建为windows服务
sc.exe create MyTestService binPath=C:\WorkerPub\WorkerService.exe
查看服务状态使用一下命令
sc.exe query MyTestService
我们发现我们的服务并未启动,接着我们执行启动命令
sc.exe start MyTestService
最后我们不需要服务了可以停止服务,与注销服务
sc.exe stop MyTestService
sc.exe delete MyTestService
部署作为Linux守护程序运行
部署linux守护程序也是很方便的执行一下两个步骤即可:
- 添加
Microsoft.Extensions.Hosting.Systemd
NuGet包到项目中,并告诉你的新Worker,其生命周期由systemd管理!- 将
UseSystemd()
添加到HostBuilder
中
.UseSystemd ()
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术
剑轩
这......么.....长