天天看點

.NET 雲原生架構師訓練營(子產品二 基礎鞏固 Host)--學習筆記2.2.4 核心子產品--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

主機是封裝應用資源的對象,例如:

  • 依賴關系注入(DI)
  • Logging
  • Configuration
  • IHostedService 實作

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

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

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

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 主機的啟動,停止

同樣的監聽

将 IHostEnvironment 服務注冊到一個類,擷取以下設定的資訊

  • ApplicationName
  • EnvironmentName
  • ContentRootPath

建立 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