騰訊雲 Severless-Express 項目開發和灰度發佈最佳實踐

本文首發於 Serverless 中文網

Serverless 應用基本概念

一個 Serverless 應用是由單個或者多個組件實例構成的。每個組件中都會有一個 serverless.yml 文件,該文件定義了組件的一些參數,這些參數在部署時用於生成實例的信息。例如 region 參數,定義了資源的所在區。

組織是在 Serverless 應用上層的概念,主要是爲了管理。例如,一個公司會有不同部門進行 Serverless 應用開發,設置不同組織名稱,方便做後期的權限管理。

示例:開發一個 express 應用,最基本的是引入 express 組件,業務中間可能會涉及到其他一些雲產品(如對象存儲 COS),所以整個應用目錄如下:

Serverless.yml 文件

serverless.yml 文件中定義了應用組織描述及組件 inputs 參數,每次部署時會根據 serverless.yml 文件中的配置信息進行資源的創建、更新和編排。

一份簡單的 serverless.yml 文件如下:

# serverless.yml

org: xxx-department #  用於記錄組織信息,默認爲您的騰訊雲 APPID
app: expressDemoApp #  應用名稱,默認爲與組件實例名稱
stage: ${env:STAGE} #  用於開發環境的隔離,默認爲 dev


component: express # (必填) 引用 component 的名稱,當前用到的是 express-tencent 組件
name: expressDemo # (必填) 組件創建的實例名稱


inputs:
  src:
    src: ./ 
    exclude:
      - .env
  region: ap-guangzhou 
  runtime: Nodejs10.15
  functionName: ${name}-${stage}-${app}-${org} #雲函數名稱
  apigatewayConf:
    protocols:
      - http
      - https
    environment: release

yml 文件中的配置信息:

操作場景

本文以 Tencent-Express 組件部署一個 Express 網站爲例,模擬 Serverless Framework 開發項目、管理項目和部署發佈上線全流程。>> 示例鏈接

流程說明

一個項目的開發上線流程大致如下:

  1. 初始化項目:將項目進行初始化。例如選擇一些開發框架和模板完成基本的搭建工作。
  2. 開發階段:對產品功能進行研發。可能涉及到多個開發者協作,開發者拉取不同的 feature 分支,開發並測試自己負責的功能模塊;最後合併到 dev 分支,聯調各個功能模塊。
  3. 測試階段:測試人員對產品功能進行測試。
  4. 發佈上線:對於已完成測試的產品功能發佈上線。由於新上線的版本可能有不穩定的風險,所以一般會進行灰度發佈,通過配置一些規則監控新版本的穩定性,等到版本穩定後,流量全部切換到新版本。

開發項目過程可能會涉及以下分支:

操作步驟

初始化項目

  1. 參考 部署 Express.js 應用 文檔,創建一個 express 項目,修改 yml 文件爲以下內容:
#serverless.yml
org: xxx-department #  用於記錄組織信息,默認爲您的騰訊雲appid
app: expressDemoApp #  應用名稱,默認爲與組件實例名稱
stage: ${env:STAGE} #  用於開發環境的隔離,默認爲dev


component: express # (必填) 引用 component 的名稱,當前用到的是 express-tencent 組件
name: expressDemo # (必填) 組件創建的實例名稱

inputs:
  src:
    src: ./ 
    exclude:
      - .env
  region: ap-guangzhou
  runtime: Nodejs10.15
  funcitonName: ${name}-${stage}-${app}-${org} #雲函數名稱
  apigatewayConf:
    protocols:
      - http
      - https
    environment: release
  1. 在項目根目錄下的 .env 文件中配置:
TENCENT_SECRET_ID=xxxxxxxxxx #您賬號的 SecretId
TENCENT_SECRET_KEY=xxxxxxxx #您賬號的 SecretKey
STAGE=prod #STAGE爲prod環境,也可以sls deploy --stage=prod 參數傳遞的方式設置
  1. 執行 sls deploy 部署成功後,訪問生成的 url 鏈接,效果如下:

  1. 創建遠程倉庫(示例鏈接),將項目代碼提交到遠程 master 分支。同時創建 testing、dev。此時三個分支的代碼在同一個版本上(假設爲版本0)。

開發與測試

背景

現在需要開發某個功能模塊。假設需要有兩位開發者:Tom、Jorge。兩位開發者分別從 dev(版本 0)上創建特性分支爲 feature1、feature2 進行研發。

Tom 開始開發 feature1。在本示例中,爲新增一個 feature.html,裏面寫文案「This is a new feature 1.」

開發

  1. 在 sls.js 文件中新增路由器配置:
// Routes
app.get(`/feature`, (req, res) => {
 res.sendFile(path.join(__dirname, 'feature.html'))
})
  1. 新增 feature.html:
<!DOCTYPE html>
<html lang="en">
 <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Serverless Component - Express.js</title>
 </head>
 <body>
  <h1>
   This is a new feature 1.
  </h1>
 </body>
</html>
  1. .env 文件中設置自己的 stage,以便在開發過程中得到獨立的運行和調試環境。例如 Tom 在 serverless.yml 的項目目錄下配置 .env 如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=feature1
  1. 執行 sls deploy 部署成功後,返回顯示如下:
region: ap-guangzhou
apigw:
  serviceId:   service-xxxxxx
  subDomain:   service-xxxxxx-123456789.gz.apigw.tencentcs.com
  environment: release
  url:         https://service-xxxxxx-123456789.gz.apigw.tencentcs.com/release/
scf:
  functionName: express-demo-feature1
  runtime:      Nodejs10.15
  namespace:    default
  lastVersion:  $LATEST
  traffic:      1

Full details: https://serverless.cloud.tencent.com/instances/expressDemoApp%3Afeature1%3AexpressDemo

10s » expressDemo » Success
  1. 訪問生成的 url (https://service-xxxxxx-123456789.gz.apigw.tencentcs.com/release/feature),效果如下:

至此,Tom 開發功能完成並自測通過。

假設同時,Jorge 同時也完成自己的特性開發,並自測通過。在本示例中,爲新增一個 feature.html,裏面寫文案「This is a new feature 2.」。

聯調

  1. 兩人把各自 feature 分支的代碼合併到 dev 分支。(可能會存在衝突需要人爲解決)

  2. 在 dev 進行聯調。聯調環境中的 .env 配置如下

TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=dev
  1. 執行 sls deploy 聯調部署後,訪問 url (ttps://service-xxxxxx-123456789.gz.apigw.tencentcs.com/release/feature),效果如下。至此聯調完成,整個功能已經開發完畢。

測試

  1. 把聯調通過的 dev 分支合併到 testing 代碼,進入測試。

  1. 測試環境中的 .env 配置如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=testing
  1. 執行 sls deploy 部署成功後,測試人員開始進行相關測試,直至功能穩定通過。

發佈上線

測試通過後,將測試代碼合併到 master 分支,準備發佈上線。

設置生產環境中的 .env 爲:

TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod

執行部署命令:

sls deploy 

至此,我們完成了一 個severless-express 項目的開發和上線發佈。

灰度發佈

操作場景

在業務進行版本更新及切換時,爲了保證線上業務穩定,建議採取灰度發佈的方式。本文以已部署的 express 項目爲例,爲您介紹灰度發佈的操作步驟。

前提條件:已完成 開發項目

操作步驟

  1. 設置生產環境中的 .env
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod
  1. 部署到線上環境 $latest,並切換 10% 的流量在 $latest 版本(90% 的流量在最後一次發佈的雲函數版本 N 上):
sls deploy --inputs.traffic=0.1 
  1. $latest 版本進行監控與觀察,等版本穩定之後把流量100%切到該版本上:
sls deploy --inputs.traffic=1.0
  1. 流量全部切換成功後,對於一個穩定版本,我們需要對它進行標記,以免後續發佈新功能時,如果遇到線上問題,方便快速回退版本。部署併發布函數版本 N+1,切換所有流量到版本 N+1:
sls deploy --inputs.publish --inputs.traffic=0 

One More Thing

立即體驗騰訊雲 Serverless Demo,領取 Serverless 新用戶禮包 👉 serverless/start

歡迎訪問:Serverless 中文網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章