本示例介绍如何在函数计算控制台使用服务的版本和别名实现灰度发布功能。

灰度发布流程

灰度发布

前提条件

准备函数

当您初次创建一个服务以及该服务下的函数时,该服务的版本号为LATEST。您可以调试LATEST版本下的函数直至版本稳定运行。您可以通过控制台执行LATEST版本下的函数。

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 找到目标服务下的目标函数,单击函数名称。
  5. 单击函数代码页签,在您的函数代码中添加查看函数版本的代码,然后单击测试函数
    查看函数版本的代码示例如下。
    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版本下的函数。log

发布版本

当LATEST版本的服务稳定时,就可以发布该版本的服务,让稳定的版本来服务线上的请求。具体操作,请参见发布版本。新版本发布后,您可以通过控制台执行新版本下的函数。version1
  1. 服务列表页面,单击目标服务。
  2. 函数管理页面,从版本下拉框选择新版本的版本号。
    version1
  3. 单击目标函数名称,单击函数代码页签,然后单击测试函数
    执行完成后,可以查看执行日志。从日志输出中,可以看到函数执行时的版本信息qualifier为1,解析出的versionId为1,即本次执行的函数为版本1下的函数。log1

使用别名切换流量

新版本上线后,您可以创建一个别名,设置别名指向该版本。当该版本更新时,只需要将别名指向的版本更改为更新的版本。调用方无需关心服务的具体版本,只需要使用正确的别名即可。关于创建别名的具体步骤,请参见创建别名。别名创建完成后,您可以通过控制台验证是否执行了正确版本的函数。

  1. 服务列表页面,单击目标服务。
  2. 在左侧导航栏,单击函数管理,找到目标函数并单击目标函数。
  3. 在函数详情页面,从版本或别名下拉列表中选择新创建的别名。
    choose alias
  4. 单击函数代码页签,然后单击测试函数
    执行完成后,可以查看日志输出。从日志输出中,可以看到函数执行时的版本信息qualifieralias1,解析出的versionId1,即本次执行的函数为别名alias1下的函数,该别名指向版本1alias1

当新版本开发完成后,需要使用灰度版本帮助新版本的稳定发布。

  1. 发布新版本。具体操作,请参见发布版本
    发布完成后,您可以在版本列表中查看新发布的版本。version2
  2. 在左侧导航栏,单击别名管理
  3. 在别名列表中找到指向版本1的别名alias1,在其右侧操作列单击编辑
    alias-edit
  4. 在编辑服务的别名面板,将新版本2设置为灰度版本,并填写灰度版本的权重。然后单击确定
    灰度权重

    设置完成后,您可以调用别名alias1验证是否已将部分线上流量切换到新版本2。本示例中,共调用别名alias1执行函数10次,结果中有3次调用版本了2,7次调用了版本1

    alias1-version1alias1-version2
    您也可以待灰度版本运行稳定后,将线上流量全部切换到新版本2

常见问题

如何确定被调用的服务的版本?

使用灰度发布功能时,函数计算按照您指定的权重来分配流量,您可以通过以下方式来确定被调用的服务的版本:
  • 通过context入参确定
    每次函数调用,context入参的service参数中会包括qualifierversionId两个字段。
    • qualifier:调用函数时传入的版本信息,可以是版本号,也可以是别名。
    • versionId:函数执行时根据qualifier解析出的具体版本号。
  • 通过同步函数调用响应确定

    同步函数调用的响应包含x-fc-invocation-service-version header,可以指示已调用的服务版本。