作者 | 昊祯

DataWorks 是一個提供了大資料 OS 能力、并以 all in one box 的方式提供專業高效、安全可靠的一站式大資料智能雲研發平台,提供了資料內建、資料開發、資料治理、資料安全、資料服務、應用開發、機器學習完整資料鍊路的産品。
痛點
複雜的産品功能和技術架構
很多産品都提供了類似于 IDE 形态的富互動單頁應用,如下圖:
圖1. 資料開發 IDE
IDE 形态的産品互動類似于大多數前端工程師使用的 VSCode,包含了衆多的功能子產品(甚至在 VSCode 的架構中,一切功能子產品都是由插件提供),下圖是一個資料開發 IDE 所需的最基礎功能子產品:
圖2. IDE 基礎功能子產品
在基礎能力層面,與通用的 IDE 産品存在大量的能力重疊區,這也是一個 IDE 技術産品所需的最通用部分的功能;在此基礎之上,從業務角度出發定制了上層業務能力部分,包括各種大資料計算引擎、資料開發節點(類似于 VSCode 中檔案類型)、以及“子產品”進行資料開發節點的分類和管理、看闆負責提供整體資料開發節點流程的統籌視角和流程編排。
橫向角度看,DataWorks 擁有衆多的功能子產品,縱向角度看,DataWorks 上單單節點就達到了額上百數量級。包括功能子產品、上百數量級的節點,所有代碼都糅合在一個前端工程中,加上基礎的 IDE 功能和其它子產品代碼,前端工程俨然已經演化為一個單體巨石應用,随着需求不斷的疊代和更新,現階段 DataWorks 前端工程的體量相對于第一個版本已經不可同日而語,目前單單一次建構釋出過程已經需要消耗 10 min+,可以預見的将來整個釋出過程将會多麼痛苦。
複雜的運作環境
DataWorks 面臨的運作環境放眼整個阿裡經濟體都是及其罕見的複雜,為了混合雲(即專有雲)這種私有獨立且封閉的環境,前端無法使用 cdn 的能力,如何保證同一套代碼能夠直接複用到彈内、公有雲、混合雲三種形态的運作環境,這是一個極大的工程複雜度問題。
圖3. 複雜的運作環境
除了工程架構和複雜度,不同的運作環境對于需求疊代和釋出提出了更高的管理要求,Gitlab 幫助我們解決了版本之間代碼沖突的問題,但是并不能解決産品釋出周期上的沖突,當多個需求都需要對外釋出上線,尤其在混合雲需要按月為周期産出大版本,我們一邊需要快速上線新 feature,一邊還要按照類似瀑布模型的方式将這些功能打包到專有雲版本。彈内、公有雲、混合雲的釋出節奏截然不同,衆多 feature 按照不同的節奏要出現在不同的版本疊代中,再考慮阿裡集團的熔斷機制,更加劇了大家在視窗期集中釋出而産生的風險。
千人前面的商業化需求
DataWorks 平台雖然龐大且複雜,但是考慮到公有雲和混合雲環境客戶的不同功能需求,我們需要提供一種足夠靈活輕便,便于随時随地的功能拆散/組合以實作輕裝上陣,因為挑剔的使用者一貫希望能夠以最少的代價購買到最合适的解決方案,DataWorks 的競争力顯然也需要從靈活且具備演變能力上尋找未來。
DataWorks 通過權限點的方式給功能子產品單元加上開關,雖然這種方式可以解決千人千面的需求,但是也導緻了前端工程中存在了大量的權限判斷代碼,這種方式無論是開發難度、測試成本都有較大的 effect。
簡陋的灰階機制
整體而言,DataWorks 在灰階功能驗證的時候采用的人為幹預形式的灰階機制,即依賴于提前設計好一個功能開關,當我們需要驗證一個功能的時候,往往是前端通過人為方式配置一個開關,篩選一部分使用者進入到新設計的功能子產品,經過一段時間的試跑和調整,逐漸把問題解決掉,同時對使用者的影響也可以控制在比較小的範圍。但顯然這不是一個可以反複的、随意的、自然而然的灰階機制。
人為的幹預,為灰階而耗費的設計開發,使得一次灰階的成本居高不下,有些時候我們的同學甚至因為想避免麻煩,而忽視做灰階驗證。當我們想通過灰階來驗證的功能非常的局部,或者使用者無關,工作空間無關的時候,或者我們壓根不知道哪些使用者會使用到某些功能的時候,灰階機制也會在傳統架構下失效,即使我們想去設計,也無從下手。
緊缺的人力
DataWorks 團隊存在衆多的産品,同時需要 Cover 阿裡集團内外衆多的資料開發需求,而前端團隊也就隻有 10+ 的規模,顯然這個團隊規模在應付繁重的需求疊代時是捉襟見肘的,更别說在一些創新領域進行突破了,當然這也是富互動産品研發團隊普遍面臨的問題。
雖然在引入了 React 這種子產品化的 UI 開發方式之後,在代碼層面 DataWorks 盡量做到了代碼的可重用性,但是限制于互動形态的差異,樣式的迥異,業務的差別,以及研發同學自身對于業務了解上的資訊不同步,以至于在推進元件化建設之後的一段時間之内都無法沉澱出能夠 Cover 基本面的可重用業務元件。
在前後端分離,基于主流前端架構的設計模式下,相較于曆史上的前後端一體設計體系下的使用者體驗是有提升的,然而這都是基于前端開發同學辛勤的勞作,一點點的調整樣式和互動換來的成果,這裡從來沒有捷徑可走,而我們隻能寄期望于能夠複用前端開發同學的研發成果,讓每一次設計都不要成為隻使用一次的勞動。
其他
上面列舉的幾點當然不能窮舉 DataWorks 研發團隊面臨的衆多問題,而是跟産品需求一樣,上面幾點已經是篩選之後顯得比較痛的點,産品原則上突出要強調做減法,其實這一點在研發領域同樣适用,限制于研發團隊規模,我們沒辦法 Cover 所有資料開發同學的需求,那我們也反過來也希望 DataWorks 是一個更加開放的平台,類似于 VSCode 的模式,DataWorks 團隊重點關注于打造一個基礎功能的資料開發平台,同時制定一系列标準和協定來賦能三方業務進行插件化形式的功能定制。
合作和競争
DataWorks 研發平台衆多功能涵蓋了資料開發工程師的日常工作,使用者在我們的平台上長年累月的伏案工作,對一些功能點的設計有自己的切身體感,而這些體感是我們平台的研發同學所感受不到的。PD 和 UED 去收集需求、去使用、去親自感受,然而畢竟不是專職于資料開發本身,是以很難體會到資料開發工程師長期使用後的那種細微的挫敗感。再到細分的垂直業務市場,不同行業下如何使用我們平台,差異更是有天壤之别。面向金融,銀行,政府,大型國企,網際網路公司,傳統企業,民營,教育,等等,他們的用法都是完全不同的,有的行業甚至就不知道拿到 DataWorks 平台後該做什麼。使用者的需求千差萬别,使用者的心智也處于不同階段。
是以,在我們無暇一一顧及的領域,前方的傳遞團隊或者公司,使用 DataWorks 平台應用到具體的行業中,然後再将行業的專屬需求帶回給我們的 PD 進行分析。我們平台本身也會開放一些 Api 給予前方團隊包裝成産品提供給特定領域的客戶,幫助客戶解決實際問題。
新的産品規劃還在不斷制訂之中,引擎團隊設計好自己的産品也需要在 DataWorks 平台上降低使用者的上手難度,如果永遠隻是 DataWorks 平台的開發同學按照排期逐漸完成這些接入和訂制需求,平台注定難以持續發展壯大。是以,從前後端架構層面,從無數的合作和競争場景出發,都迫切需要我們進行一次針對自身的技術革命,徹底從現有前後端研發模式中解放生産勞動力,引入更多的使用者側的研發力量,幫助平台向更健全的方向發展。
架構的演進
循證軟體架構(Evidence-Based Software Architecture)是《Expert One-on-One J2EE Development without EJB》一書中推崇的架構思路,用通俗的話說就是摸着石頭過河,找最适合自己的架構。該理論提醒我們,在産品形态不斷演進的過程中,技術架構也需要根據目前産品形态進行相應的進化。
DataWorks 前期刀耕火種的時代,在 DataStudio(資料開發工作台)中基本提煉出了一套 Studio 産品的前端架構,按照分層的方式梳理出了一個 IDE 技術産品的技術架構,基礎層封裝了 IDE 布局能力、通信能力、國際化能力、換膚能力、資料中心、無痕埋點、事件中心、消息中心等基礎子產品,上層實作了子產品管理、節點管理。
随着需求的不斷演進,DataStudio 上的節點急劇增長,各種類型節點在功能和互動上存在較大的重疊,是以在刀耕火種時代之後,DataWorks 前端團隊針對節點進行了一次重大重構,通過産品需求中提煉出一個基礎節點類,基本包含了一個節點常用的功能和互動,同時基于該基類衍生出了一大堆節點執行個體。
該套架構已經在 DataStudio 穩定運作了好幾年,DataStudio 底層依賴于 MaxCompute(原 ODPS)引擎,針對離線場景,MaxCompute 提供了強大的運算能力,但是對于實時性要求比較高的場景,MaxCompute 無法提供相應的能力,是以在不同的垂直領域 DataWorks 從 DataStudio 衍生出了各種計算引擎對應的 Studio,包括:StreamStudio(基于流計算引擎)、HoloStudio(基于互動式分析引擎) 、GraphStudio(基于圖計算引擎)。
每一種不同的計算引擎都對應了一個全新的 Studio,業務在快速擴張的壓力之下,每一個 Studio 還是以拷貝代碼的方式內建 DataStudio 中提煉的 Studio 底座能力,同時基于基礎的節點類衍生各自 Studio 中對應的資料開發節點,這種形态大概存在了一年多的時間,随着各個垂直領域 Studio 的單飛式發展,各個 Studio 底座也是走向了無法再複合的狀态。
最近 DataWorks 團隊已經完成了統一 Studio 底座的抽取,将這塊相對底層且變動相對不頻繁的功能統一進行收斂和更新維護,同時,我們也在和阿裡經濟體 IDE 共建小組(kaitian)共同推進 IDE 底座能力的融合,做到通用能力複用、業務特性通過統一上層插件協定來實作個性定制。
同時,為了解決前端人力瓶頸,我們希望将 DataWorks 平台做到更加開放,可以為 DataWorks 引入使用者側的研發能力,當然這也是基于使用者側各種個性化的需求而不得不考慮的架構更新。DataWorks 在去年開始進行 Studio 插件化架構更新,基于前面抽取的 Studio 基礎底座,在上層通過插件化方式開放了 DataStudio 的常用擴充能力。目前已經通過該方式對接了一個新引擎(Analysis DataBase)的完全自主接入,通過這種方式極大簡化了新引擎搭建資料開發 Studio 的流程和開發工作量,同時也解放了前端團隊的人力(原先新接入一個引擎,需要前端團隊針對新引擎進行定制開發)。
阿裡經濟體每個 BU 在達到一定的體量之後,慢慢都會衍生出大資料開發的需求,有一些 BU 可能會成立自己的資料小組來支撐 BU 對于大資料的需求,更甚的可能會自己搭建一個大資料平台。其實,在跟一些 BU 同僚溝通過程中發現大部分的業務 BU 對于大資料平台的需求往往是因為 DataWorks 在局部一些點上無法滿足特度的業務述求,而這一小部分的差異由于并不通用,DataWorks 作為一個大一統的開發平台無法承載業務特性的細節差異。
針對這個場景,DataWorks 基于之前的 Studio 底座統一 + 插件化技術架構基礎上打造了 DataWorks 的開放平台,另外我們也将 DataWorks 中已有的能力提供給業務部門進行功能拼裝 + 組合,進而賦能集團各業務團隊進行資料開發平台的快速搭建。
總結下來,DataWorks 經曆了(1)刀耕火種的單體應用時代、(2)元件化、(3)微前端 & 插件化三個時期的前端架構演進。
單體應用時代
各個 Studio 在快速疊代往前走的過程中,前後端不斷的累積功能和代碼子產品,後端還是按照 SpringBoot 的方式堆積功能子產品,前端雖然積累了一些業務元件庫,但是基本也是在堆積業務子產品代碼,整體前後端都在按照單體應用(巨石應用)的方式進行業務疊代。
單體應用(巨石應用)有幾個好處:
- 易測試
- 易部署
在前期快速的産品疊代過程中,單體應用的開發模式确實幫助業務快速的形成了完整的産品閉環和完善的産品鍊路。但是單體應用卻也有他的适用範圍:在應用不那麼複雜的時候,當應用越來越複雜,尤其是各個 DataWorks 産品都在往線上 IDE 形式發展過程中,我們遇到了單體應用越來越吃力的情況:
- 部署繁重:單次的小修改,需要整個應用重新部署
- 開發效率:應用代碼越來越多,編譯時間長影響開發效率
- 回歸測試難:應用功能越來越複雜,無法有效的分隔功能子產品,導緻産品回歸測試周期長
- 另外,單體應用也不太容易實作整體技術架構更新
元件化
經曆了一段時間的單體應用開發模式之後,随着業務複雜度越來越高,單體應用的體積也越來越大,不管是開發階段的實時建構還是釋出階段的編譯建構,每次一個微小的改動,前後端都需要經曆繁重的部署過程;而單體應用也在不斷的業務疊代過程中顯得越來越吃力。
後端嘗試基于 SOA 架構方式引入了 Spring Boot Starter 來進行業務子產品劃分,前端也在橫向層面抽象和積累了一部分 IDE 形态的互動元件,比如:Terminal & 檔案樹 & TabPanel & LSP Editor。
SOA 架構類似于一種服務端的元件化架構思想,把一些常用的公用子產品進行抽象,将一個龐大的系統按照功能子產品劃分為一個一個獨立的業務子產品單元(元件),一般來說,每個元件會從始至終執行一塊完整的業務邏輯,通常包括完成整體大 action 所需的各種具體任務與功能。
前端元件化類似于 SOA 架構,把一格龐大的頁面互動按照功能子產品劃分為一個一個獨立的 npm 包(元件),一般來說,每個元件從始至終也是執行一塊完整的業務邏輯和頁面互動,元件之間通常是松耦合的。
SOA 群組件化架構的确部分解決了單體應用(巨石應用)的痛點,至少把一些可複用的功能子產品進行了抽象,減少了部分功能的重複勞動,但同時也帶來了一些問題:
- 依賴關系複雜:相對于單體應用,代碼的依賴關系趨向複雜
- 問題排查問題難度高:三方元件的問題排查變得困難
- 一旦出現問題,所有依賴的應用都需要進行重新釋出
微前端/插件化
相關概念解釋
鑒于有些同學對于 Serverless、微服務等概念還存在一定的認知誤解,開頭我們先來看下相關的概念:
Serverless
Serverless(無伺服器架構)是指服務端邏輯由開發者實作,運作在無狀态的計算容器中,由事件觸發,完全被第三方管理,其業務層面的狀态則存儲在資料庫或其他媒體中。
Serverless 是雲原生技術發展的進階階段,可以使開發者更聚焦在業務邏輯,而減少對基礎設施的關注。
許多年前,我們開發的軟體還是 C/S(用戶端/伺服器)和 MVC(模型-試圖-控制器)的形式,再後來有了 SOA(面向服務的架構),最近幾年又出現了微服務架構,更新一點的有 Cloud Native(雲原生)應用,企業應用從單體架構,到服務化,再到更細粒度的微服務化,應用開發之初就是為了應對網際網路的特有的高并發、不間斷的特性,需要很高的性能和可擴充性,人們對軟體開發的追求孜孜不倦,希望力求在軟體開發的複雜度和效率之間達到一個平衡。
雲改變了我們對作業系統的認知,原來一個系統的計算資源、存儲和網絡是可以分離配置的,而且還可以彈性擴充,但是長久以來,我們在開發應用時始終沒有擺脫的伺服器的束縛(或者說認知),應用必須運作在不論是實體還是虛拟的伺服器上,必須經過部署、配置、初始化才可以運作,還需要對伺服器和應用進行監控和管理,還需要保證資料的安全性,這些雲能夠幫我們簡化嗎?讓我們隻要關注自己代碼的邏輯就好了,其它的東西讓雲幫我實作就好了。
雲計算經曆了 IaaS(Infrastructure as a Service)、PaaS(Platform as a Service),到現在 Serverless 的興起,其實是在經曆了一個讓使用者越來越聚焦于真正的業務邏輯,而非作業系統、軟體等非業務邏輯相關的基礎設施;在雲原生技術發展的較高階段,整體的目标是讓使用者隻需要關心業務代碼邏輯,把其他的部分交給雲,而目前 Serverless 所包含的兩個領域:BaaS(Backend as a Service)、FaaS(Function as a Service),基本也是兩種形式的實作了 Serverless 的初衷。
Baas
BaaS(Backend as a Service)後端即服務,一般是一個個的 API 調用後端或别人已經實作好的程式邏輯,比如身份驗證服務 Auth0,這些 BaaS 通常會用來管理資料,還有很多公有雲上提供的我們常用的開源軟體的商用服務,比如亞馬遜的 RDS 可以替代我們自己部署的 MySQL,還有各種其它資料庫和存儲服務。
FaaS
FaaS(Functions as a Service)函數即服務,FaaS 是無伺服器計算的一種形式,目前使用最廣泛的是 AWS 的 Lambada。
現在當大家讨論 Serverless 的時候首先想到的就是 FaaS,有點甚嚣塵上了。FaaS 本質上是一種事件驅動的由消息觸發的服務,FaaS 供應商一般會內建各種同步和異步的事件源,通過訂閱這些事件源,可以突發或者定期的觸發函數運作。
微服務
微服務代表了一種新型的應用建構架構方案,有别于更為傳統的單體式方案,微服務架構可将應用拆分成多個核心功能,每個功能都被稱為一項服務,可以單獨建構和部署,這意味着各項服務在工作(和出現故障)時不會互相影響。
相對于 Serverless,微服務其實是服務(API)領域範疇的一種 Serverless 架構形式,而 Serverless 除了服務(API)領域之外,還涉及存儲(比如:OSS)、資料庫(Amazon Aurora Serverless)等。
Baas 和 FaaS 其實是微服務架構的兩種實作形式,FaaS 相對于 BaaS 來說是一種更細粒度的服務單元,兩者并沒有孰優孰劣之分,看具體的業務場景更适合哪種形式。
微服務是一種架構設計模式。在微服務架構中,業務邏輯被拆分成一系列小而松散耦合的分布式元件,共同構成了較大的應用。每個元件都被稱為微服務,而每個微服務都在整體架構中執行着單獨的任務,或負責單獨的功能。每個微服務可能會被一個或多個其他微服務調用,以執行較大應用需要完成的具體任務;系統還為任務執行——比如搜尋或顯示圖檔任務,或者其他可能需要多次執行的任務提供了統一的解決處理方式,并限制應用内不同地方生成或維護相同功能的多個版本。微服務架構具有如下特點:
- 負責單個功能
- 單獨部署
- 包含一個或多個程序
- 擁有自己的資料存儲
- 一支小團隊就能維護幾個微服務
- 可替換的
相比于 SOA 架構,差別如下:
DataWorks 團隊在去年引入了微服務架構,将一些相對比較獨立的業務邏輯進行微服務化更新,相應的前端也引入了微前端 & 插件化架構實作個性化業務的開發和定制。
微前端
微前端是一種類似于微服務的架構,它将微服務的理念應用于浏覽器端,即将 Web 應用由單一的單體應用轉變為多個小型前端應用聚合為一的應用。各個前端應用還可以獨立運作、獨立開發、獨立部署。
背景微服務的一個很大的賣點在于,可以使用不同的技術棧來開發背景應用。在大型組織機構裡,采用微服務的原因主要在于,使用微服務架構來解耦服務間依賴。
而在前端微服務化上,則是恰恰與之相反的,人們更想要的結果是聚合,尤其是那些 To B(to Bussiness)的應用。
針對 DataWorks 團隊的業務現狀,針對不同的計算引擎,DataWorks 開發了衆多的垂直領域的 Studio,每一個 Studio 雖然在産品互動、功能邏輯上存在大量的重疊,但是呈現給使用者的是衆多的産品,實時計算引擎的走 SteamStudio,離線計算引擎走 DataStudio,當然還有一些用于開發 FaaS 的 Studio 平台。然而在使用者看來,所有的産品都是來自于同一家公司,他們就應該隻有一個産品,同時由于産品功能的分散,導緻一些公共基礎功能也是散點式的分布在各種産品中,對于使用者的使用成本也是一個極大的挑戰。
産品方向也在往内聚的形式轉變,18 年底開始的 XStudio 項目就是希望能夠在一個 Studio 中內建所有計算引擎的開發節點來給使用者提供一體式的産品體驗。
聚合成為一種趨勢,相應的在前端架構層面我們也借鑒了微前端架構來進行架構更新,以實作不同 Studio 中開發的功能能夠聚合到一個應用中呈現給使用者。
在 DataWorks 産品體系中,每一個子產品、節點其實是一個可以獨立開發、獨立運作、獨立部署的單體應用,不同于常見的微前端通過路由來分發微前端應用,DataWorks 的每一個節點、子產品都是通過 Tab 切換式的分發機制:
當然,我們也有路由級别的微前端架構産品,比如:運維中心,通過點選左側導覽列進行路由級别的微應用分發和切換
插件化
插件的英文是
plugin
,拆分開是
plug(插頭) + in
,現實生活生活中,電源插線闆就是這樣"plugin"應用的例子。插線闆和通過插頭插入其中的電器構成一個實體世界的插件化系統。插線闆通過插孔為“插件”提供電源,而給系統賦予了插件的能力。插入電視的插頭,就擁有看電視的功能,插入冰箱的插頭就具有冷藏食物的功能,插入台燈的插頭,就具備照明的功能,等等。
一個良好設計的插件化系統和插線闆的設計也是一樣一樣的。系統的核心應該是一個可熱插拔的“插線闆”,負責給系統接入的插件提供電源(插件API),系統的能力是所有插件能力的聚合。和實體世界的插線闆不同是,軟體插線闆的插頭沒有數量的限制,也就是說系統可以接入任意數量的插件,意味着它的功能可以無限增加。
微前端架構解決了産品之間聚合的問題,但是針對 Studio 這種富互動産品來說,微前端的方式還無法解決細粒度的功能組合問題,比如下圖所示在一個節點單體應用的頭部操作按鈕區域,不同節點具有不同的操作按鈕,針對這種場景我們通過了插件化形式将按鈕 UI 及其背後的互動和業務邏輯拆分成一個個的插件,然後配合微服務 & 插件管控台實作配置化的形式組合功能和子產品。
其實無論是微前端還是插件化都是解決産品功能的聚合問題,隻是這兩個架構在 DataWorks 産品中解決不同領域的聚合問題。微前端架構解決了大區塊粒度的功能聚合,插件化則解決了細粒度級别的功能聚合、組合。
當然,在這種富互動的 Studio 産品形态中,微應用/插件之間的通信和互動是一個非常常見的場景,這塊我們通過下述一個統一的 Studio 底座層面進行統一的規範化和标準化。
Studio 統一底座
Studio 統一底座提煉了一個 IDE 産品形态基礎的能力,同時在上層封裝了一些 Studio 業務層面的能力,配合後文涉及的 Studio 插件化的方式,實作了所有 Studio 上層業務都是通過插件化的形式植入到 Studio 底座之上,同時配合後面涉及的“微服務 & 插件化管控台”,我們實作了通過配置形式定制 Studio 産品功能,甚至可以支援快速搭建出來一個全新的 Studio。
統一的 Studio 底座除了可以進行統一的維護和更新之外,也将 Studio 底座複雜的工程結構從應用工程中剝離出來,減少了 Studio 應用工程的複雜度;同時,這也是一種統一的标準,底座規範了上層插件 & 子產品基礎的互動以及通信,這也為後續 Studio 統一插件化對于不同 Studio 之間實作插件互通提供了保障。
Studio 統一插件化
DataWorks 微前端 & 插件化架構底層使用了 qiankun(qiankun 底層依賴于 single-spa),針對 qiankun 無法滿足 Studio 場景的需求,DataWorks 團隊基于 qiankun & single-spa 進行了大刀闊斧的改進和更新:
PS:DataWorks 基于微前端架構 & 插件化架構開發的微應用/插件,兩者的存在形态都是一個可以單獨開發、單獨部署、單獨運作的前端子產品,這裡統一将稱為插件(當然,也有一些插件的運作是依賴于 Studio 底座,這種類型的插件有點不符合微前端的特性)。
1. 多執行個體模式
DataWorks 需要一個綜合的插件化架構方案,它同時需要路由級别插件(比如:運維中心)、插槽機制插件(比如:資料開發)、頁面級别插件(比如:資料地圖),整體方案底層基于 single-spa & qiankun,同時解決了 qiankun 無法實作同一個插件在同一個頁面多次渲染的問題。
2. 插槽機制
一個插件隻關心它本身的互動形态和業務邏輯,至于該插件被那個業務系統引用完全是由應用決定,是以在設計過程中我們加入了插槽機制來保證一個應用可以通過開發一個插槽插件來承載子插件,同時插槽插件可以決定其自插件的渲染邏輯,由一系列的插槽插件和子插件建構成了一個完整的頁面。
qiankun 也有樣式隔離方案,但是 qiankun 是在插件挂載的時候進行樣式清除,在同時隻能渲染一個插件的情況下該方案完美解決了樣式沖突問題,然而對于 Studio 類型的插件化方案來說,需要解決同時渲染多個插件而導緻插件之間樣式打架的問題。
3. 樣式隔離 & 版本隔離
qiankun 也有樣式隔離方案,但是 qiankun 的使用場景是單一時間内隻渲染一個插件,插件挂載的時候進行樣式清除,對于 Studio 類型的插件化方案來說,需要解決同時渲染多個插件而導緻插件之間樣式打架的問題;另外,兩個插件引用了同庫不同版本的場景,兩個版本庫對于全局樣式定義上的沖突也是需要解決的一個問題。
同樣的,樣式方面沖突問題同樣存在于 JS 相同庫、不同版本的場景,針對一些依賴于全局(window)對象的 JS 庫,我們也需要解決沖突的問題。
PS:感謝阿裡雲管控台團隊 Widget 微前端方案的思路,樣式隔離和版本隔離的解決方案借鑒于 Widget 方案。
4. 插件嵌套
對于 Studio 插件化來說,一個插件的粒度可以是一整個區塊,也可以是一個小粒度的小按鈕,同時插件之間可以是一種樹狀的資料結構,比如下圖展示的整體是一個插件,同時該插件中頭部工具條區域每一個按鈕都是一個子插件:
DataWorks 統一插件化支援了這種嵌套結構的插件渲染,同時配合“微服務 & 插件化管控台”通過配置化的方式實作插件依賴編排,甚至配合微服務管控台上的插件編排能力,一個應用完全可以通過配置化方式編排出一個完整的應用頁面。
同時,微服務管控台提供了更為傻瓜化的可視化編排能力,可以通過可視化互動形式建構出一個應用的插件依賴關系,進而在 Runtime 運作時解析、渲染為一個完整的頁面。
微服務 & 插件化管控台
前後端一體基于 DataWorks 業務的插件化,也是我們堅持要自研設計開發 DataWorks 微服務平台(DMSP:DataWorks MicroService Platform)的重要原因。DMSP 打通了前端元件的釋出和後端微服務的綁定關聯,通過 Swagger 這樣的技術手段成功使得前後端在部署後可以迅速成為一個業務插件。讓團隊的前後端都可以在 DMSP 裡面實作 DevOps,以持續傳遞的方式源源不斷的将新功能釋出給客戶。
尤其值得說明的是,DMSP 同樣是針對三大環境的,即彈内、公有雲和混合雲,插件開發完成後,我們要通過 DMSP 持續傳遞到公有雲多達 20 個 region 的環境中,還要能夠實作微服務在專有雲的統一打包部署。并且,DMSP 還要讓開發插件的同學盡量對複雜的外界部署環境無感。
未來我們期望整個 DataWorks 平台的大部分頁面内容都基于微前端 & 插件化設計,進而解決前文痛點裡面提到的問題:“靈活輕便,便于随時随地的拆散組合輕裝上陣”。架構驅動的不僅僅是開發模式,而且勢必還将影響到整個産品的藍海。
建構生态
在後端微服務配合微前端 & 插件化架構下,前文提到的垂直業務的定制開發也将成為一種可能性,面向行業的傳遞團隊可以利用 DataWorks 平台提供的微前端 & 插件化能力,為客戶訂制完全适配行業特征的智能研發平台。進而在 DataWorks 研發平台上營造一個有活力的創新生态圈,為客戶提供更加豐富多彩的選擇。架構将驅動整個生态圈的優勝劣汰,進而不斷向更有競争力的方向進化。
我們 DataWorks 研發團隊也寄期望于在這套架構之上,實作彈内彈外的共赢模式的合作,推動雲智能事業群下的産品形成合力。
重新定義研發
微服務 & 微前端架構由于語言無關性,還抹平了一些技術上的鴻溝,後端同學不會使用 React,可以使用純 JS 進行插件開發;前端同學熟悉 NodeJS,也可以在微服務的設計中一展身手。在該開發形态下,前後端同學都擴充了自身的技術領域,不但對于業務來說是一種更加高效的開發模式,同時也使前後端在技術上的互動和溝通更加有默契。
同時,DataWorks 還存在一款特殊的産品:AppStudio,專職于進行 WebIDE 的研發工作。不管是後端微服務還是前端微前端,都實作了産品功能的細粒度切分,WebIDE 正适合這種小體量工程的開發,不管是後端的微服務、還是前端插件、還是 FaaS 裡的函數,都可以進行線上開發。同時,AppStudio 後續将會更好的與微服務 & 插件化管控台進行流程打通,減輕研發流程,讓開發同學專注于業務邏輯的開發,加速産品疊代速度。
另外,在機器學習以及智能化的潮流下,我們針對前端 Coding 領域打造了一款智能化程式設計産品:Sophon 代碼智能化提示插件,我們希望在這款 IDE 插件的輔助下,前端開發能夠真正做到“鍵”步如飛。
展望未來
微服務和微前端 & 插件化的架構已經在 DataWorks Studio 這種富互動産品場景中經過一段時間的驗證,後續我們除了在業務中不斷去實踐這套技術架構之外,也希望能夠通過該套技術方案來以開放的姿态迎接更多的業務方來進行 DataWorks 大資料開發功能定制,我們也會通過微服務方式來不斷開放 DataWorks 的一些核心能力。
比如:最近我們通過該架構承接了 ADB(AnalysisDB)引擎接入到 DataWorks 體系,後端通過微服務來通路 DataWorks 核心 API 以及自身業務邏輯,前端通過微前端 & 插件化方案定制 ADB 引擎從資料采集、資料開發節點定制、資料地圖展示等各個環節産品的功能定制。
歡迎感興趣同學加我微信溝通交流:harbin1053020115。
相關連結:
1、
https://workbench.data.aliyun.com/2、
https://ide2-cn-shanghai.data.aliyun.com/3、
https://aws.amazon.com/cn/rds/aurora/serverless/4、
https://qiankun.umijs.org/5、
https://github.com/aliyun/alibabacloud-console-widget6、
https://app-cn-shanghai.data.aliyun.com/7、
https://marketplace.visualstudio.com/items?spm=ata.13261165.0.0.562dae284HPqST&itemName=dataworks.dataworks-intellisense文末福利
玩轉雲端開發 7 天訓練營
提前享受雲時代的原生開發環境,Serverless 研發從入門到精通,連續 7 天,每天一個直播,阿裡專家手把手教你利用阿裡雲雲開發平台 get 雲端開發新技能。0 門檻打開浏覽器就可以開發,最快 1 分鐘搭建個人網站,免費開發還送代金券、天貓精靈等多重好禮!
識别下方二維碼馬上入群學習,或點選
連結馬上參加:
等等,福利還沒停!關注下方公衆号轉發文章即參與抽取天貓精靈!
關注「Alibaba F2E」
把握阿裡巴巴前端新動向