1. 程式人生 > >.Net Core初識以及啟動配置

.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.jsonenvironmentVariables增加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>();