您可以为函数发布一个或多个版本,版本就相当于函数的快照,当您发布版本时,函数计算会为您的函数生成快照,并自动分配一个版本号与其关联。您还可以为函数的版本创建别名,指向该版本。结合函数的版本和别名,您可以轻松实现发布、回滚以及灰度发布等功能。
灰度发布流程
前提条件
步骤一:准备函数并测试
当您初次创建一个函数时,该函数的版本号为LATEST。您可以调试LATEST版本下的函数直至版本稳定运行。您可以通过控制台执行LATEST版本下的函数。
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页面,单击代码页签。
在代码编辑器中,修改代码为查看函数版本的代码,单击部署代码,然后单击测试函数。
查看函数版本的代码示例如下。
module.exports.handler = function(eventBuf, context, callback) { var qualifier = context['service']['qualifier'] var versionId = context['service']['versionId'] console.log('Qualifier from context:', qualifier); console.log('VersionId from context: ', versionId); callback(null, qualifier); };
# -*- coding: utf-8 -*- def handler(event, context): qualifier = context.service.qualifier versionId = context.service.version_id print('Qualifier from context:' + qualifier) print('VersionId from context:' + versionId) return 'hello world'
<?php function handler($event, $context) { $qualifier = $context["service"]["qualifier"]; $versionId = $context["service"]["versionId"]; print($qualifier); print($versionId); return "hello world"; }
using System; using System.IO; using Aliyun.Serverless.Core; using Microsoft.Extensions.Logging; namespace Desktop { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } class App { public string Handler(Stream input, IFcContext context) { ILogger logger = context.Logger; var qualifier = context.ServiceMeta.Qualifier; var versionId = context.ServiceMeta.VersionId; logger.LogInformation("Qualifier from context: {0}", qualifier); logger.LogInformation("versionId from context: {0}", versionId); return "hello word"; } } }
执行完成后,可以查看日志输出。从日志输出中,可以看到表示版本信息的字段qualifier的值为LATEST,即本次执行的函数为LATEST版本下的函数。
步骤二:发布版本并测试
当LATEST版本的函数稳定时,就可以发布该版本的函数,使用稳定的版本服务线上的请求。具体操作,请参见发布版本。
新版本发布后,您可以通过控制台执行新版本下的函数。
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页面,选择版本页签,单击目标版本。
在目标版本页面,单击代码页签,然后单击测试函数。
执行完成后,可以查看执行日志。从日志输出中,可以看到函数执行时的版本信息qualifier为1,解析出的versionId为1,即本次执行的函数为版本1下的函数。
步骤三:使用别名切换流量
新版本上线后,您可以创建一个别名,设置别名指向该版本。当该版本更新时,可将别名指向的版本更改为更新的版本。调用方无需关心函数的具体版本,只需要使用正确的别名即可。关于创建别名的具体步骤,请参见创建别名。
别名创建完成后,您可以通过控制台验证是否执行了正确版本的函数。
本文以别名alias1指向版本1为例。
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页面,选择别名页签,单击目标别名。
在目标别名页面,单击测试页签,然后单击测试函数。
执行完成后,可以查看日志输出。从日志输出中,可以看到函数执行时的版本信息qualifier为alias1,解析出的versionId为1,即本次执行的函数为别名alias1下的函数,该别名指向版本1。
新版本开发完成后,需要使用灰度版本帮助新版本稳定发布。
发布新版本时必须保证相对上一此版本发布,函数的配置或代码发生了变更,否则无法发布新版本。
发布新版本2。具体操作,请参见发布版本。
发布完成后,可在版本列表中查看新发布的版本。
在函数详情页面,选择别名页签,单击目标别名右侧操作列的编辑。
在编辑函数的别名面板,将新版本2设置为灰度版本,设置灰度版本权重,然后单击确定。
待灰度版本运行稳定后,可以将线上流量全部切换到新版本2。
常见问题
如何确认被调用的函数的版本?
使用灰度发布功能时,函数计算按照您指定的权重来分配流量。您可以通过以下方式来确定被调用的函数的版本:
通过context入参确定
每次函数调用,context入参的参数中会包括qualifier和versionId两个字段。
qualifier:调用函数时传入的版本信息,可以是版本号,也可以是别名。
versionId:函数执行时根据qualifier解析出的具体版本号。
通过同步函数调用响应确定
同步函数调用的响应包含x-fc-invocation-function-version Header,可以指示已调用的函数版本。