本文首發于 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 中文網!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/58144.html
標籤:其他
上一篇:當前知識水平下的問題復雜度分類
