雲原生的英文名是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 生態豐富就有點可笑。
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——雲原生開發新思路》。