.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/MingsonZheng/ArchitectTrainingCamp/tree/main/HelloApi
课程链接
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 云原生架构师训练营(模块二 基础巩固 Host)--学习笔记的更多相关文章
- .NET 云原生架构师训练营(建立系统观)--学习笔记
目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...
- .NET 云原生架构师训练营(对象过程建模)--学习笔记
目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...
- .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记
目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...
- .NET 云原生架构师训练营(责任链模式)--学习笔记
目录 责任链模式 源码 责任链模式 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了 何时使用:在处理 ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
- .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记
2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记
2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记
2.5.6 MongoDB -- 问答系统 MongoDB 数据库设计 API 实现概述 MongoDB 数据库设计 设计优化 内嵌(mongo)还是引用(mysql) 数据一致性 范式:将数据分散到 ...
- .NET 云原生架构师训练营(模块二 基础巩固 Scrum 团队)--学习笔记
2.7.3 Scrum 团队 理想的环境 团队章程 如何组建 Scrum 团队 产品待办事项列表 用户故事 敏捷开发流程 理想的环境 5-9人 100% 跨职能 在一起 自组织 自组织 目标 授权 沟 ...
随机推荐
- vue-router路由复用后页面没有刷新
vue-router提供了页面路由功能,可以用来构建单页面应用,在使用vue-router的动态路由匹配的时候,遇到了url变化了,但是页面却没有任何动静的问题,记录一下. 动态路由匹配url变化了, ...
- C# 排序算法5:归并排序
归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列.该算法是采用分治法. 原理: 1.申请空间,使其大小为两个已经排序 ...
- Angular系列教程之组件
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 【Tomcat 组成与工作原理】
Tomcat组成与工作原理 Tomcat 是什么 开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 ...
- TiKV 服务部署的注意事项
TiKV 服务部署的注意事项 背景 最近发现tikv总是会掉线 不知道是哪里触发了啥样子的bug. 所以想着使用systemd 管理一下, 至少在tikv宕机的时候能够拉起来服务. 二进制文件 pd- ...
- [转帖]解决Java/MySQL性能问题的思路
https://plantegg.github.io/2023/08/28/%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E6%80%9D%E8%B7%AF/ 10年前写的 ...
- [转帖]NUMA导致的Oracle性能问题
https://www.cnblogs.com/realcp1018/p/6903721.html 背景简介: Oracle版本:11.2.0.4 OS 版本:OEL5.8 在一次Oracle的Dat ...
- 【字符串,哈希】【Yandex】Yandex7736
2023.6.30 Problem Link 定义一个串 \(S\) 是好的,当且仅当 \(S\) 可以不断消去相邻两个相同字符直至消空.给定一个长为 \(n\) 的字符串 \(s\),求有多少个有序 ...
- vue3逻辑分离和页面快速展示数据
逻辑分层 我们在使用vue3开发项目的时候, 如何进行[区域分层]呢???? 举一个简单的小粒子 一个区域有[查询逻辑.修改后的保存逻辑.新增逻辑.删除逻辑] 这个页面可能还有其他的区域.A区域.B区 ...
- vue结合elementUI折叠展开效果动画
组件 <template> <div class="hide-page-com"> <ul class="tab-tilte"&g ...