.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——雲原生開發新思路》。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章