.NET平臺系列18 .NET5的超強優勢

張傳寧發表於2021-06-09
支援所有 .NET 應用程式型別

  .NET5 統一版本之後將支援所有 .NET 應用程式型別:Xamarin、ASP.NET、IoT 和桌面。此外,它將利用一個單獨的 CoreFX/基類庫 (BCL)、兩個獨立的執行時和執行時程式碼庫(因為很難將兩個截然不同的執行時單獨作為源)和一個工具鏈(比如 dotnet CLI)。結果將是行為、API 和開發人員體驗之間的一致性。例如,在每個不同平臺上將執行一組庫,而不是三個 System.* API 實現。

將框架、執行時和開發人員工具集統一到一個程式碼庫中

  .NET 的統一有很多優點。將框架、執行時和開發人員工具集統一到一個程式碼庫中,將減少開發人員(Microsoft 和社群)需要維護和擴充套件的重複程式碼量。此外,正如我們最近對 Microsoft 的期許,所有 .NET 5 原始碼都將是開放原始碼。

  合併後,所有平臺都可以使用每個單獨框架獨有的許多功能。例如,這些平臺的 csproj 型別將統一為深受歡迎的、簡單的 .NET Core csproj 檔案格式。因此,.NET Framework 專案型別將能夠利用 .NET Core csproj 檔案格式。雖然 Xamarin 和 .NET Framework(包括 WPF 和 Windows 窗體)csproj 檔案需要轉換為 .NET Core csproj 檔案格式,但該任務類似於從 ASP.NET 轉換為 ASP.NET Core。幸運的是,得益於諸如 ConvertProjectToNETCore3 之類的工具,現在實現起來更加容易(請參閱 bit.ly/2W5Lk3D)。

支援JIT與AOT兩種編譯模式

  另一個顯著差異是 Xamarin 和 .NET Core/.NET Framework 的執行時行為。前者使用靜態編譯模型,使用提前 (AOT) 編譯將原始碼編譯為平臺的本機原始碼。而 .NET Core 和 .NET Framework 使用即時 (JIT) 編譯。幸運的是,在 .NET 5 中,JIT和AOT這兩種模型都將受支援,具體取決於專案型別目標。例如,可以選擇將 .NET5 專案編譯為單個可執行檔案,該檔案將在執行時使用 JIT 編譯器 (jitter),或使用本機編譯器在 iOS 或 Android 平臺上工作。大多數專案都會利用 JIT,但對於 iOS 來說,所有程式碼都是 AOT。對於客戶端 Blazor,執行時是 Web 程式集 (WASM),Microsoft 打算 AOT 編譯少量託管程式碼(大約 100 kb 到 300 kb),而其餘程式碼將被解釋。(AOT 程式碼很大,因此網路成本是一個相當大的負擔。)

建立單個可執行檔案

  在 .NET Core 3.0 中,可以編譯到單個可執行檔案,但該可執行檔案實際上是執行時所需執行的所有檔案的壓縮版本。在執行該檔案時,它首先將自己展開到一個臨時目錄中,然後從包含所有檔案的目錄中執行應用程式的入口點。相反,.NET 5 將建立一個實實在在的、可直接就地執行的單個可執行檔案。

互操作性

  .NET 5 的另一個顯著特性是與 Java 和 Objective-C(包括 Swift)中原始碼的互操作性。自早期版本以來,這一直是 Xamarin 的一個特性,但將擴充套件到所有 .NET5 專案。例如,你將能夠在 csproj 檔案中包含 jar 檔案,並且能夠直接從 .NET 程式碼呼叫 Java 或 Objective-C 程式碼。(遺憾的是,對 Objective-C 的支援可能會比 Java 晚)。 需要注意的是,.NET5 和 Java/Objective-C 之間的互操作性只針對程式內通訊。與同一臺計算機上的其他程式甚至不同計算機上的程式的分散式通訊可能需要序列化為基於 REST- 或 RPC- 的分散式呼叫。

容器支援的優勢

  新的網際網路技術時代已經來臨了,容器、Kubernetes、DevOps、微服務、雲原生才是技術前進的方向,其中容器技術屬於基石。從.NET Core 誕生直到.NET5,都能持續看到平臺對容器技術的官方支援和適配改進,裡面還強調了有著更小的容器映象。.NET5+Docker容器化後還有其他語言無可比擬的優勢!

1、體積更小

.NET5的映象體積都很小,alpine的映象更小,帶上應用程式也才80M,對於微服務分散式架構而言,更小的體積意味著更少的下載頻寬,更快的分發下載速度。

2、佔用資源更少

.NET5的CLR+預設http://ASP.NET Core框架頁面啟動後,僅需22M記憶體,同比Java8已經需要120M了,執行時資源佔用也更低,意味著更高的部署密度和更低的計算成本。

3、啟動速度更快

.NET5的 CLR啟動速度非常快,而啟動速度就意味著交付效率和回滾效率,在動輒數百個副本微服務時,啟動速度就是個非常重要的特性。

4、容器感知,低配執行

.NET5 預設更好的支援Docker資源限制,官方團隊也在努力讓.NET5成為真正的容器執行時,使其在低記憶體環境中具有容器感知功能並高效執行,遠超其他平臺。

雲原生支援的優勢

.NET團隊一直將重點放在.NET5領域,並引入了新的改進和功能:

  • REST API 可以更簡單地構建測試,並將其釋出到諸如Azure API管理之類的應用程式中。此外,還可以在預設情況下由OpenAPI生成客戶端。
  • gRPC gRPC可以構建與WCF類似的高效能基於合約的API。
  • 較小,更快的微服務 .NET團隊在.NET5中完成的一件很酷的事情是,您可以選擇一個ASP .NET專案,然後選擇要釋出的專案,這將生成一個20m的小型自包含應用程式,完全不需要在計算機上執行.NET。
  • 使用WSL和Linux進行跨平臺開發
  • 高效能反向代理(YARP)

 


參考文獻:

  • https://devblogs.microsoft.com/dotnet/announcing-net-5-0/
  • https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5

 

相關文章