進擊的.NET 在雲原生時代的蛻變

来源:https://www.cnblogs.com/shanyou/archive/2019/09/22/11566850.html
-Advertisement-
Play Games

你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》, 本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 Inf... ...


你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》,  本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。

.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 InfoQ 上發佈了一篇文章《.NET 生態系統概覽》,有了開源和跨平臺這兩個關鍵優先事項,我們就可以放心了。 下麵我們來參考文章《進擊的 Java ,雲原生時代的蛻變》對雲原生對應用運行時的不同需求,說明一個.NET Core 3.0 在雲原生時代所完成的蛻變:

  • 體積更小:對於微服務分散式架構而言,更小的體積意味著更少的下載帶寬,更快的分發下載速度,.NET Core 的鏡像體積都很小,alpine的鏡像更小,帶上應用程式通常80M。
  • 啟動速度更快:對於傳統單體應用,啟動速度與運行效率相比不是一個關鍵的指標。原因是,這些應用重啟和發佈頻率相對較低。然而對於需要快速迭代、水平擴展的微服務應用而言,更快的的啟動速度就意味著更高的交付效率,和更加快速的回滾。尤其當你需要發佈一個有數百個副本的應用時,緩慢的啟動速度就是時間殺手。對於Serverless 應用而言,端到端的冷啟動速度則更為關鍵,即使底層容器技術可以實現百毫秒資源就緒,如果應用無法在 500ms 內完成啟動,用戶就會感知到訪問延遲。這裡我拿AWS Lambda來舉例,因為各大雲廠商都是以AWS是模仿的目標,AWS Lambda中可用的所有語言都是高級的,而不是像Assembler,C / C ++或Objective C那樣。從腳本語言到JavaScript和Python,再到像Java和C#到Go這樣被編譯為二進位文件的托管運行時的語言,所有語言都是他們有自己的長處。在基準測試中,最重要的.NET Core是 冠軍,具體參看https://react-etc.net/entry/aws-lambda-benchmarks-node-js-python-java-c-go-dotnet-core
  • 占用資源更少:運行時更低的資源占用,意味著更高的部署密度和更低的計算成本。.NET Core的 CLR啟動速度非常快,降低啟動時資源消耗,可以減少資源爭搶,更好保障其他應用 SLA。
  • 支持水平擴展:.NET Core 3.0預設更好的支持Docker資源限制,官方團隊也在努力讓.NET Core成為真正的容器運行時,使其在低記憶體環境中具有容器感知功能並高效運行。 具體可以參看文章《從CLR GC到CoreCLR GC看.NET Core對雲原生的支持》,隨著記憶體成本的下降和虛擬化的流行,大記憶體配比已經成為趨勢。所以我們一般是採用水平擴展的方式,同時部署多個應用副本,在一個計算節點中可能運行一個應用的多個副本來提升資源利用率。

.NET Core 3.0 新增功能 大部分的功能特性已經公開,可以通過網頁:https://docs.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-core-3-0,其中有幾個特性是非常期待應用到生產的,很多人都在等待著明天的正式發佈。

預設可執行文件

.NET Core 現在預設生成依賴於框架的可執行文件,這個行為是和.NET Framework保持一致了。 對於使用全局安裝的 .NET Core 版本的應用程式而言,這是一種新行為。 以前,僅獨立部署會生成可執行文件。

dotnet builddotnet publish 期間,將創建一個與你使用的 SDK 的環境和平臺相匹配的可執行文件。 和其他本機可執行文件一樣,可以使用這些可執行文件執行相同操作,例如:

  • 可以雙擊可執行文件。
  • 可以直接從命令提示符啟用應用程式,如 Windows 上的 myapp.exe,以及 Linux 和 macOS 上的 ./myapp

單文件可執行文件

dotnet publish 命令支持將應用打包為特定於平臺的單文件可執行文件。 該可執行文件是自解壓縮文件,包含運行應用所需的所有依賴項(包括本機依賴項)。 首次運行應用時,應用程式將根據應用名稱和生成標識符自解壓縮到一個目錄中。 再次運行應用程式時,啟動速度將變快。 除非使用了新版本,否則應用程式無需再次進行自解壓縮。

若要發佈單文件可執行文件,請使用 dotnet publish 命令在項目或命令行中設置 PublishSingleFile

<PropertyGroup>
   <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
   <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

或者

dotnet publish -r win10-x64 /p:PublishSingleFile=true

這個單文件是大家一直期待的go 特性,.NET Core 3.0正式有了,更詳細的信息參看 https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md

程式集鏈接

.NET core 3.0 SDK 隨附了一種工具,可以通過分析 IL 並剪裁未使用的程式集來減小應用的大小。

自包含應用包括運行代碼所需的所有內容,而無需在主電腦上安裝 .NET。 但是,很多時候應用只需要一小部分框架即可運行,並且可以刪除其他未使用的庫。

.NET Core 現在包含一個設置,將使用 IL 鏈接器工具掃描應用的 IL。 此工具將檢測哪些代碼是必需的,然後剪裁未使用的庫。 此工具可以顯著減少某些應用的部署大小。

要啟用此工具,請使用項目中的 <PublishTrimmed> 設置併發布自包含應用:

<PropertyGroup>
   <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

或者

dotnet publish -r <rid> -c Release

例如,包含的基本“hello world”新控制台項目模板在發佈時命中大小約為 70 MB。 通過使用 <PublishTrimmed>,其大小將減少到約 30 MB,這個特性可以用於進一步的減小應用程式的大小。請務必考慮到使用反射或相關動態功能的應用程式或框架(包括 ASP.NET Core 和 WPF)通常會在剪裁時損壞。

分層編譯

.NET Core 3.0 中預設啟用了分層編譯 (TC)。 此功能使運行時能夠更適應地使用實時 (JIT) 編譯器來獲得更好的性能,這也是一個可以加速應用啟動的選項。

TC 的主要優勢是使(重新)實時編譯方法能夠要麼犧牲代碼質量以更快地生成代碼,要麼以較慢的速度生成更高質量的代碼。 這有助於提高應用程式在從啟動到穩定狀態的各個執行階段的性能。 這與非 TC 方法完全不同,其中每種方法均以單一方式進行編譯(與高質量層相同),這種方法偏向於穩定狀態而不是啟動性能。

若要啟用快速 JIT(第 0 層實時編譯的代碼),請在項目文件中使用此設置:

<PropertyGroup>
   <TieredCompilationQuickJit>true</TieredCompilationQuickJit>
</PropertyGroup>

ReadyToRun 映像

可以通過將應用程式集編譯為 ReadyToRun (R2R) 格式來改進.NET Core 應用程式的啟動時間。 R2R 是一種預先 (AOT) 編譯形式,這也是一項加速應用啟動時間的選項。

R2R 二進位文件通過減少應用程式載入時實時 (JIT) 編譯器需要執行的工作量來改進啟動性能。 二進位文件包含與 JIT 將生成的內容類似的本機代碼。 但是,R2R 二進位文件更大,因為它們包含中間語言 (IL) 代碼(某些情況下仍需要此代碼)和相同代碼的本機版本。僅當發佈面向特定運行時環境 (RID)(如 Linux x64 或 Windows x64)的自包含應用時 R2R 才可用。

主要版本前滾

.NET Core 3.0 引入了一項選擇加入功能,該功能允許應用前滾到 .NET Core 最新的主要版本。 此外,還添加了一項新設置來控制如何將前滾應用於應用。 這可以通過以下方式配置:

  • 項目文件屬性:RollForward
  • 運行時配置文件屬性:rollForward
  • 環境變數:DOTNET_ROLL_FORWARD
  • 命令行參數:--roll-forward

必須指定以下值之一。 如果省略該設置,則預設值為“Minor” 。

  • LatestPatch
    前滾到最高補丁版本。 這會禁用次要版本前滾。
  • Minor
    如果缺少所請求的次要版本,則前滾到最低的較高次要版本。 如果存在所請求的次要版本,則使用 LatestPatch 策略。
  • Major
    如果缺少所請求的主要版本,則前滾到最低的較高主要版本和最低的次要版本。 如果存在所請求的主要版本,則使用 Minor 策略。
  • LatestMinor
    即使存在所請求的次要版本,仍前滾到最高次要版本。 適用於組件托管方案。
  • LatestMajor
    即使存在所請求的主要版本,仍前滾到最高主要版本和最高次要版本。 適用於組件托管方案。
  • Disable
    不前滾。 僅綁定到指定的版本。 建議不要將此策略用於一般用途,因為它會禁用前滾到最新補丁的功能。 該值僅建議用於測試。

Docker 和 cgroup 記憶體限制

從預覽版 3 開始,在 Linux 上使用 Docker 運行 .NET Core 3.0 時,可以更好地處理 cgroup 記憶體限制。 運行具有記憶體限制的 Docker 容器(例如使用 docker run -m)會更改 .NET Core 的行為方式。

  • 預設垃圾回收器 (GC) 堆大小:最大為 20 MB 或容器記憶體限制的 75%。
  • 可以將顯式大小設置為絕對數或 cgroup 限制的百分比。
  • 每個 GC 堆的最小保留段大小為 16 MB。 此大小可減少在電腦上創建的堆數量。

垃圾回收堆大小減小

垃圾回收器的預設堆大小已減小,以使 .NET Core 使用更少的記憶體。 此更改更符合具有現代處理器緩存大小的第 0 代分配預算。

垃圾回收大型頁面支持

大型頁面(也稱為 Linux 上的巨型頁面)是一項功能,其中操作系統能夠建立大於本機頁面大小(通常為 4K)的記憶體區域,以提高請求這些大型頁面的應用程式的性能。

現在可以使用 GCLargePages 設置將垃圾回收器配置為一項選擇加入功能,以選擇在 Windows 上分配大型頁面。


.NET 技術在雲原生時代也在不停地進化。.NET Core 作為.NET 生態的非常重要的一員,在對現有 .NET 應用保持高度相容的同時,對啟動速度和記憶體占用做了細緻的優化,比較適於微服務架構配合使用, 在以kubernetes 為代表的雲原生應用開發平臺上發生蛻變。

在雲原生時代,我們要能夠在橫向的應用開發生命周期中,將開發、交付、運維過程進行有效的分割和重組,提升研發協同效率;並且要能在整個縱向軟體技術棧中,在編程模型、應用運行時和基礎設施等多層面進行系統優化,實現 radical simplification,提升系統效率。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、HttpClient遠程介面調用 1)用戶註冊 註冊按鈕 提交表單時,要 表單 js提交表單 2)載入外部資源文件 app.properties 編輯 RestApiServerInfo.java 3)HTTPClient工具遠程調用介面 導入依賴 發送post請求 工具類 遠程介面返回 封裝對 ...
  • 緩存的實現 我們不是做第三方比如Redis等的緩存實現,而是根據實際情況,基於C#上做一些環境變數的保存,方便項目使用。 1、系統全局變數 很多時候,在系統運行開始,需要對系統的運行參數進行保存,以便供全局使用。 代碼如下: 這裡使用一個靜態變數的Dictionary來進行保存,所有項目均可以直接獲 ...
  • 就像是.NET Framework WebApi與.NET Core WebApi一樣,.NET Framework MVC與.NET Core MVC的區別,也是框架的之間的區別。本系列先首先從.NET Framework MVC介紹,後面再去介紹.NET Core MVC 狹義MVC: MVC是 ...
  • 表達式樹練習實踐:C 值類型、引用類型、泛型、集合、調用函數 [TOC] 一,定義變數 C 表達式樹中,定義一個變數,使用 。 創建變數結點的方法有兩種, 兩種方式都是生成 類型 和 都具有兩個重載。他們創建一個 ParameterExpression節點,該節點可用於標識表達式樹中的參數或變數。 ...
  • 最近有個需求就是網頁表格裡面的數據導出到excel 於是從各位前輩的博客園搜了搜demo 大部分非為兩類 都是用的插件NPOI和Eppluse ,因此在這裡就介紹Eppluse 用法,還有就是在博客的時候 好多有留言說想看從資料庫裡面的數據進行導入 而不是寫死的,所以我就以我的案例給大家分享下用法( ...
  • 簡單創建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陸驗證四種方式:https://www.cnblogs.com/zuowj/p/5123943.html 解決跨域的8種方法:https://blog.csd ...
  • 非標設備多相機流水線模式緩存圖片(C/S客戶端,c 開發語言) ​ 本文所說流水線方式下存儲圖像是在軟體測量周期慢於圖片周期前提下講解的,如果軟體一直在等待圖片數據,邏輯就沒有那麼複雜。 1、非標設備項目,常規模式測量流程 常規模式下,相機採集圖像信號由上位機控制(無論軟觸發、硬觸發)。每個周期內的 ...
  • 參考文檔:Dapper one to many Table C Code pulic List GetPersons(){ var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'Uni ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...