使用 serverless 在騰訊雲部署第一個函數


Serverless 是各大雲服務商提供出來的一種無服務的計算資源。為什么叫無服務呢,因為如果你使用 serverless,你只需要關注應用層,而無需關心底層基礎設施,無需運維。簡而言之,serverless 並不是真的無服務,而是關於有服務的不歸你管,雲服務商幫你搞定,比如 GoogleAWS 或者 TencentCloud

關注點分離,好呀好!有了 serverless 以后只需要也只能關心業務了,這也不知是喜是憂。但你也無需過於擔心,這是對已有並且成熟的開發模式的挑戰,解決痛點有限,因此很多團隊對於替換為 serverless 也動力不足。

但是我仍然建議你學習 serverless,畢竟各大雲廠商對於 serverless 有很多免費額度可以讓你薅羊毛,對於個人開發者利好。

Serverless Framework

serverless 是基於各大雲服務商的產品,每一個雲廠商對於 serverless 都有一套自己的 API。為了能夠兼容這些 API,為了讓你的代碼 Write Once, Run Everywhere,於是 serverless framework 誕生了。

通常認為 serverless = faas + baas,然而 serverless framework 只兼容到了 faas,對於 baas,如各家提供的數據存儲服務,要做到兼容還是很難。

快速開始

serverless framework 與騰訊雲的雲函數來開始一個 hello world 吧!

$ npm install -g serverless
$ mkdir hello

$ cd hello

$ serverless create --template tencent-nodejs --name hello

Serverless: Generating boilerplate...
_______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.67.0
-------'

Serverless: Successfully generated boilerplate for template: "tencent-nodejs"

此時在 hello 目錄自動生成了關於 serverless 在騰訊雲的 hello, world 版。由於缺少關於騰訊雲的 plugin 需要首先裝包

$ npm i

簡述

serverless.yaml

serverless.yamlserverless framework 的核心,是一個 sls 服務的資源配置文件。如果把 sls 等同於 faas + baas,那么 faasbaas 的配置都在這里。

service: hello

# 雲廠商的信息,如 aws/google/aliyun/tencent
provider:
  name: tencent
  runtime: Nodejs8.9    # Nodejs 版本號
  credentials: ~/credentials

plugins:
  - serverless-tencent-scf  # 騰訊雲對 sls 的適配

functions:
  hello_world:          # 函數名
    handler: index.main_handler # 該函數所調用的函數

index.js

exports.main_handler = (event, context, callback) => {
  callback(null, 'Hello World');
};

index.js 中是 faas 中的核心,function。在 callback 中來回調你所需的數據。

部署

使用 sls deploy 打包資源並部署到騰訊雲,此時需要你在騰訊雲的憑證信息。你可以通過與騰訊雲綁定的微信掃碼授權,相比其他廠商需要手動維護憑證信息,還是很方便的。

# 其中 sls 是 serverless 的簡寫
$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading service package to cos[sls-cloudfunction-ap-guangzhou]. hello-dev-KamjFZ-2020-04-15-21-47-11.zip
Serverless: Uploaded package successful /Users/xiange/Documents/hello/.serverless/hello.zip
Serverless: Creating function hello-dev-hello_world
Serverless: Updating code...
Serverless: Updating configure...
Serverless: Created function hello-dev-hello_world
Serverless: Setting tags for function hello-dev-hello_world
Serverless: Creating trigger for function hello-dev-hello_world
Serverless: Deployed function hello-dev-hello_world successful
Serverless: Service Information

service: hello
stage: dev
region: ap-guangzhou
stack: hello-dev
resources: 1
functions:   hello_world: hello-dev-hello_world

# 如果需要部署到生產環境
$ sls deploy --stage  production

稍等一分鍾,就可以看到部署成功的信息。

函數調用

本地函數可以很簡單地通過調用函數名來執行,serverless 也可以通過 sls invoke 來調用函數。

$ sls invoke --function hello_world

Serverless:

"Hello World"

----------
Log:
START RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac
Event RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac

END RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac
Report RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac Duration:64ms Memory:128MB MemUsage:21.8125MB

日志與監控

serverless 號稱 noops,很大程度上是由於少了 logmetrics 的基礎設施搭建。使用 sls logssls metrics 可以獲取相關信息,但是豐富度及可定制化就完全不如 kubernetes 運維了。

$ sls logs
Serverless: {
  "FunctionName": "hello-dev-hello_world",
  "RetMsg": "\"Hello World\"",
  "RequestId": "fc72271f-eede-4dbb-8315-f24045597db7",
  "StartTime": "2020-04-15 21:48:55",
  "RetCode": 0,
  "InvokeFinished": 1,
  "Duration": 1,
  "BillDuration": 1,
  "MemUsage": 74870780,
  "Log": "START RequestId: fc72271f-eede-4dbb-8315-f24045597db7\nEvent RequestId: fc72271f-eede-4dbb-8315-f24045597db7\n2020-04-15T13:48:55.344Z\tfc72271f-eede-4dbb-8315-f24045597db7\t{}\n \nEND RequestId: fc72271f-eede-4dbb-8315-f24045597db7\nReport RequestId: fc72271f-eede-4dbb-8315-f24045597db7 Duration:1ms Memory:128MB MemUsage:71.402344MB",
  "Level": "",
  "Source": ""
}
Serverless: {
  "FunctionName": "hello-dev-hello_world",
  "RetMsg": "\"Hello World\"",
  "RequestId": "62b5760e-5545-4316-bef6-423d4b568396",
  "StartTime": "2020-04-15 21:48:45",
  "RetCode": 0,
  "InvokeFinished": 1,
  "Duration": 2,
  "BillDuration": 2,
  "MemUsage": 74870780,
  "Log": "START RequestId: 62b5760e-5545-4316-bef6-423d4b568396\nEvent RequestId: 62b5760e-5545-4316-bef6-423d4b568396\n2020-04-15T13:48:47.995Z\t62b5760e-5545-4316-bef6-423d4b568396\t{}\n \nEND RequestId: 62b5760e-5545-4316-bef6-423d4b568396\nReport RequestId: 62b5760e-5545-4316-bef6-423d4b568396 Duration:2ms Memory:128MB MemUsage:71.402344MB",
  "Level": "",
  "Source": ""
}

$ sls metrics
Serverless: Service wide metrics
2020-04-14 22:09:45 - 2020-04-15 22:09:45

Service:
  Invocations: 5
  Outflows: 0
  Errors: 0
  Duration(avg.): 7.3 ms

Functions:
  hello-dev-hello_world:
    Invocations: 5
    Outflows: 0
    Errors: 0
    Duration(avg.): 7.3 ms

小結

從本篇文章,可以大概知道如何在騰訊雲初建一個 serverless 函數,並且知道了如何執行並且調用它。而關於 sls 的原理,如服務編排以及容器化,可以再繼續深入學習。

One More Thing

3 秒你能做什么?喝一口水,看一封郵件,還是 —— 部署一個完整的 Serverless 應用?

復制鏈接至 PC 瀏覽器訪問:https://serverless.cloud.tencent.com/deploy/express

3 秒極速部署,立即體驗史上最快的 Serverless HTTP 實戰開發!

傳送門:

歡迎訪問:Serverless 中文網,您可以在 最佳實踐 里體驗更多關於 Serverless 應用的開發!


推薦閱讀:《Serverless 架構:從原理、設計到項目實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM