【.NET 8】ASP.NET Core計劃

2023-02-09 06:03:20

.NET7.0剛釋出不久,.NET社群開始了.NET8.0的開發,重心重新回到了新功能的迭代。

我們知道在.NET7.0中一個令人激動的特新就是支援了NativeAOT,我們可以通過NativeAOT生成本機程式,由於無需JIT編譯,所以無需安裝.NET Runtime,也進一步的提升了.程式的啟動速度,降低了程式的體積,在使用者端軟體開發、ServerLess等場景會有不錯的前景。關於NativeAOT釋出的詳情可以點下方連結:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/

作為地表最強的.NET WEB伺服器ASP.NET Core,自然也是支援NativeAOT編譯,而今天就是為大家介紹關於.NET8.0中ASP.NET Core中計劃的一些NativeAOT改進。

概述

.NET 7引入了對將.NET控制檯專案作為本地AOT釋出的支援,產生了一個獨立的、針對平臺的可執行檔案,沒有任何執行時JIT。本地AOT應用程式啟動非常快,而且使用的記憶體更少。該應用程式可以被部署到沒有安裝任何.NET執行時的機器或容器中。在.NET 8中,我們將把對本地AOT的支援擴充套件到ASP.NET Core,首先是以云為重點,用最小的API構建的API應用程式,滿足關於釋出檔案大小、啟動時間、工作集和吞吐效能的期望。

範圍

如前所述,.NET8.0的主要重點是使用Minimal APIs實現ASP.NET Core API應用程式的本地AOT釋出。這裡的 "支援本地AOT"是指確保專案能夠通過<PublishAOT>專案屬性啟用本地AOT釋出,並且由此產生的開發經驗能夠引導開發人員製作本地AOT釋出的應用程式,而不會出現構建、釋出或執行時警告和錯誤。這意味著ASP.NET Core和.NET的大多數基礎功能領域都需要更新,以支援本地AOT,包括:

  • 託管API,包括WebApplication,等等。
  • Kestrel HTTP伺服器
  • 設定和選項
  • 紀錄檔
  • 依賴性注入
  • 通用中介軟體
  • 認證和授權
  • 最低限度的API
  • 健康檢查
  • 用ADO.NET進行資料存取(SQLite和PostgreSQL為主要目標)
  • 支援OpenAPI
  • 可觀測性和診斷

此外,作為一個次要目標,我們將在實現以下功能領域的NativeAOT釋出方面取得進展:

  • gRPC
  • SignalR
  • MVC Web APIs
  • Entity Framework

以下功能領域暫時不在NativeAOT支援的範圍內:

  • MVC檢視和Razor頁面
  • Blazor伺服器

開發經驗原則

本地AOT有一些限制,這意味著在釋出本地AOT時不支援.NET中的某些API和程式碼模式。這些包括依賴執行時JIT的功能,如動態程式碼生成和編譯、組合載入等,以及導致程式碼被本地AOT編譯過程修剪掉的模式,這些都是執行應用程式所需要的,導致執行時失敗。

在為ASP.NET Core增加對本地AOT的支援時,我們必須確保開發體驗是這樣的:開發人員可以合理地確定他們的應用程式在釋出為本地AOT後將如何執行。如果當前的API和功能的設計方式與原生AOT不相容,我們將利用包括原始碼生成器、分析器和程式碼修復器在內的工具,讓現有的API與NativeAOT協同工作,或者讓開發者以合理的方式更新他們的應用程式與NativeAOT協同工作。

階段

階段 1

這項工作的第一階段是使用新的專案模板建立ASP.NET Core API專案,啟用本地AOT,可以在沒有任何警告或錯誤的情況下構建、釋出和執行,並且滿足可執行檔案大小、啟動時間、工作集和吞吐量的定義指標。

度量目標

這些指標主要以Linux為重點,因為它是主要的部署目標,但Windows和macOS上的大小仍將被跟蹤,並與這些目標保持一致,因為在候選平臺調查期間,它往往有助於感知。

  • 10MB的可執行檔案大小
  • <50毫秒的啟動時間(準備接受第一個請求)。
  • <50 MB的工作集記憶體足跡(準備接受第一個請求)。
  • <50 MB的工作集記憶體佔用(處理完負載測試)。
  • 在Citrine perf環境下,預設CoreCLR RPS的5%以內

這裡的 "預設"是指與基於CoreCLR的應用程式部署的預設設定相比,例如包括分層JIT。

階段 2

第二階段建立在第一階段的基礎上,使更多的"真實世界"的ASP.NET Core API應用程式成為本地AOT釋出。這些應用程式將使用更多通常與在雲環境中執行API應用程式有關的功能,包括AuthN/Z、資料存取、OpenTelemetry等。TrimmedTodo API應用程式將作為這種應用程式的最初例子。

度量目標

這些主要是以Linux為重點,因為這是主要的部署目標,但在Windows和macOS上的大小仍將被跟蹤,並與這些目標保持一致,因為它往往有助於在候選平臺調查中的感知。

  • 20MB的可執行檔案大小
  • <150毫秒的啟動時間(準備接受第一個請求)。
  • <60 MB工作集記憶體佔用(準備接受第一個請求)。
  • <60 MB的工作集記憶體佔用(處理完負載測試)。
  • RPS在Citrine效能環境中的目標待定

總結

我們從.NET社群最新的計劃可以看出,ASP.NET Core將繼續在雲原生場景發力,通過支援NativeAOT來降低可執行檔案大小、縮短啟動時間降低記憶體佔用,筆者本人是非常期待這樣的更新,在之前筆者的文章AOT和單檔案發布對程式效能的影響中測試了.NET6.0時代ASP.NET Core AOT的的一些資料,後面.NET8.0釋出以後期待它的改進。

以下是.NET6.0 ASP.NET Core AOT的資料:


Github對應連結:https://github.com/dotnet/aspnetcore/issues/45910