.NET 云原生架构师训练营(模块二 基础巩固 Host)--学习笔记

DotNet NB

共 3014字,需浏览 7分钟

 ·

2020-12-18 12:53

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();

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 _logger;

public MyBackgroundService(ILogger 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 的请求同时放到一个托管基类

课程链接

.NET云原生架构师训练营讲什么,怎么讲,讲多久


欢迎各位读者加入微信群一起学习交流,
在公众号后台回复“加群”即可~~


浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报