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

视频演示

灰度发布流程

灰度发布

前提条件

步骤一:准备函数并测试

当您初次创建一个服务以及该服务下的函数时,该服务的版本号为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版本下的函数。

步骤二:发布版本并测试

当LATEST版本的服务稳定时,就可以发布该版本的服务,让稳定的版本来服务线上的请求。具体操作,请参见发布版本。新版本发布后,您可以通过控制台执行新版本下的函数。

  1. 服务列表页面,单击目标服务。
  2. 函数管理页面,从版本下拉框选择新版本的版本号。
    version1
  3. 单击目标函数名称,单击函数代码页签,然后单击测试函数
    执行完成后,可以查看执行日志。从日志输出中,可以看到函数执行时的版本信息qualifier为1,解析出的versionId为1,即本次执行的函数为版本1下的函数。

步骤三:使用别名切换流量

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

本文以别名alias1指向版本1为例。

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

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

  1. 发布新版本2。具体操作,请参见发布版本
    发布完成后,您可以在版本列表中查看新发布的版本。
  2. 在左侧导航栏,单击别名管理
  3. 在别名列表中找到指向版本1的别名alias1,在其右侧操作列单击编辑
  4. 在编辑服务的别名面板,将新版本2设置为灰度版本,设置灰度类型,然后单击确定
    • 按百分比随机灰度

      需填写灰度版本权重,如下图所示。

      edit-alias1

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

    • 按指定规则灰度
      说明 按指定规则灰度目前仅支持HTTP函数。
      edit-alias1

      本示例中,仅当参数key取值为x-test-uid时,将请求消息路由至灰度版本。

    创建灰度发布规则的参数说明如下:
    参数名称 参数说明
    名称 要创建的别名的名称。
    主版本 设置别名的主版本。
    启用灰度版本 是否启用灰度版本。
    灰度版本 设置别名的灰度版本。
    灰度类型 根据不同的灰度策略分为按百分比随机灰度按指定规则灰度
    • 按百分比随机灰度:设置一定的权重切换流量到灰度版本。
    • 按指定规则灰度:设置一定的规则,并按照指定的规则模式进行灰度发布。
    灰度版本权重 当您的灰度类型选择为按百分比随机灰度时,需配置此参数。

    表示切换流量至灰度版本的百分比。例如,设置该参数的值为5%,函数计算将分配5%的流量到灰度版本,95%的流量到主版本。

    规则模式 当您的灰度类型选择为按指定规则灰度时,需配置此参数。
    表示对设置的规则的选择模式,取值如下:
    • 同时满足下列规则
    • 满足下列任意规则
    规则列表 当您的灰度类型选择为按指定规则灰度时,需配置此参数。
    表示具体的规则内容,包含以下三部分:
    • 参数类型:取值包含Header、Cookie和Query。
    • 参数:控制灰度发布的参数名。
    • 条件:计算条件。函数计算参数的实际值与您填写的参数值按照您设置的条件进行计算,如果满足条件,则本条请求被路由至灰度版本。包含以下枚举值:
      • =、!=、>、<、>=、<=:运算符比较条件。例如,设置条件=,表示仅当请求参数实际值等于设置的参数时,将本条请求路由至灰度版本。
      • in:字符串匹配条件,仅当请求参数实际值包含在设置的参数以内时,将本条请求路由至灰度版本。
      • 值分布百分比:表示按照指定参数值的特定百分比灰度发布。例如,设置参数类型为Header,参数user-id20,表示根据HTTP请求Headeruser-id值的分布,其中20%的请求路由至灰度版本。
    • :控制灰度发布的参数值。

    您可以单击下方的+添加规则添加更多其他规则。

    高级选项
    预留实例灰度比例 用于控制预留模式的灰度实例比例。当您预留的实例数量大于1时,会按照该参数设置的比例生成预留模式的实例数量,否则,按照默认的1%生成预留模式的实例数量。
    注意 仅当您预留的实例数量大于1时,该参数的值有效。
    待灰度版本运行稳定后,您可以将线上流量全部切换到新版本2

常见问题

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

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

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