本文适合:
- 想了解 Serverless 灰度发布的同学。
- 认为当前 Serverless 灰度发布配置太复杂,寻求简洁版灰度发布流程的同学。
- 想了解 Serverless Devs 组件和插件之间关系的同学。
Serverless 顾名思义就是无服务器,它是一种“来了就用,功能齐全,用完即走”的全新计算提供方式,用户无需预制或管理服务器即可运行代码,只需将代码从部署在服务器上,转换到部署到各厂商 Serverless 平台上;同时享受 Serverless 按需付费,高弹性,低运维成本,事件驱动,降本提效等优势。
灰度发布又称为金丝雀发布( Canary Deployment )。过去,矿工们下矿井前,会先放一只金丝雀到井内,如果金丝雀在矿井内没有因缺氧、气体中毒而死亡后,矿工们才会下井工作,可以说金丝雀保护了工人们的生命。
与此类似,在软件开发过程中,也有一只金丝雀,也就是灰度发布(Gray release):开发者会先将新开发的功能对部分用户开放,当新功能在这部分用户中能够平稳运行并且反馈正面后,才会把新功能开放给所有用户。金丝雀发布就是从不发布,然后逐渐过渡到正式发布的一个过程。
那么对于部署在 Serverless 平台上的函数应该怎么进行灰度发布呢?
下文将以阿里云函数计算 FC 为例,为各位展开介绍。
灰度发布有一个流程,两种方式:
Serverless 灰度发布是通过配置别名来实现的,别名可以配置灰度版本和主版本的流量比例,在调用函数时使用配置好的别名即可将流量按比例发送到相应版本。

配置灰度发布的流程如下:
Service 中发布一个新版本。
创建或更新别名,配置别名关联新版本和稳定版本,新版本即为灰度版本。
将触发器 ( Trigger ) 关联到别名。
将自定义域名 ( Custom Domain ) 关联到别名。
在调用函数中使用别名,流量会按配置比例发送到新版本和稳定版本。
阿里云控制台 web 界面:




使用 Serverless Devs cli
s cli fc version publish --region cn-hangzhou --service-name fc-deploy-service --description "test publish version"
s cli fc alias publish --region cn-hangzhou --service-name fc-deploy-service --alias-name pre --version-id 1 --gversion 3 --weight 20
需要到控制台配置
需要到控制台配置
可以看到,使用控制台或 Serverless Devs 进行灰度发布流程中的每一步,都需要用户亲自操作。并且由于配置繁多,极易出错。 除了这些弊端以外,客户困扰的另一个问题是使用灰度发布策略非常不方便。
常见的灰度发布策略有5种:
这些灰度策略中,前三项都需要配置间隔时间,而用户在控制台或者使用 Serverless Devs 工具去配置灰度都没有办法通过自动程序来配置间隔时间,不得不通过闹钟等方式提醒用户手动进行下一步灰度流程,这个体验是非常不友好的。下面我们介绍个能够帮您一键灰度发布函数的插件: FC-Canary 。
为了应对以上问题,基于 Serverless Devs 的插件 FC-Canary 应运而生,该插件可以帮助您通过 Serverless-Devs 工具和 FC组件 实现函数的灰度发布能力,有效解决灰度发布时参数配置繁杂、需要开发人员亲自操作以及可用策略少等问题。
(内容配置及注意事项-部分截图) 
详细流程请见:https://github.com/devsapp/fc-canary。
用户最短只需在 s.yaml 中增加 5 行代码代码即可开启灰度发布功能。 

此时流量变化为:20%流量到新版本,10分钟后100%流量到新版本 
此时为10%流量到新版本,90%到稳定版本 
此时流量变化为:10% 到新版本 -> (5分钟后) 30% 流量到新版本 -> (10分钟后) 100% 流量到新版本 
流量变化:40% 到新版本 -> (10分钟后) 80% 流量到新版本 -> (再 10 分钟后) 100%流量到新版本 
FC-Canary 插件支持上诉5种灰度策略,用户选择所需策略并进行简单配置,即可体验一键灰度发布。
插件对每一个里程碑都会以log的方式展现出来,给开发者足够的信心。

配置钉钉机器人即可在群中收到相关提醒,例如: 
使用 FC-Canary 插件灰度发布 nodejs 12 的函数。 代码仓库: https://github.com/devsapp/fc-canary/tree/main/example/singleFunc-http


我们采用 canaryWeight 的灰度策略:灰度发布后,50%的流量到新版本,50%的流量到旧版本。
执行发布
在terminal中输入: s deploy --use-local
查看结果
命令行输出的 log 中可以看到:
由于是第一次发布,项目中不存在历史版本,所以即使配置了灰度发布策略 ,FC-Canary 插件也会进行全量发布,即流量都发送到版本1。

执行发布
在terminal中输入: s deploy --use-local
结果
命令行输出 log 中可以看到:
第二次发布,应用了灰度发布策略,即50%流量发送到版本1, 50%的流量发送到版本2。
获取 log 中输出的 domain,访问 domain 100 次后查看控制台监控大盘。
可以看到调用了函数 100 次,错误的函数有49次,正确的函数有 100 - 49 = 51 次,正确和错误的函数都约占总调用数的 50%。
分析:函数版本 1 为正确函数,函数版本 2 为错误函数,我们的灰度配置为流量 50% 到版本 1,50% 到版本 2,所以调用过程中,错误函数和正确函数应该各占50%,图中结果符合我们的假设,这证明我们的灰度策略是成功的。
总结:我们可以发现相比使用控制台进行灰度发布,使用 FC-Canary 插件免去了用户手动创建版本、发布别名、关联触发器和管理自定义域名的麻烦,使用起来非常方便。
根据 Serverless Devs Model v0.0.1 中说明, 组件 Component: 是由 Package developer 开发并发布的符合 Serverless Package Model 规范的一段代码,通常这段代码会在应用中被引用,并在 Serverless Devs 开发者工具中被加载,并按照预定的规则进行执行某些动作。例如,将用户的代码部署到 Serverless 平台;将 Serverless 应用进行构建和打包;对 Serverless 应用进行调试等。
举个例子:
如果想要使用 Serverless Devs 管理阿里云函数计算的函数计算资源,则需要在 yaml 配置文件中声明阿里云 FC 组件,之后便可以使用阿里云 FC 组件的能力。
FC 组件可以提供管理阿里云函数计算资源的能力,包括:管理服务、函数、版本、别名 等功能。 组件地址:https://github.com/devsapp/fc
插件作为组件的补充,提供组件的原子性功能。
举个例子:

最后,欢迎大家一起来贡献更多的开源插件!
涉及链接汇总: Serverless Devs:https://github.com/Serverless-Devs/Serverless-Devs/ FC 组件地址:https://github.com/devsapp/fc FC-Canary 插件具体信息及其使用请参考:https://github.com/devsapp/fc-canary FC 函数管理:https://help.aliyun.com/document_detail/73338.htm?spm FC 函数类型:https://help.aliyun.com/document_detail/61009.htm?spm=
**
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。