1. 程式人生 > 實用技巧 >.NET 雲原生架構師訓練營(模組二 基礎鞏固 Host)--學習筆記

.NET 雲原生架構師訓練營(模組二 基礎鞏固 Host)--學習筆記

2.2.4 核心模組--Host

  • 什麼是 Host
  • Host 的預設配置做了哪些事情
  • 框架提供的服務
  • HostedService 後臺服務

ASP.NET Core Web 主機:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0

什麼是 Host

主機是封裝應用資源的物件,例如:

  • 依賴關係注入(DI)
  • Logging
  • Configuration
  • IHostedService 實現

對應 Program.cs 中的 host.Run();

可以在主機啟動前通過 CreateHostBuilder 進行配置

Host 的預設配置做了哪些事情

CreateHostBuilder 方法

  • 將內容根目錄設定為由 GetCurrentDirectory 返回的路徑
  • 載入主機配置(字首為 DOTNET_ 的環境變數;命令列引數)
  • 載入應用配置(appsettings.json; appsettings.{Environment}.json; 金鑰管理器;環境變數;命令列引數)
  • 新增日誌記錄程式(控制檯;除錯;EventSource;EventLog)
  • 當環境為”開發“時,啟用範圍驗證和依賴關係驗證
  • ConfigureWebHostDefaults(asp.net core 需要)
// 內容根目錄
var root = hostingContext.HostingEnvironment.ContentRootPath;

// 環境
var envName = hostingContext.HostingEnvironment.EnvironmentName;

ConfigureWebHostDefaults 方法

  • 從字首為 ASPNETCORE_ 的環境變數載入主機配置
  • 使用應用的託管配置提供程式將 Kestrel 伺服器設定為 web 伺服器並對其進行配置
  • 新增主機篩選中介軟體
  • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等於 true,則新增轉接頭中介軟體
  • 支援 IIS 整合

框架提供的服務

  • IHostApplicationLifetime
  • IHostLifetime
  • IHostEnvironment / IWebHostEnvironment

IHostApplicationLifetime

Program.cs

var applicationLifetime = host.Services.GetRequiredService<IHostApplicationLifetime>();

applicationLifetime.ApplicationStarted.Register((() =>
{
    Console.WriteLine("Application Started");
}));

applicationLifetime.ApplicationStopping.Register((() =>
{
    Console.WriteLine("Application Stopping");
}));

applicationLifetime.ApplicationStopped.Register((() =>
{
    Console.WriteLine("Application Stopped");
}));

用於監控 Host 主機的啟動,停止

IHostLifetime

同樣的監聽

IHostEnvironment / IWebHostEnvironment

將 IHostEnvironment 服務註冊到一個類,獲取以下設定的資訊

  • ApplicationName
  • EnvironmentName
  • ContentRootPath

HostedService 後臺服務

新建 MyHostedService.cs

namespace HelloApi.Services
{
    public class MyHostedService : IHostedService
    {
        public Task StartAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
    }
}

在 IHostedService 的基礎之上,asp .net core 還提供了另一個封裝 BackgroundService

public class MyBackgroundService : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        throw new NotImplementedException();
    }
}

在 StopAsync 之前會通過 CancellationToken 通知,執行一些操作

public class MyBackgroundService : BackgroundService
{
    private readonly ILogger<MyBackgroundService> _logger;

    public MyBackgroundService(ILogger<MyBackgroundService> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // 只要不停止就一直執行
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("date:{0}", DateTime.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

在 Startup.cs 中注入

services.AddHostedService<MyBackgroundService>();

啟動程式,控制檯不斷輸出時間

請求介面也可以正常訪問

asp .net core 通過這樣一種 HostedService 的方式將後臺常駐服務與 web api 的請求同時放到一個託管基類

GitHub原始碼連結:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。

如有任何疑問,請與我聯絡 ([email protected]) 。