.NET 生態系統的蛻變之 .NET 6雲原生


雲原生的英文名是cloud native,native 就是土著的意思,也就是土著對當地的環境是非常適應的,在雲的環境和傳統的數據中心是非常不同的,雲原生就是要用的雲的技術來構建應用, 利用雲的技術來降低種端服務的風險和提高可用性,.NET Core和kubernetes 同年誕生發展, 2018年kubernetes 已經奠定了在容器編排領域的王者地位,2019年之后越來越多的企業選擇基於雲原生的技術或管理方法,把業務生於雲或遷移到雲平台,從而享受雲的高效和持續的服務能力。

隨着2021年kubernetes 的進一步普及, 微服務構建也轉向了以Sidecar 模式,這種Sidecar 模式正在以更加迅猛的勢頭將中間件領域的能力下沉至 Kubernetes 這個新一代的應用基礎設施當中,除了已經如火如荼的 Istio 對流量治理領域的顛覆,微軟在CNCF 社區開源了 Open Service Mesh ,在Service Mesh這個領域處於戰國時期,各種框架百花齊放。而與此同時, OAM 在微軟的姊妹項目 Dapr 則直接拉齊了 Kubernetes 與中間件在“服務發現與綁定”側的距離。所有這一切背后的用戶動機是非常清晰的:雲原生時代的中間件,既要語言無關,也要平台無關。

在所有問題上,對於任何給定的項目而言,正確的方法都可能介於兩個極端之間(要么微服務架構,要么單體架構),微服務的構建在企業軟件設計中正在取得平衡,不會再走向極端,而是接受了微服務的真正內涵,既與語言無關,又與平台無關,選擇適合自己團隊背景的技術構建雲原生應用,對於dotnet 技術背景的團隊在構建雲原生應用,.NET 6為你提供了很好的技術底座。

  • 體積更小:對於微服務分布式架構而言,更小的體積意味着更少的下載帶寬,更快的分發下載速度,.NET 6的鏡像體積都很小,alpine的鏡像更小,帶上應用程序通常80M。

  • 啟動速度更快:對於傳統單體應用,啟動速度與運行效率相比不是一個關鍵的指標。原因是,這些應用重啟和發布頻率相對較低。然而對於需要快速迭代、水平擴展的微服務應用而言,更快的的啟動速度就意味着更高的交付效率,和更加快速的回滾。尤其當你需要發布一個有數百個副本的應用時,緩慢的啟動速度就是時間殺手。對於Serverless 應用而言,端到端的冷啟動速度則更為關鍵,即使底層容器技術可以實現百毫秒資源就緒,如果應用無法在 500ms 內完成啟動,用戶就會感知到訪問延遲。

  • 占用資源更少:運行時更低的資源占用,意味着更高的部署密度和更低的計算成本。.NET 6的 CLR啟動速度非常快,降低啟動時資源消耗,可以減少資源爭搶,更好保障其他應用 SLA。

  • 支持水平擴展:.NET 6默認更好的支持Docker資源限制,官方團隊也在努力讓.NET 6成為真正的容器運行時,使其在低內存環境中具有容器感知功能並高效運行。隨着內存成本的下降和虛擬化的流行,大內存配比已經成為趨勢。所以我們一般是采用水平擴展的方式,同時部署多個應用副本,在一個計算節點中可能運行一個應用的多個副本來提升資源利用率。

上面說了.NET 6 在雲原生方面所完成的蛻變,很多人可能會以Java生態豐富來說明Java的種種優勢,.NET 6相對於Java 17在雲原生時代有太多的優勢,.NET團隊早在2014年完成轉型,在雲原生時代完成了蛻變,和Java相比已經是不同的世界,.NET更多的向Go、Rust等輕量級平台靠齊。隨着 Dapr 在2021年2月份發布了1.0版本,它為我們提供了一組構建塊和支持工具,可幫助我們以易於部署和可重復的方式實現關鍵的微服務設計模式,有了Dapr的支持,再來談Java 生態豐富就有點可笑。

image

Dapr 當前有7大模塊,每個模塊都是為雲原生應用開發的特定問題准備的,其中核心模塊是Actor。

Actor 是一種並發編程的模型,Actor 表示的是一個最基本的計算單元,封裝了可以執行的行為和私有狀態。actor 之間相互隔離,它們並不互相共享內存,也就是說,一個 actor 能維持一個私有的狀態,並且這個狀態不可能被另一個actor所改變。在 actor 模型里每個 actor 都有地址(信箱),所以它們才能夠相互發送消息。每個 actor 只能順序地處理消息。單個actor不考慮並發。

Dapr 中 actor 是虛擬的,它們並不一定要常駐內存。 它們不需要顯式創建或銷毀。 dapr actor runtime 在第一次接收到該 actor ID 的請求時自動激活 actor。 如果該 actor 在一段時間內未被使用,那么 runtime 將回收內存對象。 如果以后需要重新啟動,它還將還原 actor 的一切原有數據。

Actor placement service 為系統提供了 actor 分發和管理,placement 會跟蹤 actor 類型和所有實例的分區,並將這些分區信息同步到每個 dapr 實例中,並跟蹤他們的創建和銷毀。

Dapr的Virtual Actor 源自dotnet的老牌開源項目Orleans:https://github.com/dotnet/orleans。 Orleans 更像是Spring Cloud構建微服務的體系,局限在.NET社區里,如果你喜歡使用Orleans 構建微服務,最近正好出版了一本Orleans的中文書《Orleans:構建高性能分布式Actor服務》 ,Dapr Actor 把 Orleans 帶到所有的社區,如果你是用java,可以使用spring boot + dapr actor 寫業務,這里可以給你一個案例,就是深圳的 行雲創新他們就是用的這個組合,具體可以參考b站視頻《直播回顧:Dapr——雲原生開發新思路》。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM