雲計算:使用Serverless你要知道他們兩個的區別

問題

  • 什麼是Serverless Framework Cli(Plugin)
  • 什麼是Serverless Framework Component

什麼是Serverless Plugin

關注我賬號的小夥伴應該看過我之前發的文章,名字叫《雲計算:Serverless Framework與Serverless CLI》給大家講了什麼是Serverless架構,也說了Serverless這個公司做了一個叫Serverless的工具,但是實際上,並沒有和大家詳細的說明Serverless這個工具中Plugin和Component的區別。

首先大家要明確,在目前而言,我們所接觸的Serverless Framework這個工具,實際上是由Plugin和Component兩個部分。對Plugin而言,更多的是對函數的使用;對Component而言,更多的是對雲產品的使用。

首先,什麼是Plugin,Serverless Framework Plugin實際上是一個函數的管理工具,無論針對AWS還是Tencent雲,Plugin的目標都是對函數進行管理。使用這個工具,你可以很輕鬆的部署函數/刪除函數/觸發函數/查看函數信息/查看函數日誌/回滾函數/查看函數數據等。

Plugin的使用時比較簡單的,你可以直接使用Serverlss Framework進行創建,例如:

<code>serverless create -t tencent-python -p mytest/<code>

就可以看到這樣的圖案生成:

雲計算:使用Serverless你要知道他們兩個的區別

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

雲計算:使用Serverless你要知道他們兩個的區別

如果想查看Create的幫助:

雲計算:使用Serverless你要知道他們兩個的區別

其實這樣看還是比較方便的。接下來繼續說我們剛才的部分,創建完Serverless Plugin的項目之後,我們可以看一下他的Yaml長什麼樣子:

雲計算:使用Serverless你要知道他們兩個的區別

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

Service可以認為是一個服務,也可以認為是一個分組,就是說在一個Service下面的函數,是可以被統一管理的,例如部署/刪除/查看統計信息等,都是可以按照這個Service層面來統一進行的。

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

Plugin就是插件的意思,就是說你在這個項目下,你會用到那些Plugin,因為Serverless團隊提供了超級多的Plugin,當然這個例子裡面是需要使用serverless-tencent-scf這個Plugin,因為我們要部署Tencent雲的雲函數,你要使用其他廠商的可能就要替換上面Provider中的name和這裡Plugin了。

最後就是Functions,這就是我們定義函數的地方,這裡可以定義很多函數。

接下來繼續體驗,我們創建項目之後,完成代碼編寫和Yaml的配置,我們可以繼續操作,接下來就是要安裝Plugin(是的,就是我們剛才在Yaml中寫的Plugin):

<code>npm install/<code>
雲計算:使用Serverless你要知道他們兩個的區別

然後就可以進行功能的使用,例如部署服務:

<code>serverless deploy/<code>

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

雲計算:使用Serverless你要知道他們兩個的區別

我們只需要掃一掃就可以完成登陸,登陸之後會繼續進行操作:

雲計算:使用Serverless你要知道他們兩個的區別

操作完成會看到我們的Service信息,這裡要注意,如果我們走CICD的時候,是沒辦法掃碼的,那麼這個時候我們就可以手動配置這個賬戶信息,格式是:

<code>[default]
tencent_appid = appid
tencent_secret_id = secretid
tencent_secret_key = secretkey/<code>

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

雲計算:使用Serverless你要知道他們兩個的區別

完成部署之後,我們可以觸發函數:

雲計算:使用Serverless你要知道他們兩個的區別

還可以服務信息:

雲計算:使用Serverless你要知道他們兩個的區別

很多操作,大家有興趣的都可以試一下:

<code>創建服務
打包服務
部署服務
部署函數
雲端調用
查看日誌
回滾服務
刪除服務

獲取部署列表
獲取服務詳情
獲取統計數據
....../<code>

可以說是把函數的管理和操作是做的淋漓盡致,非常不錯。但是大家也注意下,這裡只是對函數資源的管理(觸發器除外),不包括API網關,不包括COS,不包括數據庫,不包括CDN…..只是函數。是的,Plugin就是函數開發者工具。

另外,這裡要注意,雖然在Tencent雲函數中只有命名空間和函數的概念,但是在Serverless Framework Plugin中卻有Service、Stage以及函數的三層概念,同時雲函數在Plugin這裡不支持命名空間,所以可以認為是雲函數只有函數的概念,而工具卻有服務,階段和函數的三層概念,這就會產生問題:

Service和Stage是什麼?在函數中怎麼體現?

以我們剛才部署的hello_world而言:

雲計算:使用Serverless你要知道他們兩個的區別

可以看到,在兩個地方體現,一個函數名:服務名-階段-函數名,另一個是標籤,這裡我對標籤的體現沒有太多的想法,但是對這個函數名的變化就要額外提醒:可能我們在簡單使用的時候沒有影響,但是如果涉及到函數間調用,或者通過雲API使用函數的時候,那麼這裡面就要注意,我們的函數名並不是我們在Yaml中的函數名!這也導致另外一個問題,如果你已經有一個函數,且不是按照這種三段式命名的函數,那麼你可能沒辦法很好的使用Plugin進行部署,除非說把函數進行遷移,將原函數刪掉,使用Serverless重新進行部署。

什麼是Serverless Component

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

Component的Yaml是一段一段的,剛才可以看到Plugin的Yaml是一個整體,從上到下實際上是一個Service裡面的內容。但是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。目前Tencent雲的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>
雲計算:使用Serverless你要知道他們兩個的區別

移除操作:

<code>serverless remove --debug/<code>
雲計算:使用Serverless你要知道他們兩個的區別

所以相對於Plugin而言,Component的產品緯度是增加了,但是實際功能數量是縮減了。

當然,我覺得這些都不是什麼問題,畢竟我們可以Plugin和Component混用,但是問題來了:他們的Yaml長的不一樣,我怎麼混用?確實很尷尬的問題,我相信Serverless團隊在不久的將來應該會解決這個問題吧。

總結

接下來說一下我的個人想法:

Plugin部署到線上的函數,會自動變更名字,例如我的函數是myFunction,我的服務和階段是myService-Dev,那麼函數部署到線上就是myService-Dev-myFunction,這樣的函數名,很可能會讓我的函數間調用等部分產生很多不可控因素。例如我現在的環境是Dev,我函數間調用就要寫函數名是myService-Dev-myFunction,如果是我的環境是Test,此時就要寫myService-Test-myFunction,我始終覺得,我更改環境應該只需要更改配置,而不是更深入的代碼邏輯。所以我對Plugin的這個換名字問題很煩躁;

Plugin也是有優勢的,例如他有Invoke、Remove以及部署單個函數的功能,同時Plugin也有全局變量,我覺得這個更像一個開發者工具,我可以開發、部署、調用、查看一些信息、指標以及刪除回滾等操作,都可以通過Plugin完成,這點很給力,我喜歡;

Components可以看作是一個組件集,這裡麵包括了很多的Components,可以有基礎的Components,例如cos、scf、apigateway等,也有一些拓展的Components,例如在cos上拓展出來的website,可以直接部署靜態網站等,還有一些框架級的,例如Koa,Express,這些Components說實話,真的蠻方便的,Tencent官方也是有他們的最佳實踐;

Components除了剛才所說的支持的產品多,可以部署框架之外,對我來說,最大吸引力在於這個東西,部署到線上的函數名字就是我指定的名字,不會出現額外的東西,這個我非常看重;

Components相對Plugin在功能上略顯單薄,除了部署和刪除,再沒有其他,例如Plugin的Invoke,Rollback等等一切都沒有,同時,我們如果有多個東西要部署,寫到了一個Components的yaml上,那麼我們每次部署都要部署所有的,如果我們認為,我們只修改了一個函數,並且不想重新部署其他函數從而註釋掉其他函數,那麼很抱歉告訴你,不行!他會看到你只有一個函數,並且幫你把你註釋掉的函數在線上刪除;

Components更多的定義是組件,所以每個組件就是一個東西,所以在Components上面,是沒有全局變量這一說法,這點我覺得很坑。


雲計算:使用Serverless你要知道他們兩個的區別


分享到:


相關文章: