.net core 3.1 服务承载【承载长时间运行服务】 电脑版发表于:2021/2/1 21:28 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.net core 3.1 服务承载【承载长时间运行服务】 [TOC] 目录 ------------ tn>https://www.tnblog.net/hb/article/details/5591 前言 ------------ tn>当我们要在发布网站的同时,想在后端开启一个长时间运行的服务不断的去处理我们的一些业务时,这时我们便需要运用到服务承载了。 我们这里将用最常见的**CPU使用率**,**内存使用量**和**网络吞吐量**这3种典型的指标做示范。 创建控制台项目 ------------ ![](https://img.tnblog.net/arcimg/hb/9d0507149d86412f8483b56af6c55caf.png) >### 添加相关依赖包 ```csharp <ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.11" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.11" /> </ItemGroup> ``` 添加长时间运行服务相关内容 ------------ >### 创建指标实例 ```csharp public class PerformanceMetrics { private static readonly Random _random = new Random(); /// <summary> /// CPU指标 /// </summary> public int Processor { get; set; } /// <summary> /// 内存指标 /// </summary> public long Memory { get; set; } /// <summary> /// 网络指标 /// </summary> public long Network { get; set; } public override string ToString() => $"CPU:{Processor * 100}%; Memory: {Memory * (1024 * 1024)}M/s"; /// <summary> /// 创建 PerformanceMetrics 的实例 /// </summary> /// <returns></returns> public static PerformanceMetrics Create() => new PerformanceMetrics { // 随机生成指标 Processor = _random.Next(1, 8), Memory = _random.Next(10, 100) * 1024 * 1024, Network = _random.Next(10, 100) * 1024 * 1024 }; } ``` >### 承载服务的实现 tn>承载服务通过 `IHostedService` 接口表示,其接口定义的`StartAsync`与`StopAsync`方法分别代表启动服务与关闭服务。我们通过`PerformanceMetricsCollector`实现`IHostedService`的接口去采集性能指标。并通过一个`Timer`调度器每隔`5`秒去调用一个`PerformanceMetrics`的实例从而获取指标数据。 ```csharp public sealed class PerformanceMetricsCollector : IHostedService { private IDisposable _scheduler; /// <summary> /// 启动服务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StartAsync(CancellationToken cancellationToken) { // 需要调用的方法 需要传入的对象 多久后启动 间隔时长执行一次 _scheduler = new Timer(Callback,null,TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(5)); return Task.CompletedTask; } private void Callback(object state) { Console.WriteLine($"[{DateTimeOffset.Now}]{PerformanceMetrics.Create()}"); } /// <summary> /// 关闭服务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StopAsync(CancellationToken cancellationToken) { _scheduler?.Dispose(); return Task.CompletedTask; } } ``` >### 构建承载系统 tn>在调用`Build`方法之前,可以调用`IHostBuilder`接口的`ConfigureServices`方法将`PerformanceMetricsCollector`注册为`IHostedService`的服务,并将生命周期设置为`AddSingleton`。 ```csharp new HostBuilder() .ConfigureServices(svcs => svcs //.AddSingleton<IHostedService,PerformanceMetricsCollector>() 与下面一样的 .AddHostedService<PerformanceMetricsCollector>()) .Build() .Run(); ``` 运行测试 ------------ ![](https://img.tnblog.net/arcimg/hb/8fd076a6a17a407c85ccf3d172ce51d2.png)