本文整理自 ServerlessDay · China 大會 - 《從零到一,Serverless 平臺在滴滴內部落地》分享,講師滴滴彈性雲平臺負責人張健、滴滴資深前端開發工程師陳欽輝。滴滴 Serverless FT成員來自:滴滴基礎平臺部、車服技術部、金融事業部、普惠產品技術部。
爲什麼(前端)要推動建設 Serverless
- 更快地創建一個服務且免運維:大量的 Node.js 服務,創建服務,需要申請節點、申請機器,對接構建、部署、日誌、監控,還要持續運維服。我們希望能更快創建一個服務並且免運維。
- 更靈活的隔離能力:前端 BFF 接口聚合、微前端等業務場景,需要創建大量的接口服務,快速創建服務的同時,還希望可以以不同粒度靈活進行接口間的隔離。
- 更低的成本:大量低峯期時間cpu/內存利用率很低,服務不再使用了,資源卻仍然佔用。
我們的方案
我們調研了業界的 Serverless 方案,最終決定了自己的方案: K8s + Knative + Istio 搭建應用級 Serverless。他的優勢是:
- 社區相對繁榮,未來充滿希望。
- 應用級 Serverless, 和傳統通過 Docker 鏡像開發,部署相近,現有服務遷移成本低。
- 應用級 Serverless, 通過 Serverless。 路由,可以靈活控制隔離的粒度。
通過 Serverless 升級研發模式
那有了 Severless 基礎能力,如何通過他來升級我們的研發模式呢?
- 我們提供 npm 包打通公司的基礎能力,包括數據存儲相關、通信相關
- 上層封裝層 各種框架的中間件
- 再上層是面向業務領域的框架,express/koa/以及我們基於egg打造的degg框架,他一定程度上方便了從零到一創建一個公司內部標準的服務。
現在我們稱之爲面向 Serverless 的高級模式,業務同學可以更專注於業務編碼,簡單、高效完成這麼一個日常開發迭代的流程
Serverless 全局圖 - 研發視角
從研發視角看下,整個 Serverless的全局,自上而下是:
- 業務場景解決方案 ,基於 Serverless 平臺,在Serverless-cli 插件規範下的場景解決方案
- Serverless -cli 和 Vscode 插件,作爲面向開發者的統一入口
- 面向業務的研發層,開發IDE, 包括本地的、雲端的
- 兩層網關,業務層網關到 Istio 打造的Serverless網關
- Bass SDK,用來與後臺基礎能力通信
- 運行在集羣裏的應用,包含三類
- 右側是Appication是傳統服務
- 左下是Runtime, Application, 他是將日常業務場景進行抽象,將不變的沉澱到Runtime裏。
- 業務工程裏只有變的東西,雲函數情況下就可以是上面這個Funciton
- Nodejs 框架
- 底層集羣, K8s /Knative 集羣
右側: 是業務服務環境,下面是常規的日誌、監控、報警、性能分析的能力
左下側:是Nodejs生態體系,包括業務框架、SDK、Nodejs性能分析平臺
左上側:是面向Serverless 研發體系的共享市場
在虛線框裏,就是面向一個業務場景,基於 Serverless 能力打造的一個通用解決方案。
Serverless 流程圖 - 研發視角
將上面 Serverless 全局圖拆分,我們把它分成三部分,這三部分也是我們年初立項,多個團隊合作做這件事的一個模塊分工,分爲底層、平臺層,和麪向業務的研發層。
在開發者使用過程中,他們的流程是這樣的:
- 上層不同場景的工程,使用統一的cli, 也可以通過Vscode插件可視化來完成整個開發流程,Vscode也調用cli能力
- 然後由cli調用平臺的能力,再由平臺進行權限驗證,調用下層通用構建、部署能力
- 最後調用Serverless底層接口,將服務部署到KNative+K8s集羣上
Serverless-cli 的定位
我們再來看下 Serverless-cli, 它的定位是,基於插件式命令行擴展框架。他包含如下3個核心能力:
- 與Serverless平臺聯動,完成服務構建、部署等操作
- 提供規範,靈活的命令擴展能力
- 打造開發者生態,場景方案共享,並保持開發體驗的一致性
serverless-cli 的設計
cli 設計包含核心模塊、默認命令、webpack相關、配置規範、以及基於cli 框架上層打造的插件生態。
場景方案
場景方案 - FaaS(雲函數)
第一個場景方案:雲函數。
函數即服務,用戶快速編寫一個函數接口,這裏創建了兩個接口, 每個接口暴露一個函數,入參爲param 和 context, 通過 async 返回函數同步異步結果。這個場景的插件爲 @didi/sls-cli-plugin-faas, 用戶通過 package.json 中聲明依賴即可。 FaaS工程類型的優勢,是簡單高效,並且通過Serverless 路由可以靈活控制隔離粒度。
場景方案 - Sma(微應用)
第二個場景方案:微應用。
頁面即服務,前後端代碼一體化,service.js 裏保留出兩個接口 list 和 add, 此時可以在前端組件中,類似遠程調用,直接調用這兩個方法,如同本地函數一樣。另外它的服務端代碼上下文和 FaaS 保持一致。
場景方案 - Sma-light(微應用-輕量版)
因爲是應用級Severless方案,服務部署過程還是需要經歷構建代碼、編譯鏡像、以及整個應用級的部署。故我們基於Runtime的設計,結合Nodejs熱更新能力,來支持頁面級發佈能力,輕量微應用類型工程。它支持
- 靜態頁面、接口
- 動態頁面、接口
- 頁面模板、中間件等抽象,打造該工程類型的物料生態
不同場景方案,一致開發體驗
我們來感受下,不同場景下一致的開發體驗,包括創建、構建、開發、部署等
執行dev 時會一件啓動前端資源webpack服務,同時啓動服務端runtime服務,打開導航頁面。
另外部署,可以執行 sls deploy, 通過 cli 將服務、按場景先後,按流量分組部署到 Severless 平臺。
也可以通過 Vscode 插件可視化方式進行操作,進行部署、回滾。
雲端開發
更進一步,我們提供了雲端開發能力,來滿足一些如雲函數,這類輕量創建服務的方式,開發者可以通過平臺創建函數、頁面,完成開發、調試,上線,且它的開發體驗與本地是完全環境一致,並且是複用的。
基於 Serverless 面向業務聚合
我們來看一個業務使用案例。
這是我們普惠的工作臺,是一個面向運營,集合了多個業務線後臺系統。這裏的菜單欄是配置集成起來的,每個菜單項是一個獨立的頁面,目前我們還沒有采用微前端的一些輕量的隔離方案,使用的是簡單、有效的iframe來進行隔離的。每個頁面即服務,由每個業務線團隊裏的每個同學,用他們熟悉的技術棧,通過的前面介紹的微應用解決方案,獨立運維。
最後
最後,我們也在積極探索用 V8 Isolate 與我們現有應用級 Serverless + Runtime設計結合,實現面向 nodejs 更輕量高效的 Serverless 隔離方案。
One More Thing
快速體驗騰訊雲 Serverless Demo 並領取新手代金券 👉 serverless/try
歡迎訪問:Serverless 中文網!