使用版本和别名实现灰度发布

您可以为服务发布一个或多个版本,版本就相当于服务的快照,当您发布版本时,函数计算会为服务生成快照,并自动分配一个版本号与其关联。您还可以为服务的版本创建别名,指向该版本。结合服务的版本和别名,您可以轻松实现发布、回滚以及灰度发布等功能。本文介绍如何在函数计算控制台使用服务的版本和别名实现灰度发布。

视频演示

灰度发布流程

image

前提条件

步骤一:准备函数并测试

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

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,单击目标函数名称,然后在函数详情页面,单击函数代码页签。
  4. 在代码编辑器中,修改代码为查看函数版本的代码,单击部署代码,然后单击测试函数

    查看函数版本的代码示例如下。

    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. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,在版本下拉框选择新版本的版本号。

    version1

  4. 单击目标函数名称,单击函数代码页签,然后单击测试函数

    执行完成后,可以查看执行日志。从日志输出中,可以看到函数执行时的版本信息qualifier为1,解析出的versionId为1,即本次执行的函数为版本1下的函数。

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

新版本上线后,您可以创建一个别名,设置别名指向该版本。当该版本更新时,可将别名指向的版本更改为更新的版本。调用方无需关心服务的具体版本,只需要使用正确的别名即可。关于创建别名的具体步骤,请参见创建别名

别名创建完成后,您可以通过控制台验证是否执行了正确版本的函数。

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

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,单击目标函数名称。
  4. 在函数详情页面的右上方,在版本或别名下拉列表中选择新创建的别名alias1

    choose alias

  5. 单击函数代码页签,然后单击测试函数

    执行完成后,可以查看日志输出。从日志输出中,可以看到函数执行时的版本信息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,可以指示已调用的服务版本。