乐趣区

关于腾讯云:腾讯云-SeverlessExpress-项目开发和灰度发布最佳实践

本文首发于 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-123456…,成果如下:

至此,Tom 开发性能实现并自测通过。

假如同时,Jorge 同时也实现本人的个性开发,并自测通过。在本示例中,为新增一个 feature.html,外面写文案「This is a new feature 2.」。

联调

  1. 两人把各自 feature 分支的代码合并到 dev 分支。(可能会存在抵触须要人为解决)

  1. 在 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 中文网!

退出移动版