Serverless 生態下的開發者工具

高效開發運維2019-09-16 08:02:01

作者 | 方坤丁、張遠哲
來源 | ServerlessCloudNative(ID:ServerlessGo)
由於 Serverless 平臺具備彈性擴縮、免運維、按需付費等特點,越來越多的公司和個人開始使用 Serverless 承載項目。但對於開發者而言,Serverless 一定程度上減少了開發難度,可以讓我們聚焦業務邏輯進行開發;但同時,由於 Serverless 顛覆了傳統的開發模式,從而在相關的開發工具,函數編排組織上也面臨著重大挑戰。本文會重點介紹 Serverless 生態下的開發者工具,並簡述這些工具是怎樣貫穿開發,調試,測試,部署的生命週期,提升開發者效率。
什麼是 Serverless?  

Serverless ,按中文翻譯,稱為無服務器。這究竟是一種什麼樣的形態或產品呢?無服務器,就是真的沒有服務器嗎?其實,在行業內,目前對於 Serverless 有幾種解讀方法:在某些場景可以解讀為一種軟件系統架構方法,通常稱為 Serverless 架構;而在有些情況下,又可以代表一種產品形態,稱為 Serverless 產品。

在說起 Serverless 架構時,Serverless 代表的是利用 Serverless 形態的產品實現的應用架構,這種架構完全依託於雲廠商或雲平臺提供產品完成系統的組織及構建。在這種架構中,用戶無需關注支撐應用服務運行的主機,而將關注點投入在系統架構,業務開發,業務支撐運維上。

而說起 Serverless 產品時,代表的是無需理解、管理服務器,按需使用,按使用付費的產品。Serverless 產品中,其實也可以包含存儲、計算等多種類型的產品,而典型的計算產品,就是雲函數這種形態。

雲函數,或者稱為函數即服務 Function as a Service,它和後端即服務 Backend as a Service 一起,都可以稱為 Serverless 產品;而通過組合使用這些產品,開發者可以構建自身的業務 Serverless 架構。

Serverless 的價值  

Serverless 技術為什麼會獲得越來越多的關注?我們可以從幾個角度來看。

首先,從開發者使用的來說,不用更多的去考慮服務器的相關內容,無需再去考慮服務器的規格大小、存儲類型、網絡帶寬、自動擴縮容問題;同時,也無需再對服務器進行運維了,無需不斷的打系統補丁、應用補丁、無需進行數據備份、軟件配置等工作了。

其次,Serverless 產品是完全自動化的彈性擴縮容的;在業務高峰時,產品的計算能力、容量自動擴容,承載更多的用戶請求,而在業務下降時,所使用的資源也會同時收縮,避免資源浪費。

再次,跟隨著完全自動化的彈性所帶來的,是全新的計量計費模式;開發者僅需根據使用量來付費,而在深夜無業務量的情況下,不會有空閒資源佔用,因此也不會有費用產生。

隨著如上提到的特性,Serverless 給開發者或用戶帶來了具體的商業價值:

1、降低運維需求  
  • Serverless 使得應用與服務器解耦,業務上線前無需預估資源,無需進行服務器購買、配置;

  • Serverless 也使得底層運維工作量進一步降低,業務上線後,也無需擔憂服務器運維,而是全部交給了雲平臺或雲廠商;

2、降低運營成本  
  • Serverless 的應用是按需執行的。應用只在有請求需要處理或者事件觸發時才會被加載運行,在空閒狀態下 Serverless 架構的應用本身並不佔用計算資源;

  • 而在使用 Serverless 產品時,用戶只需要為處理請求的計算資源付費,而無須為應用空閒時段的資源佔用付費;

3、縮短迭代週期、上線時間  
  • Serverless 架構帶來的是進一步的業務解耦,應用功能被解構成若干個細顆粒度的無狀態函數,開發可以聚焦在單功能的快速開發和上線上;

  • 同時拆解後的雲函數,也都可以進行獨立的迭代升級,更快速的實現業務迭代,縮減功能的上市時間;

4、快速試錯  
  • 利用 Serverless 架構的簡單運維、低成本及快速上線能力,可以來快速嘗試業務的新形態、新功能;

  • 利用 Serverless 產品的強彈性擴容能力,在業務獲得成功時,也無需為資源擴容而擔心;

面向 Serverless 開發的挑戰   

從一個開發者的角度而言,Serverless 開發和傳統的開發方式相比發生了很大的改變。開發者習慣了在本地進行開發,調試,測試和持續集成,持續部署等流程,在面向 Serverless 進行開發時,免不了會有很多疑問:

  • 怎樣本地開發一個 Serverless 項目?

  • 怎樣對 Serverless 函數進行本地調試?

  • 開發過程中打印的日誌是否可以方便的檢索並用於 debug?

  • 如何保證本地環境和雲端環境的一致?

  • 發佈時怎樣將多個函數一次性發布到雲環境中?

面向 Serverless 的工具建設邏輯  


面臨開發過程中的種種挑戰,開發者工具將從開發者的視角出發,使 Serverless 的項目開發更貼近用戶習慣。下面是一張項目開發的生命週期流程圖,可以看到,在項目的開發過程中,至少要經歷需求、編碼、構建、測試、發佈、部署和運維等幾個階段。在代碼的編碼和構建階段通過持續集成完成代碼的自動構建,成為持續集成 CI(Continuous Integration);在代碼的發佈和部署階段,通過配置灰度策略,告警和回滾計劃等,從而可以完成代碼的持續交付 CD(Continuous Delivery)。此外,在開發者的開發過程中,也會遇到編碼、調試和單元測試,集成測試等場景,這些功能的支持也是面向 Serverless 架構進行開發中必不可少的一環。對開發者工具的建設,則會重點解決在整個生命週期中的痛點。

        

面向 Serverless 的開發者工具  

在 Serverless 技術趨勢大熱的今天,已經湧現出很多面向開發者的解決方案和工具,例如開源的 Serverless Framework,Zappa 和  ClaudiaJS 等工具。開發者工具大部分都通過調用雲廠商中 Serverless 產品的 API/SDK,封裝底層能力,並提供給客戶更加直觀便捷的使用方式。目前比較常見的開發工具中,主要分為 CLI 命令行工具以及 IDE 插件這兩種形態。雖然展現方式不同,但本質上都是降低了本地開發 Serverless 項目的門檻,並在雲平臺提供的基礎能力上,封裝了更多組織和編排的方式。

由於篇幅有限,本文會以騰訊雲的雲函數為例,介紹較為典型的開發工具:

騰訊雲Serverless本地開發工具及VS Code插件  

騰訊雲 Serverless 本地開發工具(SCF CLI)以開源項目的形式維護,目的在於讓用戶方便的實現函數打包、部署、本地調試,也可以方便的生成雲函數的項目並基於 demo 項目進一步的開發。SCF CLI 通過一個函數模板配置文件,完成函數及相關周邊資源的描述,並基於配置文件實現本地代碼及配置部署到雲端的過程。

下面我們以一個 Serverless 項目為例,展示 Serverless 開發工具的使用流程:

(1)函數開發和編碼

首先,安裝並配置了 SCF CLI 後,可以通過 --help 命令查看所支持的命令,之後通過 scf init 命令快速生成一個函數 demo。在創建完畢後,可以看到生成了 index.js 文件和 template.yaml 文件。其中,index.js 是函數的入口文件,tempate.yaml 則是通過特定的格式記錄了函數的配置信息,如內存大小,超時時間等信息。tempate.yaml 也是後續對函數進行編排和組織的關鍵。除了簡單的 init 命令之外,SCF CLI 也支持從 git 拉取代碼和一些已有的函數模板,便於客戶基於特定的場景快速開發。

(2)代碼調試

在開發過程中,開發者會選取自己熟悉的 IDE 代碼編輯器進行代碼編寫。為了便於更快速直觀的進行本地開發和調試,通過騰訊雲 VS Code 插件支持了一鍵調試的能力。首先,可以打開剛創建函數的文件目錄,在插件中會自動識別這個函數。之後可以通過 F9 進行斷點,F5 啟動調試能力。函數調試過程中的輸出會打印在 terminal 中,並且支持單步調試,查看變量和堆棧等信息。

(3)代碼發佈

完成了開發和測試後,也可以分別通過 VS Code 插件或 CLI 進行代碼的發佈。目前分別支持了 zip 打包發佈,通過 COS(對象存儲)上傳併發布,以及通過 git 倉庫發佈,每次只提交增量修改的文件。在發佈完畢後,還可以通過插件中的雲端調試,來查看在雲端的運行狀況和返回日誌。

  

(4)多函數部署

在 VS Code 插件及 CLI 中,可以很方便的將單函數部署在雲端,那麼如果希望快速發佈多個函數時,應該怎樣操作呢?目前也可以直接通過 SCF CLI 的 deploy 命令來實現。只需要通過一個 template.yaml 來維護多個函數的信息即可。除了發佈之外,還可以通過 template.yaml 文件中的 Global 字段來定義一些函數的通用配置,從而解決開發過程中,希望多個函數共用相同配置的痛點(例如共用相同的環境變量,超時時間和內存等,不需要重複配置)

例如,在我的工作空間下,有兩個函數「hellotinatest234」以及「testscflinux」需批量部署上傳,並且兩個函數使用公共配置。則可以在 template.yaml 中分別定義兩個函數的屬性,並且定義 Global 字段指定公共配置。部署過程和 yaml 的樣式如下:

(5)異常排查 - 日誌能力

除了開發流程之外,在生產環境異常時,也可以通過 CLI 的 logs --tail 等命令,快速靈活地進行日誌查詢等,並且可以配合 grep awk 等工具使用。當發佈新版本時,採用 tail 模式可以實時打印雲端日誌,方便開發者快速查看問題。

(6)DevOps 能力

最後是雲函數的 DevOps 能力。目前已經支持了和 Jenkins,Coding 和藍鯨平臺等對接。並且還在持續對 Coding 平臺做更深度的整合,提供開箱即可用的 DevOps 能力。在一個經典 DevOps 的 pipeline 中,注意包含了代碼檢查,依賴安裝,測試,審批,發佈上線等環境。因此在 Serverless 的架構下,除了測試環節,這些環節和傳統的方式並無不同。因此可以依賴命令行工具中的原子能力,方便的接入到各個 DevOps 平臺。

例如,SCF CLI 工具規範了錯誤碼和對應輸出,從而可以便捷的支持腳本來識別輸出,完成自動化的測試及發佈流程。


開發者工具總結和展望  

隨著 Serverless 生態的逐步完善,工具可以覆蓋的場景會越來越多,例如,可以在本地模擬 API 網關的請求,或是通過集成常用的測試框架,對函數進行單元測試和整體性測試等。開發者也有更廣闊的空間可以去參與其中,構建一個面向 Serverless 的開發架構。後續開發者工具會更加著重於對函數及函數週邊資源的組織方式(網關,DB 等),從項目 / 應用的維度出發,讓開發者可以快速通過工具搭建一個常用的使用場景(如 WEB 網站,文件上傳工具等),從而更好地瞭解 Serverless 項目的組織方式。此外,在持續集成和持續交付的對接中,開發者工具也將支持更便捷,通用的配置,便於規範開發流程,承載大型項目和核心業務。

作者介紹

方坤丁,天津大學碩士畢業後加入騰訊。一直從事雲計算相關產品的策劃工作,先後負責過負載均衡 CLB、消息隊列 CKafka\CMQ 等產品。多次參與電商用戶雙十一保障等項目,對雲計算 IaaS,PaaS 及 Serverless 行業有較豐富的經驗和理解。現擔任無服務器雲函數 SCF 高級產品經理,負責雲函數產品的策劃工作,致力於無服務器架構的使用和推廣。

張遠哲,一直從事雲計算相關產品的工作。參與過小程序平臺的研發,SaaS 呼叫中心的研發,以及 DevOps 的運維開發。現擔任雲函數 SCF 高級產品經理,負責雲函數產品的策劃工作,致力於無服務器架構的使用和推廣。


活動推薦

落地AIOps 還是一個相對較新的詞,其設計的技術業界也還在積極探索。在智能運維相關的領域,推薦大家關注以下落地實踐:

  • Facebook 大數據模塊快速部署和實時更新

  • Kubernetes 和 Docker 容器在領英的落地實踐

  • 阿里巴巴數據驅動的智能運維DataOps

  • 百度 AIOps 黃金指標異常檢測技術實踐

點擊「閱讀原文」或識別二維碼來QCon上海2019瞭解智能運維相關的領域,包括前沿技術及其最佳落地實踐。大會 9 折報名中,立減880元,有任何問題歡迎聯繫票務小姐姐Ring:17310043226(微信同號)

https://weiwenku.net/d/201386791