開源 1 年半 star 破 1.2 萬的 Dapr 是如何在阿里落地的?

簡介: Dapr 是 2019 年 10 月微軟開源的可移植、事件驅動分佈式運行時,它使開發人員可以輕鬆地構建運行在雲平臺和邊緣的彈性而微服務化的無狀態和有狀態的應用程序,從而下降基於微服務架構構建現代雲原生應用的准入門檻。node

image.png

做者 | 敖小劍
來源 | 阿里巴巴雲原生公衆號c++

Dapr 是 2019 年 10 月微軟開源的可移植、事件驅動分佈式運行時,它使開發人員可以輕鬆地構建運行在雲平臺和邊緣的彈性而微服務化的無狀態和有狀態的應用程序,從而下降基於微服務架構構建現代雲原生應用的准入門檻。golang

在今年 2 月份剛剛發佈了 v1.0 正式版本。雖然推出至今不過一年半時間,但 Dapr 發展勢頭十分迅猛,目前已經在 GitHub 上收穫了 1.2w 星。阿里是 Dapr 開源項目的深度參與者和早期採用者,率先進行了生產落地,集團內部有十幾個應用在使用 Dapr;目前已有 2 位 Dapr成員,是 Dapr 項目中除微軟以外代碼貢獻最多的公司。編程

爲何阿里會選擇Dapr?緩存

在阿里巴巴,Java 使用很是普遍,不只僅業務應用大量使用 Java,大量中間件和基礎能力的服務器端也是使用 Java 開發。在過去十幾年間,咱們圍繞 Java 創建了很是完備的生態體系,經歷過各類嚴酷的考驗。安全

而隨着業務形態的日漸豐富,多語言的需求在不斷的增長,如 nodejs / golang / c / c++ / rust 等。特別是在微服務流行以後,根據實際狀況而選擇使用不一樣的編程語言開發微服務成爲趨勢。但效仿 Java ,爲每一種編程語言都打造一套功能完備的生態體系在成本上是不現實的。所以,須要一個成本可控的方案來解決多語言問題,讓微服務開發能真正的實現「語言自由」。服務器

隨着雲的採用,業務應用的形態也開始朝雲原生方向發展,愈來愈多的業務應用(尤爲是前臺業務)開始擁抱 FaaS 和 Serverless 做爲應用託管和資源調度的解決方案。而在 FaaS 和 Serverless 場景下,須要更輕量化的解決方案以知足快速啓動和伸縮的需求 —— 傳統類庫模式下因爲須要集成大量的 SDK,業務應用變得很是的臃腫。而在 Function 形態下更加的不協調,以 nodejs 爲例:幾百行的 nodejs Function 代碼依然須要依賴多達幾十兆的 node module。同時 FaaS 和 Serverless 也對多語言的支持提供了更高的要求。所以,在 FaaS 和 Serverless 這種新型形態下有必要提供有別於傳統類庫方式的、更輕量化的、支持多語言的解決方案。架構

顯然,Servicemesh 倡導的 Sidecar 模式是解決上述問題的絕佳方案。在過去幾年間,隨着 Servicemesh 的發展和採用, Sidecar 模式已經獲得充分驗證:Sidecar 模式很是符合雲原生的理念,特別是在多語言支持和應用輕量化方面具有自然優點。less

咱們很是承認 Bilgin Ibryam 在"Multi-Runtime Microservices Architecture" 一文中提出的 Multiple Runtime / Mecha Runtime 的理念,尤爲是他對分佈式應用需求的分析,很符合咱們的實際狀況:編程語言

image.png

而 Dapr 是第一個實踐 Multiple Runtime 理念的開源項目,咱們從這個項目發佈開始就密切關注它,由於 Dapr 能夠很好的解決咱們面臨的問題:Sidecar 模式自然提供了對多語言的支持,各類客戶端 SDK 被 Dapr Runtime 替代以後應用也得以輕量化。

此外,從長期戰略的角度考慮,咱們在 2020 年提出了"三位一體"的理念,即將「自研技術」、「開源項目」、「商業產品」造成統一的技術體系,最大化技術的價值。而當前的實際狀況是三者有徹底不一樣的產品和技術方案,致使當咱們須要將某個產品在阿里內部、公有云、客戶私有云等不一樣的平臺上進行遷移時,或者是跨多個平臺部署時,就會遇到很是大的挑戰。Dapr 面向能力編程的理念,強調可移植性和可擴展性的標準 API,平臺中立、無供應商鎖定的設計,深深的吸引了咱們。

「在阿里雲,咱們相信 Dapr 將引領微服務的發展。經過採用 Dapr,咱們的客戶如今能夠以更快的速度來構建可移植和健壯的分佈式系統。」
—— 阿里雲資深技術專家 李響

在 2020 年年中,咱們開始基於 Dapr 項目進行了內部小規模的試點,在實際的落地過程當中探索和驗證 Dapr 的理念。咱們也積極參與到 Dapr 開源項目的建設中,提交了大量的改進建議和代碼。

下面咱們將以 Dapr 在阿里的實際落地場景來具體說明 Dapr 是如何幫助咱們解決上述問題的。

Dapr 在阿里的實踐

  1. 概況

目前 Dapr 在阿里巴巴內部還處於實驗階段。

咱們的首要工做是爲內部的中間件開發 Dapr 組件,使業務應用程序能夠與這些中間件和實現它們的 Java 語言/ Java Client SDK 解耦。而後經過小規模的業務應用落地,在各類場景下的對 Dapr 進行驗證,在驗證完成以後計劃繼續部署較大規模的業務應用。

截止到 2021 年 3 月,Dapr 在阿里內部落地的場景主要集中在 2 個方面:多語言支持和雲間遷移。

2. 多語言支持

1)Faas / Serverless 場景
背景:在阿里的電商系統中,存在大量活動和導購需求。
這些需求的特色是"短平快":須要快速開發、快速迭代、生命週期相對比較短。所以這類需求很是適合經過採用 FaaS 的方式來落地。

Faas 對多語言支持有強烈的訴求,確定不會侷限於 Java。而阿里內部大部分應用都是 Java 體系,對多語言的支持比較弱,尤爲是新興語言(如 Dart)或者小衆語言(如 Rust)。

而從需求上說,採用 FaaS 的應用也一樣須要和內部運行的服務以及各類中間件/基礎設施進行通信,所以 FaaS 平臺迫切的須要解決多語言支持問題。

經過 Dapr ,咱們很好的解決了 FaaS 的多語言問題,從而使得客戶經過 FaaS 實現了開發效率的大幅提高。

2)多語言應用的接入

背景:阿里收購有大量的公司。

這些收購的公司有大量的應用,而這些應用中不少不是 Java 體系,在接入阿里的技術體系時,對多語言支持有明確的需求。

另外,因爲業務創新的須要,有些應用對 nodejs 和 golang 有強烈訴求,還有一些應用則須要使用到 Dart 和 C++。

但目前這些語言的生態系統並無像 Java 那麼完善,尤爲部分中間件和基礎設施已經發展的很是成熟,進入維護狀態,不太可能在如今從新開發全部語言的客戶端:成本上代價很高,時間上也來不及。

經過 Dapr ,咱們能夠爲這些應用提供多語言解決方案。

3)複雜的 Java 遺留系統

背景:基於 Java ClassLoader 機制而設計的複雜系統。
爲了解決類衝突問題,隔毫不同的業務模塊,阿里針對 Java 系統設計了基於 ClassLoader 機制的複雜系統,這些系統的設計每每很是複雜,應用也很是臃腫。

此外,部分業務團隊爲了能和現有的中間件進行互通,自行維護了一套多語言的中間件 SDK,而這些 SDK 原本應該由中間件團隊維護並保持同步更新。這也帶來了穩定性方面的隱患和風險。

咱們指望將這些遺留的系統遷移到 Dapr 中,統一實現中間件 SDK 的維護和更新。比較特殊的是這裏存在一個需求:最好能讓業務開發團隊儘可能不作代碼層面的調整,以減小遷移時對業務應用的衝擊。

因此針對 Java 遺留系統,在遷往 Dapr 時,咱們額外設計了一個 Java 適配層:將原來的 Java 調用適配到 Dapr 的客戶端 API 上。

以上三種多語言的落地實踐場景,以下圖所示:

image.png

3. 雲間遷移

背景:業務應用對外輸出時有跨平臺需求。
阿里的部分業務,如釘釘文檔,本來是提供給阿里內部和外部用戶直接使用的,此時釘釘文檔只須要部署在阿里內部的業務集羣裏,直接訪問阿里內部的生態體系。

可是隨着 SaaS 業務的發展,以及部分信息安全敏感的用戶對於數據安全的強烈訴求, 須要將釘釘文檔部署到用戶 VPC 下或者公有云下。

爲此,咱們須要將釘釘文檔的系統從阿里內部遷移到公有云上進行部署,而釘釘文檔使用的底層技術須要從阿里內部的技術體系遷移到使用開源技術或阿里雲的商業化產品上。

藉助 Dapr 的標準 API 和可擴展的組建模型,咱們採起的策略是讓用戶不須要修改任何代碼,直接經過 Dapr Runtime 屏蔽底層使用的中間件:部署在不一樣平臺時,經過激活 Dapr 中的不一樣的 Component 來提供一致的能力。

以消息通信威力,當應用須要訪問消息系統時:

在阿里內部:經過 Rocketmq.yaml 激活 Rocketmq 組件。
在公有云上:經過 Kafka.yaml 激活 kafka 組件。
經過 Dapr 的可移植性,上層的釘釘文檔應用如今能夠和底層的基礎設施(如消息系統)解耦,從而實如今不一樣的雲平臺之間平滑遷移:

image.png

最終幫助咱們的業務團隊實現了他們的業務目標:使 Dingtalk 在任何地方部署成爲可能。

阿里的 Dapr 將來規劃

將來咱們將繼續經過應用試點的方式對 Dapr 進行驗證,包括:

適用場景
性能
穩定性
可移植性
同時咱們將繼續開發 Dapr 的組件,以集成更多的中間件和基礎設施,包括內部產品和阿里雲上支持的商業產品。其中對阿里雲商業產品的集成代碼,咱們將在驗證經過以後貢獻給 Dapr 項目,從而爲 Dapr 提供阿里雲支持。這些項目預計將包括:

Apache Dubbo 的 RPC 支持

Apache RocketMQ 的消息傳遞支持

Nacos 的動態配置支持

阿里雲 RDS 的 MySQL 支持

阿里雲緩存服務的 Redis 支持

做爲 Multiple Runtime 架構的先驅者和 Dapr 項目的早期採用者,咱們將繼續和 Dapr 社區合做,在落地的過程當中努力完善 Dapr 的功能、性能、穩定性等關鍵指標,和社區一塊兒聯手打造雲原生時代的DistributedAPplicationRuntime!
原文連接本文爲阿里雲原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索