Categories
程式開發

入門 Serverless :Serverless Framework開發者工具


Serverless 架構是雲發展的產物,是一種去服務器化更加明顯的架構。然而,細心的朋友可能會發現,有一個開發者工具也叫Serverless,那麼Serverless到底是一個架構,還是一個開發者工具呢?這個開發者工具和Serverless架構又有什麼關係呢?

初探Serverless開發者工具

Serverless架構開始發展沒多久,就有一群人註冊了serverless.com的域名,成立了一家叫Serverless的公司,同時還開發了一款同名工具。

Serverless架構和Serverless開發者工具是兩個不同的東西,如果類比一下的話,就相當於中國電信,一方面指的是中國電信行業,另一方面也指的是中國電信運營商。

入門 Serverless :Serverless Framework開發者工具 1

從Serverless的公司名稱,我們也可以推斷出其推出的產品與Serverless架構緊密相關。在各個雲廠商都有自己函數計算業務的時候,Serverless團隊做了一個類似多雲管理平台的工具,可以認為是多Serverless管理的工具。利用這個工具,可以快速直接使用AWS的Lambda、Azure的Funtions以及騰訊雲SCF等眾多雲廠商的函數計算相關服務,大體支持的功能如下:

入門 Serverless :Serverless Framework開發者工具 2

通過這個上表,大家也可以感覺到這其實是個開發者工具,幫助用戶快速使用多個雲廠商的函數服務,打包、部署、回滾…當然,各個廠商也都推出類似的工具,例如AWS的SAM、騰訊雲的SCFCLI等。

除了一個以函數計算為核心的多雲開發者工具之外,Serverless公司還推出了組件化工具:Components。換句話說,Serverless開發者工具不僅僅關注Serverless中的FaaS,也要關注BaaS,將API網關、對象存儲、CDN、數據庫等眾多的後端服務和函數計算有機集合,讓用戶可以一站式開發,一站式部署,一站式更新,一站式維。

Serverless Framework 開發者工具可以被一分為二:Plugin和Components。

入門 Serverless :Serverless Framework開發者工具 3

如果說最初的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進行創建,例如:

    serverless create -t tencent-python -p mytest

然後就會生成下圖:

入門 Serverless :Serverless Framework開發者工具 4

這其中,-t指的是模板,-p指的是路徑,在Serverless Plugin操作下,可以在任何指令中使用-h查看幫助信息,例如查看Serverless Plugin的全部指令,可以直接:

入門 Serverless :Serverless Framework開發者工具 5

如果想查看Create的幫助:

入門 Serverless :Serverless Framework開發者工具 6

創建完Serverless Plugin的項目之後,我們可以看一下它的Yaml長什麼樣子:

入門 Serverless :Serverless Framework開發者工具 7

通過Yaml,我們可以看到其從上到下包括了幾個主要的Key:Service、Provider、Plugins以及Functions。

Service可以認為是一個服務或分組,即在一個Service下面的函數是可以被統一管理的,例如部署、刪除、查看統計信息等。

Provider可以認為是供應商以及全局變量的定義場景,這裡使用的是騰訊雲的雲函數,供應商是騰訊雲,所以就要寫tencent,同時在這裡還可以定義全局變量,這樣在部署的時候,會將這些全局變量分別配置到不同的函數中。

Plugin就是插件,Serverless團隊提供了超級多的Plugin,例如上文提到的serverless-tencent-scf。

最後就是Functions,是定義函數的地方。

創建項目,完成代碼編寫和Yaml的配置之後,接下來就是安裝Plugin:

npm install

入門 Serverless :Serverless Framework開發者工具 8

使用相關功能,例如部署服務:

serverless deploy

在使用這個工具部署的時候,我們並沒事先指定賬號信息,所以它會自動喚起掃碼登錄,登陸之後會繼續進行操作:

入門 Serverless :Serverless Framework開發者工具 9

操作完成會看到Service信息,這裡要注意,如果是使用CICD,就沒辦法掃碼了,必須手動配置賬戶信息,格式是:

    [default]
    tencent_appid = appid
    tencent_secret_id = secretid
    tencent_secret_key = secretkey

配置完成之後,在Yaml中指定這個文件路徑:

入門 Serverless :Serverless Framework開發者工具 10

完成部署之後,觸發函數:

入門 Serverless :Serverless Framework開發者工具 11

服務信息:

入門 Serverless :Serverless Framework開發者工具 12

除此之外,還有很多其它操作,大家有興趣可以都試一下:

  • 創建服務

  • 打包服務

  • 部署服務

  • 部署函數

  • 雲端調用

  • 查看日誌

  • 回滾服務

  • 刪除服務

  • 獲取部署列表

  • 獲取服務詳情

  • 獲取統計數據

需要注意的是,Plugin是函數開發者工具,只針對對函數資源的管理(觸發器除外),不包括API網關、COS、數據庫、CDN等。另外,在騰訊雲函數中只有命名空間和函數的概念,但是在Serverless Framework Plugin中卻有Service、Stage以及函數的三層概念,同時雲函數在Plugin不支持命名空間,所以我們可以理解為,雲函數只有函數的概念,而工具卻有服務、階段和函數的三層概念,這就會產生問題:Service和Stage是什麼?在函數中怎麼體現?

以我們剛才部署的hello_world為例:

入門 Serverless :Serverless Framework開發者工具 13

從上圖可以看到,Service 和 Stage 體現在函數名和標籤兩個地方。函數名在簡單使用時可能沒有影響,但如果涉及到函數間調用或者是雲API使用函數時,就要注意,這裡的函數名並不是在Yaml中的函數名!

當然,這裡也會出現另一個問題,即如果用戶已經有一個函數,且這個函數不是按照三段式命名的,那麼可能沒有辦法使用Plugin進行部署,除非把函數進行遷移,將原函數刪掉,使用Serverless重新進行部署。

什麼是Serverless Component

Plugin主要是對函數的管理,那麼Component呢? Component可以認為是雲產品的工具,因為通過Componnt可以對所有的組件進行組合使用,甚至還可以很簡單開發出自己的Component來滿足需求。

Component的Yaml是一段一段的,而Plugin的Yaml是一個整體,Component 中前後兩個組件可能是完全沒有任何關係的,例如

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

通過Yaml我們可以看到整個的代碼可以分為兩部分,是把一個網站的代碼放到了不同的Bucket。

目前騰訊雲的Component的基礎組件包括:

@serverless/tencnet-scf
@serverless/tencnet-cos
@serverless/tencnet-cdn
@serverless/tencnet-apigateway
@serverless/tencnet-cam-role
@serverless/tencnet-cam-policy

封裝的上層Component包括:

@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

基礎Component 指的是可通過相關的Component部署相關的資源,例如tencent-scf就可以部署雲函數,tencent-cos就可以部署一個存儲桶;上層的Component實際上就是對底層Component的組合,同時增加一些額外的邏輯,實現一些高階功能,例如tencent-django就可以通過對請求的WSGI轉換,將Django框架部署到雲函數上,其底層依賴了tencent-scf/tencent-apigateway等組件。

相對於Plugin而言,Component並沒有那麼多的操作,只有兩個:部署和移除。

例如部署操作:

serverless --debug

入門 Serverless :Serverless Framework開發者工具 14

移除操作:

serverless remove --debug

入門 Serverless :Serverless Framework開發者工具 15

相對於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:如何實現 Hello World?