摘要:文章前面提過GCLI爲了延續用戶的開發習慣,選擇在宿主機IDE開發代碼,基於Docker的GCLI解決了統一環境問題,但由於共享開發機的方式對於宿主的性能有一定要求,在非Linux系統上運行Docker多了虛擬機的開銷,在本地運行Docker並不是提升編譯性能的最優解。GCLI是一個基於支撐FaaS研發生命週期的命令行工具,它定義了閒魚FaaS開發閉環,統一了FaaS的研發環境,是提升FaaS研發效率的利器。

關於GCLI

閒魚技術團隊推行了基於Flutter+Servless的一體化研發方案, 在Serverless技術的加持下,客戶端開發可以輕鬆獨立完成業務閉環。FaaS作爲Serverless技術業務功能主要載體,其開發效率影響需求交付的速度。GCLI是一個基於支撐FaaS研發生命週期的命令行工具,它定義了閒魚FaaS開發閉環,統一了FaaS的研發環境,是提升FaaS研發效率的利器。

關鍵問題

FaaS開發 閉環

下圖是簡化後的閒魚FaaS開發視角下的開發生命週期,和傳統服務端開發相同,圖中2.1~2.3是最高頻動作,將這些動作串聯起來、提供標準的操作語義,以高效的運轉對於提升FaaS開發生產力至關重要。閒魚FaaS希望給用戶提供像開發本地函數一樣開發FaaS代碼的體驗。

研發環境統一

閒魚的FaaS自建了一套適配自家JAVA生態的工具鏈以簡化FaaS的編程平面,但同時引入了開發環境的一致性問題, 開發環境不能收斂管理可能帶來

  • 陷入「It works for me」困境,開發環境的干擾讓問題本質遲遲無法重現

  • 開發環境退化,如環境變量被覆蓋、OS被動升級導致兼容性問題等

  • 開發環境適應,基於linux開發的庫、工具無法在非linux環境下運行

  • Start From Scratch, 對於一個新的技術棧,開發環境安裝和配置是阻礙用戶嘗試創新的因素之一

上述幾點在閒魚的實踐裏得到了應驗,之後閒魚嘗試基於WebIDE開發來解決環境的問題,但現階段體驗上和理想有差距,WebIDE由於用戶研發習慣和工具也得不到很好的繼承,開發效率反而因此下降;如何統一開發環境、延續用戶開發習慣也是需要重點考慮的。

GCLI 的解決方案

爲了解決上面兩個核心問題,如下圖所述,GCli將研發閉環拆解成適合Serverless研發風俗的開發指令;爲了讓用戶繼承其研發習慣和工具,閒魚優先選擇了基於本地的開發方案;使用Docker技術統一開發環境,在Dcoker內聲明Dart FaaS技術棧依賴的運行環境(軟件+配置)。

藉助容器技術,FaaS的軟件環境可以移植到任何支持Linux運行的操作系統,從而解決了環境統一的問題;GCLI通過FaaS Open API實現本地和函數平臺實現互操作,形成完整的研發閉環。

GCli命令行

GCli命令行被設計成standalone的可執行程序來消除對應編程語言對runtime依賴。它會將用戶開發指令轉換爲Docker的操作命令,並以一定的策略來控制Docker的生命週期。下面是GCLI的功能片段:

用戶可以藉助GCLI定義的研發指令開發函數。例如用戶用開啓熱部署,只用關心代碼編寫,GCLI將代碼實時同步到雲端,隨後調用一次函數並觀察函數返回和結果即可。

- 利用GCLI熱部署和日誌指令開發函數

- 本地運行或debug函數

GCLI Docker容器

GCLI Docker容器最初的設計目標是提供一個和技術棧無關的FaaS開發鏡像規範,並解決與IDE本地協同開發的問題。在基於Dart的FaaS技術棧裏,容器的設計參考下圖:

  • 宿主機IDE側

  • 用戶代碼目錄通過bind mount到container,然後在容器內完成編譯,之後的產物能夠被IDE識別

  • GCLI通過Docker同步的配置文件,執行端口映射、bind mount或環境變量導入操作

  • 宿主通過Volume共享容器內的文件(如pub倉庫、maven倉庫),提升編譯速度

  • 宿主通過NAT地址轉換和容器打通網絡,端口轉換信息定義在GCLI的配置文件裏

  • 容器側

  • 鏡像加速區,爲了提升編譯的速度,在鏡像裏預置了可能需要的緩存文件以及環境變量

  • 軟件倉庫,定義需要同步到host的軟件

  • 編譯/運行時環境,包括語言運行時、環境變量、倉庫等

  • 定製軟件,GCLI提供的開發指令的實現來自這裏

有了對開發容器的抽象和定義,對於開發環境的提供者只要遵循鏡像的設計標準,即可以複用GCLI的能力,快速交付一個基於統一開發環境的研發工具。

收益和展望

閒魚自從在FaaS開發中實施了GCLI,開發人員在下面幾點上獲益:

  • 開發門檻降低了,對跨棧開發友好,非Dart技術棧開發人員可以在30分鐘內從裸機到完成開發部署FaaS服務。

  • 本地開發環境穩定可靠,徹底消滅了開發環境不一致引起的問題,節約了寶貴的開發時間。

  • 開發閉環指令簡單易用,而在GCli產出之前,50%的開發會由於定製開發工具複雜、易出錯而選擇放棄使用,進而選擇傳統低效的開發方式。以部署爲例,傳統方式需要10分鐘完成部署,GCLI只需要5秒。

  • 容忍Windows等操作系統的開發,對於一種新的開發模式推廣有正面作用。

文章前面提過GCLI爲了延續用戶的開發習慣,選擇在宿主機IDE開發代碼,基於Docker的GCLI解決了統一環境問題,但由於共享開發機的方式對於宿主的性能有一定要求,在非Linux系統上運行Docker多了虛擬機的開銷,在本地運行Docker並不是提升編譯性能的最優解。

未來,特別在雲原生開發技術不斷發展中,不單是FaaS技術棧,開發環境會逐漸走向容器化,雲主機託管用戶的開發環境,另外IDE的職責更加單一,更加輕量化。作爲對開發技術最瞭解的架構人員可以根據規範交付開發鏡像,讓開發人員享受「統一」帶來的紅利。

閒魚技術團隊不僅是阿里巴巴集團旗下閒置交易社區的創造者,更是移動與高併發大數據應用新技術的引導者與創新者。我們與 Google Flutter/Dart 小組密切合作,爲社區貢獻了多個高 star 的項目和大量 PR 。我們正在積極探索深度學習和視覺技術在互動、交易、社區場景的創新應用。閒魚技術與集團中間件團隊共同打造的 FaaS 平臺每天支持數以千萬級用戶的高併發訪問場景。  

就是現在! 客戶端/服務端java/架構/前端/質量 工程師 面向社會+校園招聘,base杭州阿里巴巴西溪園區,一起做有創想空間的社區產品、做深度頂級的開源項目,一起拓展技術邊界成就極致!

*投餵簡歷給小閒魚→ [email protected]

開源項目、峯會直擊、關鍵洞察、深度解讀

請認準 閒魚技術

相關文章