灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。
Serverless 应用的灰度发布是配置云函数别名的流量规则,针对别名中两个不同版本的云函数进行流量规则配置。Serverless Framework 支持的两种方式别名配置:默认别名和自定义别名。
默认别名是配置云函数的 $default(默认流量)别名。该别名中固定有两个云函数版本,一个为 $latest 版本,一个为最后一次函数发布的版本。部署时配置的 traffic 参数为 $latest 版本流量占比,默认另一部分流量切到当前云函数最后一次发布的版本。
每次上线一个新功能,执行sls deploy
会部署到 $latest 版本上。我们将切部分流量在 $latest 版本上进行观察,然后逐步将流量切到 $latest 版本。当流量切到100%时,我们会固化这个版本,并将流量全部切到固化后的版本。
说明:旧版本命令为
sls deploy --inputs.key=value
,Serverless CLI V3.2.3 后命令统一格式为sls deploy --inputs key=value
,旧版本命令在新版本 Serverless CLI 中不可用,升级 Serverles CLI 的用户请使用新版本命令。
部署时发布项目下所有函数版本:
sls deploy --inputs publish=true
部署后切换20%流量到 $latest 版本:
sls deploy --inputs traffic=0.2
当一个功能测试完毕,需要进行灰度发布,操作如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod
sls deploy --inputs traffic=0.1
sls deploy --inputs traffic=1.0
sls deploy --inputs publish=true traffic=0
自定义别名可以通过命令创建别名,配置指定两个云函数版本配置流量比。
使用自定义别名进行灰度发布时,先将新功能发布到一个新版本上,然后修改别名配置,切部分流量在该版本上进行观察,最后逐步将流量切到该版本。
自定义别名提供了灵活的版本切换,配置相对于默认别名的方式更复杂,适用于对灰度发布能力要求比较高的业务场景。目前自定义别名只支持云函数组件。
不部署直接给函数 my-function 发版本:
sls publish-ver --inputs function=my-function
给云函数 my-function 创建别名 routing-alias,路由规则为版本1流量为50%,版本2流量为50%:
sls create-alias --inputs name=routing-alias function=my-function version=1
config='{"weights":{"2":0.5}}'
更新云函数 my-function 别名 routing-alias 的流量规则为版本1流量为10%,版本2流量为90%:
sls update-alias --inputs name=routing-alias function=my-function version=1 config='{"weights":{"2":0.9}}'
列举云函数 my-function 别名 routing-alias:
sls list-alias --inputs function=my-function
删除云函数 my-function 的别名 routing-alias:
sls delete-alias --inputs name=routing-alias function=my-function
当一个功能测试完毕,需要进行灰度发布,操作如下:
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxx
STAGE=prod
sls create-alias --inputs function=my-function name=alias-prod version=n config='{"weights":{"$LATEST":0}}'
配置 my-function 函数的 serverless.yml 中触发器对应的别名引用:
events: # 触发器
- timer: # 定时触发器
name: #触发器名称,默认timer-${name}-${stage}
parameters:
qualifier: alias-prod #配置别名为alias-prod
cronExpression: '*/5 * * * *' # 每5秒触发一次
enable: true
argument: argument # 额外的参数
部署到线上环境 $latest,并发布该新版本(假设函数名为 my-function,发布后的新版本为 N+1):
sls deploy
sls publish-ver --inputs function=my-function
sls update-alias --inputs function=my-function name=alais-prod version=n config='{"weights":{"n+1":0.1}}'
sls update-alias --inputs function=my-function name=alais-prod version=n config='{"weights":{"n+1":1}}'
12月的设计圈实用干货工具大合集来了!年底这波干货汇集了不少颇为有趣的工具,...
海外服务器租用 需要特别注重的几点要求,就以 香港服务器租用 为例! 1. 租用香...
本文转载自微信公众号「BAT的乌托邦」,作者YourBatman。转载本文请联系BAT的乌...
作者 | 同润、归雨、熊兮 来源 | 阿里技术公众号 一 概述 7月8日,中文语言理解...
近年来,随着全球信息化和数字化程度的不断加深,人类的生产生活方式正在发生深刻...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
调用GetFunctionAsyncInvokeConfig接口查询一个服务下某个函数的异步调用配置。 ...
Python已成为编程语言的首...
本章主要为您介绍 如何绑定虚拟MFA 、 如何解绑虚拟MFA ,以及IAM用户手机丢失或...
使用场景 您可以使用 镜像服务 中的私有镜像作为边缘私有镜像的来源。 镜像服务...