從零到一,Serverless 平臺在滴滴內部落地

本文整理自 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

serverless-cli 的設計

cli 設計包含核心模塊、默認命令、webpack相關、配置規範、以及基於cli 框架上層打造的插件生態。

Serverless

場景方案

場景方案 - FaaS(雲函數)

第一個場景方案:雲函數。
函數即服務,用戶快速編寫一個函數接口,這裏創建了兩個接口, 每個接口暴露一個函數,入參爲param 和 context, 通過 async 返回函數同步異步結果。這個場景的插件爲 @didi/sls-cli-plugin-faas, 用戶通過 package.json 中聲明依賴即可。 FaaS工程類型的優勢,是簡單高效,並且通過Serverless 路由可以靈活控制隔離粒度。

Serverless

Serverless

場景方案 - Sma(微應用)

第二個場景方案:微應用。
頁面即服務,前後端代碼一體化,service.js 裏保留出兩個接口 list 和 add, 此時可以在前端組件中,類似遠程調用,直接調用這兩個方法,如同本地函數一樣。另外它的服務端代碼上下文和 FaaS 保持一致。

Serverless

場景方案 - Sma-light(微應用-輕量版)

因爲是應用級Severless方案,服務部署過程還是需要經歷構建代碼、編譯鏡像、以及整個應用級的部署。故我們基於Runtime的設計,結合Nodejs熱更新能力,來支持頁面級發佈能力,輕量微應用類型工程。它支持

  • 靜態頁面、接口
  • 動態頁面、接口
  • 頁面模板、中間件等抽象,打造該工程類型的物料生態

Severless

不同場景方案,一致開發體驗

我們來感受下,不同場景下一致的開發體驗,包括創建、構建、開發、部署等
執行dev 時會一件啓動前端資源webpack服務,同時啓動服務端runtime服務,打開導航頁面。

另外部署,可以執行 sls deploy, 通過 cli 將服務、按場景先後,按流量分組部署到 Severless 平臺。
也可以通過 Vscode 插件可視化方式進行操作,進行部署、回滾。

Severless

Severless

雲端開發

更進一步,我們提供了雲端開發能力,來滿足一些如雲函數,這類輕量創建服務的方式,開發者可以通過平臺創建函數、頁面,完成開發、調試,上線,且它的開發體驗與本地是完全環境一致,並且是複用的。

Severless

基於 Serverless 面向業務聚合

我們來看一個業務使用案例。
這是我們普惠的工作臺,是一個面向運營,集合了多個業務線後臺系統。這裏的菜單欄是配置集成起來的,每個菜單項是一個獨立的頁面,目前我們還沒有采用微前端的一些輕量的隔離方案,使用的是簡單、有效的iframe來進行隔離的。每個頁面即服務,由每個業務線團隊裏的每個同學,用他們熟悉的技術棧,通過的前面介紹的微應用解決方案,獨立運維。

Serverless

最後

最後,我們也在積極探索用 V8 Isolate 與我們現有應用級 Serverless + Runtime設計結合,實現面向 nodejs 更輕量高效的 Serverless 隔離方案。

One More Thing

快速體驗騰訊雲 Serverless Demo 並領取新手代金券 👉 serverless/try

歡迎訪問:Serverless 中文網

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