GCLI-閒魚FaaS開發利器 關於GCLI 關鍵問題 GCLI的解決方案 總結和展望

作者:閒魚技術-無浩

關於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熱部署和日誌指令開發函數
#打開熱部署能力,實時監聽代碼變化,並實時在雲端生效
gcli hotdeploy -f my_function --watch
#調用遠程函數,獲取調用結果
gcli invoke -f my_function --data '{"data":{}}'
#查看雲端函數日誌以tail的方式運行
gcli logs -f my_function --tail
  • 本地運行或debug函數
#本地拉起函數容器
gcli local start
#本地debug
gcli local 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的職責更加單一,更加輕量化。作爲對開發技術最瞭解的架構人員可以根據規範交付開發鏡像,讓開發人員享受「統一」帶來的紅利。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章