更新計划
這段時間,會陸續把去年一年在公司做的相關培訓,整理成博客分享給大家,在團隊內部已經把大部分的.net項目容器化並部署到k8s,中間也踩了很多坑,也會把相關問題整理處理,大家一起學習交流,哈。
- .Net Core初識以及啟動配置
- .Net Core依賴注入、服務注冊
- .Net Core中間件、應用配置
- .Net Core日志路由
- .Net Core實際開發中常用組件
- .Net Core應用部署
.net程序員為什么要學習.net core
- .Net Core 是.Net的未來,微軟在19年 5月已經明確說明,未來只有.Net 5(=.NET Core vNext),.Net 5是.net core的下一個版本,你可以用它來開發
Windows
,Linux
,MacOs
,IOS
,Android
等等應用。
- 在容器、k8s、Devops、微服務等技術的推動下,2020年雲原生將勢不可擋,.net Cor而設計之初就了適配雲原生,它有很多優點,都說明它是雲原生時代,是一個很好的選擇。
- 它體積更小,啟動速度更快、占用資源更少、支持水平擴展
- 考慮自己的職業發展,.net core也是必須需要熟悉的
什么是.Net Core
- 開源通用的開發框架 github地址,微軟和社區共同維護
- .net core 模塊化管理,按需引用對應組件
- 支持跨平台、跨架構開發,部署靈活
- 兼容性強
- 支持命令行
- 包含了
.Net Framework
的類庫 (3.0版本之前很多都是從.Net Framework類庫移植的,現在已經不再移植老的代碼 )
.Net Core和.Net Framework的區別
推薦一篇講的很好的文章,這里就不展開了傳送門
- 同父異母的兄弟關系
- .Net core可以認為是.net Framework的下一代產品,到2020后都統一為.Net 5
.Net Core 3.1
- .net core 3.1 2019年12月正式發布 LTS 可以商用
- 兼容winform和WPF,這部分目前不跨平台、
- 體積更小,啟動速度更快,占用資源更少,支持水平擴展,更好適配雲原生和微服務
- Blazor
- GRPC
ASP.NET Core Web應用啟動
ASP.NET Core Web應用啟動過程
通過上圖大概可以把啟動過程總結為:
創建主機生成器-配置主機->創建主機->運行主機
ASP.NET Core Web應用
主機(Host)
主機主要負責應用程序的啟動和生命周期的管理,配置服務器和請求處理管道,實質是一個封裝了應用資源的
object
配置日志、依賴服務的注入
Kestrel 介紹
Kestrel 是 ASP.NET Core 項目模板指定的默認 Web 服務器。是一個跨平台的高性能的WEB服務器,角色定位類似於IIS,但不是IIS,它在linux下性能更強,相比於IIS它功能相對較少,不支持反向代理。
啟動配置
這里說的配置,主要分為兩種:
- 主機配置
- 服務配置。
下面我們以實際代碼來看下,怎么新增和修改默認的啟動配置
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
這個是我們通過vs生成的一個最簡單的.net core 3.1空的模板項目。Host.CreateDefaultBuilder()
這個方法默認會加載命令行參數
, 加載配置
應用配置(appsettings.json)``加載環境變量
,加載日志組件
等默認配置。
看到這些大家可能會疑問,如果環境配型、應用配置、命令行中有相同的配置,應用會以那個配置的優先級生效呢,下面我們以最簡單啟動urls參數為例,驗證下,這些配置的優先級。
urls 配置
.net core 中提供了三種設置urls的方法
- 環境變量, 在
launchSettings.json
的environmentVariables
增加ASPNETCORE_URLS
來設置urls
{
"profiles": {
"CoreStudyLesson1": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "http://*:7000"
},
"applicationUrl": "http://localhost:5000"
}
}
}
運行效果
- 應用配置。修改
appsettings.json
,增加urls
節點
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"urls":"http://*:8000"
}
運行效果
- 命令行啟動, 使用
--urls
參數指定url
dotnet run --urls https://*:9000
運行效果
- 代碼指定
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
// 設置監聽Url 命令行 硬編碼 應用配置 環境變量
webBuilder.UseUrls("http://*:6001");
});
}
運行效果
具體優先級是
命令行 >應用配置>硬編碼>環境變量
組件配置-Kestrel配置
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
// 配置web主機 kestrel
.ConfigureWebHostDefaults(webBuilder =>
{
//組件配置
webBuilder.ConfigureKestrel((context,options)=>
options.Limits.MaxConcurrentConnections=10);//默認沒有限制
// 主機配置項
webBuilder.UseStartup<Startup>();
});
}
組件配置log配置
移除默認的日志組件,並添加制定的logProvider.
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
// 配置web主機 kestrel
.ConfigureWebHostDefaults(webBuilder =>
{
//組件配置
webBuilder.ConfigureKestrel((context,options)=>
options.Limits.MaxConcurrentConnections=10);//默認沒有限制
webBuilder.ConfigureLogging(logging =>
{
logging.ClearProviders();// 移除.net Core默認注入的日志Providers
logging.AddLog4Net();//所有日志統一使用log4net
});
// 主機配置項
webBuilder.UseStartup<Startup>();
});
}
主機配置-啟動配置
// 主機配置項
webBuilder.UseStartup<Startup>();