小試牛刀:基於Golang的騰訊雲Serverless使用體驗
- 2019 年 12 月 28 日
- 筆記
| 導語:Serverless符合雲計算髮展的方向,把用戶關注點放在業務功能上,屏蔽底層網路框架、計算資源和機器運維等細節。這裡基於Golang試了一把騰訊雲SCF,簡單把使用體驗記一下
目錄
一、談談Serverless背景
- 為什麼要使用Serverless?
- 幫業務解決什麼問題?
- 核心構成:Trigger+FaaS+BaaS
二、基於Golang的騰訊雲SCF簡易使用流程
- 創建編輯函數
- 編寫Golang程式碼
- 上傳調試
- 添加函數觸發器
- 完善ApiGateway配置
- 查看函數日誌
- 查看函數監控
三、談談Serverless使用感受
- 優缺點和使用場景
- 當前SCF業務接入情況
- 冷啟動問題
- 關於本地快取/全局變數的使用
- 調試工具不方便
- 測試環境搭建
- 關於灰度策略
一、談談Serverless背景
為什麼要使用Serverless?
- 業務應用開發:聚焦業務邏輯、變輕變薄變簡單
- 背後基礎設施:能力不斷完善、變重變厚變標準

幫業務解決什麼問題?
讓業務在無伺服器架構演變中收益:

核心構成:Trigger+FaaS+BaaS
Serverless由Trigger+FaaS+BaaS構成:
- Trigger:函數的觸發器,一般有ApiGateway、定時器、消息隊列等多種觸發模式
- FaaS:函數即服務,Serverless的核心,完成業務應用邏輯的載體
- BaaS:後端即服務,FaaS運營依賴的遠端組件或服務,比如DB、KV、COS和後端SVR等
如一個背單詞小程式簡要架構圖:

二、基於Golang的騰訊雲SCF簡易使用流程
騰訊雲SCF:https://cloud.tencent.com/product/scf
創建編輯函數
- 登錄到騰訊雲控制台後,選擇函數服務>選擇地區和namespace->創建函數
- 幾個主要關注項:運行角色、超時時間、環境變數、公網/內網訪問、日誌集等

編寫Golang程式碼
- 引入SCF的Golang SDK:github.com/tencentyun/scf-go-lib/cloudfunction
- 下面是最簡單的SCF程式碼,通過cloudfunction.Start()綁定Handler,函數觸發後會調用
- 入參ctx為環境變數,req為自定義請求體(這裡用ApiGateway觸發,所以用了SCF默認的ApiGateway請求體結構),出參string為函數輸出數據

上傳調試
- 編譯出二進位後,上傳到SCF上就完成部署了。golang只支援上傳二進位,像python、nodejs等腳本語言可直接上傳程式碼且在控制台上編輯
- 除了控制台,一般使用VsCode插件或者命令行工具 CLI來上傳
- 上傳完保存後,就可點測試觸發函數,入參為可選測試模板或自定義參數

添加函數觸發器
- 選擇觸發方式,就可以添加1個或多個函數的觸發器,當前CSF支援了API網關、Ckafka、CMQ、定時器等常用方式
- 添加了ApiGateway後,就自動給你生成url,一條cgi就完成了,不需搭建nginx、cgi-proxy等工程,全部雲給你快速搞定

完善ApiGateway配置
- 點擊API服務名,就可到ApiGateway的控制台,管理Api的訪問方式、掛業務域名、配錯誤碼、管理版本和環境等等

查看函數日誌
- 選擇運行日誌,就可看到函數每次觸發的運行日誌資訊。但只能按時間和請求ID檢索,很不方便。一般通過掛載日誌集,同步到騰訊雲日誌服務

查看函數監控
- 同樣,監控資訊里也包含了函數運行時間、流量、吞吐量等一些基礎監控,也可配告警。更個性化和深入的業務監控,就需業務接入雲監控等其他組件了

三、談談Serverless使用感受
優缺點和使用場景
- 優點:真心叫快速上線;降低開發運維成本,特別是對機器這方面;統一業務雲開發框架;兼容微服務架構能力;能做到自動擴縮容,按需付費;
- 缺點:對雲平台強依賴,被綁架以後必須都和雲玩;服務類型受限,像無狀態、長期運行等服務不合適;當前調試發布功能真心不完善;冷啟動問題需優化
- 使用場景:雖然有些服務受限,以及存在調試不方便和冷啟動等問題,但我感覺Serverless作為一種全託管、免運維的模式,能做的場景非常多。不只是後台業務服務、像數據服務、AI服務等都可以Serverless化
當前SCF業務接入情況
- 騰訊內:手機管家,NGW,微信內讀書/支付一堆小程式,騰訊影片,騰訊地圖,騰訊相冊等
- 騰訊外:拼多多的運營活動小程式,TPLINK,英孚教育,北京尚德,新東方等
- 吞吐比較大的函數超過10+億/天調用
冷啟動問題
很多人擔心函數冷啟動,需初始化環境與VM、拉取程式碼等執行過久,導致首批請求失敗。這裡也有一些優化方案:
- 函數打薄:通過減少函數程式碼等,讓容器更輕啟動更快速
- 實例預留:Serverless比較聚焦討論的話題,通過歷史函數訪問模型,計算實例預啟動和保留策略,也可以業務自己配置,這裡就不展開
關於本地快取/全局變數的使用
目前SCF函數執行完會有3min左右環境保留,所以像本地快取還是可使用的,只是什麼時候失效變成未知數
此外,SCF也提供了像ServerlessDB等SDK,對連接池做了一些優化
調試工具不方便
作為剛入門的,也可能因為不熟悉,真心覺得Serverless調試還不是很方便,本地測試環境和現有測試服務打通很繁瑣
幾個點後面可完善使用:
- VsCode插件:查看函數,開發調試,同步文件等
- 命令行工具CLI: 實現函數打包部署,可和腳手架/CI結合使用
- 用例調試:本地和雲端調試,完善用例工具
測試環境搭建
因為SCF函數並沒環境區分,環境變數也只能設置一種,所以一般通過不同命名空間下,創建不同的函數來做測試環境。函數可一鍵複製,減少創建成本,但始終覺得有些冗餘
關於灰度策略
現在SCF發布有版本控制,但還不支援流量控制和灰度策略。這點對於每次慢慢灰度小心翼翼的我很不習慣,希望可以早日完善這個功能