Serverless 架構是雲發展的產物,是一種去服務器化更加明顯的架構。然而,細心的朋友可能會發現,有一個開發者工具也叫 Serverless,那麼 Serverless 到底是一個架構,還是一個開發者工具呢?這個開發者工具和 Serverless 架構又有什麼關係呢?
初探 Serverless 開發者工具
Serverless 架構開始發展沒多久,就有一群人註冊了 serverless.com 的域名,成立了一家叫 Serverless 的公司,同時還開發了一款同名工具。
Serverless 架構和 Serverless 開發者工具是兩個不同的東西,如果類比一下的話,就相當於中國電信,一方面指的是中國電信行業,另一方面也指的是中國電信運營商。
從 Serverless 的公司名稱,我們也可以推斷出其推出的產品與 Serverless 架構緊密相關。在各個雲廠商都有自己函數計算業務的時候,Serverless 團隊做了一個類似多雲管理平臺的工具,可以認為是多 Serverless 管理的工具。利用這個工具,可以快速直接使用 AWS 的 Lambda、Azure 的 Funtions 以及騰訊雲 SCF 等眾多雲廠商的函數計算相關服務,大體支持的功能如下:
通過這個上表,大家也可以感覺到這其實是個開發者工具,幫助用戶快速使用多個雲廠商的函數服務,打包、部署、回滾…當然,各個廠商也都推出類似的工具,例如 AWS 的 SAM、騰訊雲的 SCFCLI 等。
除了一個以函數計算為核心的多雲開發者工具之外,Serverless 公司還推出了組件化工具:Components。換句話說,Serverless 開發者工具不僅僅關注 Serverless 中的 FaaS,也要關注 BaaS,將 API 網關、對象存儲、CDN、數據庫等眾多的後端服務和函數計算有機集合,讓用戶可以一站式開發,一站式部署,一站式更新,一站式維。
Serverless Framework 開發者工具可以被一分為二:Plugin 和 Components。
如果說最初的 Serverless Cli 更多是一種以插件(Plugin)形式提供各個雲廠商的函數計算功能,那麼這個叫 Components 的功能更多就是以各個雲廠商整體服務為基礎,來幫助用戶快速將項目部署到 Serverless 架構上。
所謂的 Components 可以認為是很多 Component 的組合,例如如果部署一個網站,可能會需要有以下部分:靜態資源部分、函數計算部分、API 網關部分、CDN 部分、域名解析部分等,而 Components 就可以幫我們一站式部署這些資源,將靜態資源部署到對象存儲中,將函數計算部分部署到函數中,將 API 網關、CDN 等業務部署到對應的產品或者服務中,如果有域名解析需求,會自動解析域名,同時將整個項目的所有資源進行關聯。
除了一鍵部署、自動關聯之外,Components 還提供了若干的傳統 Web 框架部署到 Serverless 架構的解決方案,用戶可將自己已有的或者使用這些框架新開發的項目,直接一鍵部署到雲端,對開發者來說這是一個巨大的便利。
用戶如何使用 Plugin 和 Components 呢?其實這兩個功能都是 Serverless Cli 作為承載,也就是說,只要我們安裝了 Serverless Framework 這個開發者工具,就可以同時使用這兩個功能。
安裝 Serverless Framework 開發者工具的過程也很簡單:
- 安裝 Nodejs,官方說的 nodejs 只需要 6 以上就好,但是在實際使用過程中,發現 6 不行,至少 8 以上才可以。
- 安裝 Serverless 開發者工具:npm install -g serverless,安裝完成之後可以通過serverless -v查看版本號,來確定是否成功的安裝該工具。
至於如何使用 Serverless Framework 開發者工具,可以參考接下來的 Plugin 和 Components 部分。
什麼是 Serverless Plugin
首先,什麼是 Plugin,Serverless Framework Plugin 實際上是一個函數的管理工具,使用這個工具,可以很輕鬆的部署函數、刪除函數、觸發函數、查看函數信息、查看函數日誌、回滾函數、查看函數數據等。
Plugin 的使用比較簡單,可以直接使用 Serverlss Framework 進行創建,例如:
<code> serverless create -t tencent-python -p mytest/<code>
然後就會生成下圖:
這其中,-t 指的是模板,-p 指的是路徑,在 Serverless Plugin 操作下,可以在任何指令中使用 -h 查看幫助信息,例如查看 Serverless Plugin 的全部指令,可以直接:
如果想查看 Create 的幫助:
創建完 Serverless Plugin 的項目之後,我們可以看一下它的 Yaml 長什麼樣子:
通過 Yaml,我們可以看到其從上到下包括了幾個主要的 Key:Service、Provider、Plugins 以及 Functions。
Service 可以認為是一個服務或分組,即在一個 Service 下面的函數是可以被統一管理的,例如部署、刪除、查看統計信息等。
Provider 可以認為是供應商以及全局變量的定義場景,這裡使用的是騰訊雲的雲函數,供應商是騰訊雲,所以就要寫 tencent,同時在這裡還可以定義全局變量,這樣在部署的時候,會將這些全局變量分別配置到不同的函數中。
Plugin 就是插件,Serverless 團隊提供了超級多的 Plugin,例如上文提到的 serverless-tencent-scf。
最後就是 Functions,是定義函數的地方。
創建項目,完成代碼編寫和 Yaml 的配置之後,接下來就是安裝 Plugin:
<code>\tnpm install/<code>
使用相關功能,例如部署服務:
<code>\tserverless deploy/<code>
在使用這個工具部署的時候,我們並沒事先指定賬號信息,所以它會自動喚起掃碼登錄,登陸之後會繼續進行操作:
操作完成會看到 Service 信息,這裡要注意,如果是使用 CICD,就沒辦法掃碼了,必須手動配置賬戶信息,格式是:
<code> [default]
tencent_appid = appid
tencent_secret_id = secretid
tencent_secret_key = secretkey/<code>
配置完成之後,在 Yaml 中指定這個文件路徑:
完成部署之後,觸發函數:
服務信息:
除此之外,還有很多其它操作,大家有興趣可以都試一下:
- 創建服務
- 打包服務
- 部署服務
- 部署函數
- 雲端調用
- 查看日誌
- 回滾服務
- 刪除服務
- 獲取部署列表
- 獲取服務詳情
- 獲取統計數據
…
需要注意的是,Plugin 是函數開發者工具,只針對對函數資源的管理(觸發器除外),不包括 API 網關、COS、數據庫、CDN 等。另外,在騰訊雲函數中只有命名空間和函數的概念,但是在 Serverless Framework Plugin 中卻有 Service、Stage 以及函數的三層概念,同時雲函數在 Plugin 不支持命名空間,所以我們可以理解為,雲函數只有函數的概念,而工具卻有服務、階段和函數的三層概念,這就會產生問題:Service 和 Stage 是什麼?在函數中怎麼體現?
以我們剛才部署的 hello_world 為例:
從上圖可以看到,Service 和 Stage 體現在函數名和標籤兩個地方。函數名在簡單使用時可能沒有影響,但如果涉及到函數間調用或者是雲 API 使用函數時,就要注意,這裡的函數名並不是在 Yaml 中的函數名!
當然,這裡也會出現另一個問題,即如果用戶已經有一個函數,且這個函數不是按照三段式命名的,那麼可能沒有辦法使用 Plugin 進行部署,除非把函數進行遷移,將原函數刪掉,使用 Serverless 重新進行部署。
什麼是 Serverless Component
Plugin 主要是對函數的管理,那麼 Component 呢?Component 可以認為是雲產品的工具,因為通過 Componnt 可以對所有的組件進行組合使用,甚至還可以很簡單開發出自己的 Component 來滿足需求。
Component 的 Yaml 是一段一段的,而 Plugin 的 Yaml 是一個整體,Component 中前後兩個組件可能是完全沒有任何關係的,例如:
複製代碼
<code>test1:
component: "@gosls/tencent-website"
inputs:
code:
src: ./public
index: index.html
error: index.html
region: ap-shanghai
bucketName: test1
test2:
component: "@gosls/tencent-website"
inputs:
code:
src: ./public
index: index.html
error: index.html
region: ap-shanghai
bucketName: test2/<code>
通過 Yaml 我們可以看到整個的代碼可以分為兩部分,是把一個網站的代碼放到了不同的 Bucket。
目前騰訊雲的 Component 的基礎組件包括:
複製代碼
<code>@serverless/tencnet-scf
@serverless/tencnet-cos
@serverless/tencnet-cdn
@serverless/tencnet-apigateway
@serverless/tencnet-cam-role
@serverless/tencnet-cam-policy/<code>
封裝的上層 Component 包括:
複製代碼
<code>@serverless/tencnet-express
@serverless/tencnet-bottle
@serverless/tencnet-django
@serverless/tencnet-egg
@serverless/tencnet-fastify
@serverless/tencnet-flask
@serverless/tencnet-koa
@serverless/tencnet-laravel
@serverless/tencnet-php-slim
@serverless/tencnet-pyramid
@serverless/tencnet-tornado
@serverless/tencnet-website/<code>
基礎 Component 指的是可通過相關的 Component 部署相關的資源,例如 tencent-scf 就可以部署雲函數,tencent-cos 就可以部署一個存儲桶;上層的 Component 實際上就是對底層 Component 的組合,同時增加一些額外的邏輯,實現一些高階功能,例如 tencent-django 就可以通過對請求的 WSGI 轉換,將 Django 框架部署到雲函數上,其底層依賴了 tencent-scf/tencent-apigateway 等組件。
相對於 Plugin 而言,Component 並沒有那麼多的操作,只有兩個:部署和移除。
例如部署操作:
<code>serverless --debug/<code>
移除操作:
<code>serverless remove --debug/<code>
相對於 Plugin 而言,Component 的產品緯度是增加了,但是實際功能數量是縮減了。不過,這也不是大的問題,畢竟 Plugin 可以和 Component 混用,真正需要解決的問題是,這兩者的 Yaml 不一樣,如何混用?
總結
- Plugin 部署到線上的函數,會自動變更名字,例如函數是 myFunction,服務和階段是 myService-Dev,那麼函數部署到線上就是 myService-Dev-myFunction,這樣的函數名,很可能會讓函數間調用產生很多不可控因素:如果環境是 Dev,函數間調用就要寫函數名是 myService-Dev-myFunction,如果環境是 Test,此時就要寫 myService-Test-myFunction。在我看來,環境更改只需要更改配置,無需更改更深入的代碼邏輯,因此這一點會讓我覺得不友好;
- Plugin 也是有優勢的,例如如果有 Invoke、Remove 以及部署單個函數的功能,同時 Plugin 也有全局變量,它像是一個開發者工具,可以進行開發、部署、調用、查看信息、指標以及刪除回滾等操作;
- Components 可以看作是一個組件集,這裡麵包括了很多的 Components,有基礎的 Components,例如 cos、scf、apigateway 等,也有一些拓展的 Components,例如在 cos 上拓展出來的 website,可以直接部署靜態網站等,還有一些框架級的,例如 Koa,Express;
- Components 除了支持的產品多,可以部署框架之外,對我來說,最大吸引力在於其部署到線上的函數名字就是指定的名字,不會出現額外的東西;
- Components 相對 Plugin 在功能上略顯單薄,除了部署和刪除,再沒有其他功能。當你需要部署多個東西,並寫在了某個 Components 的 yaml 上,那麼即使你只修改了一個函數,它都需要全部重新部署一遍;
- Components 更多的定義是組件,所以在 Components 中是沒有全局變量的。
閱讀更多 Serverless 的文章