本文首發於 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 開發項目、管理項目和部署發布上線全流程。>> 示例鏈接
流程說明
一個項目的開發上線流程大致如下:
- 初始化項目:將項目進行初始化。例如選擇一些開發框架和模板完成基本的搭建工作。
- 開發階段:對產品功能進行研發。可能涉及到多個開發者協作,開發者拉取不同的 feature 分支,開發並測試自己負責的功能模塊;最后合並到 dev 分支,聯調各個功能模塊。
- 測試階段:測試人員對產品功能進行測試。
- 發布上線:對於已完成測試的產品功能發布上線。由於新上線的版本可能有不穩定的風險,所以一般會進行灰度發布,通過配置一些規則監控新版本的穩定性,等到版本穩定后,流量全部切換到新版本。
開發項目過程可能會涉及以下分支:
操作步驟
初始化項目
- 參考 部署 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
- 在項目根目錄下的
.env 文件
中配置:
TENCENT_SECRET_ID=xxxxxxxxxx #您賬號的 SecretId
TENCENT_SECRET_KEY=xxxxxxxx #您賬號的 SecretKey
STAGE=prod #STAGE為prod環境,也可以sls deploy --stage=prod 參數傳遞的方式設置
- 執行
sls deploy
部署成功后,訪問生成的 url 鏈接,效果如下:
- 創建遠程倉庫(示例鏈接),將項目代碼提交到遠程 master 分支。同時創建 testing、dev。此時三個分支的代碼在同一個版本上(假設為版本0)。
開發與測試
背景
現在需要開發某個功能模塊。假設需要有兩位開發者:Tom、Jorge。兩位開發者分別從 dev(版本 0)上創建特性分支為 feature1、feature2 進行研發。
Tom 開始開發 feature1。在本示例中,為新增一個 feature.html,里面寫文案「This is a new feature 1.」
開發
- 在 sls.js 文件中新增路由器配置:
// Routes
app.get(`/feature`, (req, res) => {
res.sendFile(path.join(__dirname, 'feature.html'))
})
- 新增 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>
- 在
.env
文件中設置自己的 stage,以便在開發過程中得到獨立的運行和調試環境。例如 Tom 在 serverless.yml 的項目目錄下配置 .env 如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=feature1
- 執行
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
- 訪問生成的 url (https://service-xxxxxx-123456789.gz.apigw.tencentcs.com/release/feature),效果如下:
至此,Tom 開發功能完成並自測通過。
假設同時,Jorge 同時也完成自己的特性開發,並自測通過。在本示例中,為新增一個 feature.html,里面寫文案「This is a new feature 2.」。
聯調
-
兩人把各自 feature 分支的代碼合並到 dev 分支。(可能會存在沖突需要人為解決)
-
在 dev 進行聯調。聯調環境中的
.env
配置如下
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=dev
- 執行 sls deploy 聯調部署后,訪問 url (ttps://service-xxxxxx-123456789.gz.apigw.tencentcs.com/release/feature),效果如下。至此聯調完成,整個功能已經開發完畢。
測試
- 把聯調通過的 dev 分支合並到 testing 代碼,進入測試。
- 測試環境中的 .env 配置如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=testing
- 執行 sls deploy 部署成功后,測試人員開始進行相關測試,直至功能穩定通過。
發布上線
測試通過后,將測試代碼合並到 master 分支,准備發布上線。
設置生產環境中的 .env
為:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod
執行部署命令:
sls deploy
至此,我們完成了一 個severless-express
項目的開發和上線發布。
灰度發布
操作場景
在業務進行版本更新及切換時,為了保證線上業務穩定,建議采取灰度發布的方式。本文以已部署的 express 項目為例,為您介紹灰度發布的操作步驟。
前提條件:已完成 開發項目。
操作步驟
- 設置生產環境中的
.env
:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod
- 部署到線上環境
$latest
,並切換 10% 的流量在$latest
版本(90% 的流量在最后一次發布的雲函數版本 N 上):
sls deploy --inputs.traffic=0.1
- 對
$latest
版本進行監控與觀察,等版本穩定之后把流量100%切到該版本上:
sls deploy --inputs.traffic=1.0
- 流量全部切換成功后,對於一個穩定版本,我們需要對它進行標記,以免后續發布新功能時,如果遇到線上問題,方便快速回退版本。部署並發布函數版本 N+1,切換所有流量到版本 N+1:
sls deploy --inputs.publish --inputs.traffic=0
One More Thing
立即體驗騰訊雲 Serverless Demo,領取 Serverless 新用戶禮包 👉 serverless/start
歡迎訪問:Serverless 中文網!