tnblog
首页
视频
资源
登录

.net core 3.1 服务承载【Workservice】

8107人阅读 2021/2/8 12:02 总访问:3467245 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

.net core 3.1 服务承载【Workservice】

NET CORE 3.0新增了Worker Services的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成windows Servicelinux守护程序

目录

WorkerService优点

独立部署,多种宿主选择

支持模式
控制台
Windows Service
systemd

避免程序池回收问题

Demo

创建WorkService项目

修改内容

将我们以前的相关内容添加到项目中

  1. public static IHostBuilder CreateHostBuilder(string[] args) =>
  2. Host.CreateDefaultBuilder(args)
  3. // 获取命令行的参数
  4. .ConfigureHostConfiguration(builder => builder.AddCommandLine(args))
  5. .ConfigureAppConfiguration((context, builder) => builder
  6. .AddJsonFile("appsettings.json", false)
  7. // 添加不同环境的json
  8. .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true)
  9. )
  10. .ConfigureServices((hostContext, services) =>
  11. {
  12. var fakeMetricsCollector = new FakeMetricsCollector();
  13. services
  14. .AddSingleton<IProcessorMetricsCollector>(fakeMetricsCollector)
  15. .AddSingleton<INetworkMetricsCollector>(fakeMetricsCollector)
  16. .AddSingleton<IMemoryMetricsCollector>(fakeMetricsCollector)
  17. .AddSingleton<IMetricsDeliverer, FakeMetricsDeliverer>()
  18. .AddSingleton<IHostedService, Worker>()
  19. // 添加配置
  20. .AddOptions()
  21. .Configure<MetricsCollectionOptions>(hostContext.Configuration.GetSection("MetricsCollection"));
  22. });
  1. public class Worker : BackgroundService
  2. {
  3. private readonly ILogger<Worker> _logger;
  4. private readonly IProcessorMetricsCollector _processorMetricsCollector;
  5. private readonly INetworkMetricsCollector _networkMetricsCollector;
  6. private readonly IMetricsDeliverer _metricsDeliverer;
  7. private readonly IMemoryMetricsCollector _memoryMetricsCollector;
  8. private readonly IOptions<MetricsCollectionOptions> _optionsAccessor;
  9. public Worker(
  10. IProcessorMetricsCollector processorMetricsCollector,
  11. INetworkMetricsCollector networkMetricsCollector,
  12. IMetricsDeliverer metricsDeliverer,
  13. IMemoryMetricsCollector memoryMetricsCollector,
  14. IOptions<MetricsCollectionOptions> optionsAccessor,
  15. ILogger<Worker> logger)
  16. {
  17. _logger = logger;
  18. _processorMetricsCollector = processorMetricsCollector;
  19. _networkMetricsCollector = networkMetricsCollector;
  20. _metricsDeliverer = metricsDeliverer;
  21. _memoryMetricsCollector = memoryMetricsCollector;
  22. _optionsAccessor = optionsAccessor;
  23. }
  24. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  25. {
  26. while (!stoppingToken.IsCancellationRequested)
  27. {
  28. try
  29. {
  30. // 执行的方法
  31. await Callback();
  32. }
  33. catch (Exception ex)
  34. {
  35. _logger.LogError(ex, $"Job {nameof(Worker)} threw an exception!");
  36. }
  37. // 间隔的时间
  38. await Task.Delay(_optionsAccessor.Value.CaptureInterval);
  39. }
  40. }
  41. private async Task Callback()
  42. {
  43. // 通过不同指标获取实例
  44. var performanceMetrics = new PerformanceMetrics()
  45. {
  46. Memory = _memoryMetricsCollector.GetUsage(),
  47. Network = _networkMetricsCollector.GetThroughput(),
  48. Processor = _processorMetricsCollector.GetUsage()
  49. };
  50. await _metricsDeliverer.DeliverAsync(performanceMetrics);
  51. }
  52. }

测试运行

部署到Windows服务运行

添加相关依赖包

在项目中添加nuget包:Microsoft.Extensions.Hosting.WindowsServices

添加WindowsService方法

然后在Program.cs类,将UseWindowsService()添加到HostBuilder中去

  1. .UseWindowsService()

发布项目

然后在该目录下通过命令窗口发布项目

  1. dotnet publish -c Release -o C:\WorkerPub

然后我们到C:\WorkerPub目录下查看发布情况。

创建WorkerService服务

然后使用sc.exe工具来管理服务,输入一下命令创建为windows服务

  1. sc.exe create MyTestService binPath=C:\WorkerPub\WorkerService.exe

查看服务状态使用一下命令

  1. sc.exe query MyTestService

我们发现我们的服务并未启动,接着我们执行启动命令

  1. sc.exe start MyTestService

最后我们不需要服务了可以停止服务,与注销服务

  1. sc.exe stop MyTestService
  2. sc.exe delete MyTestService

部署作为Linux守护程序运行

部署linux守护程序也是很方便的执行一下两个步骤即可:

  • 添加Microsoft.Extensions.Hosting.Systemd NuGet包到项目中,并告诉你的新Worker,其生命周期由systemd管理!
  • UseSystemd()添加到HostBuilder
  1. .UseSystemd ()

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

剑轩

2021/8/20 12:46:59

这......么.....长

尘叶心繁:@剑轩还有下集

2021/8/20 13:33:12 回复

这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术