.Net Core初識以及啟動配置
更新計劃
這段時間,會陸續把去年一年在公司做的相關培訓,整理成部落格分享給大家,在團隊內部已經把大部分的.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
配置日誌、依賴服務的注入
.Net core 中的主機分為泛型主機和 web主機
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>();