題記:Dapr是什么,Dapr包含什么,為什么要用Dapr。
Dapr是什么
Dapr(Distributed Application Runtime),是微軟Azure內部創新孵化團隊的一個開源項目,皆在解決微服務應用開發過程的一些共性問題。以官方文檔的說法,Dapr是一個可移植、事件驅動的運行時,讓企業開發者更容易利用各種語言和框架構建柔性、無狀態和有狀態的微服務應用,並運行在雲端和邊緣。
Dapr的核心由Go語言寫成,開發團隊一開始有計划使用.NET Core/C#來寫,但是考慮到社區的接受程度,遂最終選定Go作為開發語言。當然,還是可以使用任何語言和框架來編寫Dapr的擴展功能。由於Dapr要解決的問題確實是大家面臨的一些痛點,並且Dapr的設計也獨樹一幟,所以一經開源,就成為GitHub上Star增長最快的開源項目之一,甚至達到5K Star的速率超過了Kubernetes。


Dapr包含什么
Dapr做的事情很簡單,就是利用Sidecar的模式,把代碼中的一些橫切關注點需求(Cross-cutting)分離和抽象出來,從而達到運行環境的獨立和對外部依賴(包括服務之間)的獨立。
這種獨立的途徑就是使用開放協議(HTTP和gRPC)來代替依賴特定協議。如下圖所示:


從上圖我們可以看到,使用Dapr開發的微服務應用理論上可以部署到任意的雲提供商、邊緣設備、虛擬機、Service Fabric集群、Kubernetes集群里面。
並且在如下方面(稱之為Building Block)進行外部依賴的抽象:
- 服務之間的調用:不用操心服務注冊和發現的問題,也不用操心重試等問題
- 狀態的存儲:通過鍵值對來存儲應用邏輯的狀態,讓無狀態服務變為有狀態服務
- 事件的發布訂閱:微服務之間除了直接的遠程調用外,更多是依賴事件驅動的模式去產生關系,這里對事件發布訂閱進行了統一
- 外部資源的綁定:當需要把事件發布到微服務應用外部,或者從外部接收事件的時候,就可以使用資源綁定
- Actors模式:通過Actors的模式,讓微服務可以以單線程的代碼實現大規模並行處理。實際上,Actors這部分功能的開發人員就是來自於Service Fabric團隊,兩者的API也基本保持一致。通過這樣的模式,也把Actors這種模式引入到了其他運行平台
- 可觀測性:Dapr會幫助微服務應用發出基於W3C Trace Context標准和Open Telemetry規范的度量、日志、跟蹤信息,方便對應用進行調試、診斷和監控
- 密鑰管理:為微服務提供密鑰管理的能力,從而從依賴的外部密鑰管理服務中獨立出來。
下圖很好的展示了以上獨立抽象的能力是如何通過Sidecar模式實現的:
(Sidecar進程模式)


(Sidecar容器模式)


雖然Dapr暴露的所有能力都是基於開放協議HTTP和gRPC的,但是為了方便大家快速開發,目前還是提供了如下語言平台的SDK:
- C++ SDK
- Go SDK
- Java SDK,可以和Spring Boot集成
- Javascript SDK,可以和Express集成
- Python SDK,可以和Flask集成
- .NET SDK,可以和ASP.NET Core集成
同時,Dapr還可以和微軟開源的FaaS開發框架Azure Functions進行集成,Dapr開發團隊也基於Azure Logic App的邊緣運行時版本為微服務應用提供了Workflows的能力
為什么要用Dapr
根據InfoQ的架構和設計技術趨勢報告(https://www.infoq.com/articles/architecture-trends-2020/),微服務已經成為軟件開發的主流。但是要開發微服務應用,大部分開發人員還是面臨諸多挑戰。根本原因在於我們更熟悉經典的3層架構,而對微服務這種分布式應用的開發經驗會顯得相對不足,很難應對分布式應用所要求的伸縮性、靈活性、可維護性等雲原生的特點。
Dapr通過把一些構建微服務應用所需的最佳實踐內置到開放、獨立的Building Block中,讓開發人員更加專注於業務邏輯代碼的編寫,即可開發出功能強大的微服務應用。
更為重要的是,Dapr還抽象了運行環境,避免微服務應用和運行環境強綁定(這也是很多團隊“假上雲”——僅使用VM的原因之一)。並且支撐Dapr的運行環境不僅僅限於Cloud,還有廣闊的Edge。
毫無疑問,Dapr獲得了很多用戶的青睞,官網上提到的Geek+使用Dapr構建了倉儲機器人的解決方案,Willow使用Dapr構建了智能鐵路管理系統。也還有很多大型企業正在采用Dapr來構建他們的微服務應用,甚至國內某互聯網巨頭不僅計划采用還積極參與了Dapr社區的貢獻。
