全部產品
Search
文件中心

Function Compute:使用版本和別名實現灰階發布

更新時間:Jul 06, 2024

您可以為服務發布一個或多個版本,版本就相當於服務的快照,當您發布版本時,Function Compute會為服務產生快照,並自動分配一個版本號碼與其關聯。您還可以為服務的版本建立別名,指向該版本。結合服務的版本和別名,您可以輕鬆實現發布、復原以及灰階發布等功能。本文介紹如何在Function Compute控制台使用服務的版本和別名實現灰階發布。

灰階發布流程

前提條件

步驟一:準備函數並測試

當您初次建立一個服務以及該服務下的函數時,該服務的版本號碼為LATEST。您可以調試LATEST版本下的函數直至版本穩定運行。您可以通過控制台執行LATEST版本下的函數。

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  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. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,在版本下拉框選擇新版本的版本號碼。

    version1

  4. 單擊目標函數名稱,單擊函數代碼頁簽,然後單擊測試函數

    執行完成後,可以查看執行日誌。從日誌輸出中,可以看到函數執行時的版本資訊qualifier為1,解析出的versionId為1,即本次執行的函數為版本1下的函數。

步驟三:使用別名切換流量

新版本上線後,您可以建立一個別名,設定別名指向該版本。當該版本更新時,可將別名指向的版本更改為更新的版本。調用方無需關心服務的具體版本,只需要使用正確的別名即可。關於建立別名的具體步驟,請參見建立別名

別名建立完成後,您可以通過控制台驗證是否執行了正確版本的函數。

本文以別名alias1指向版本1為例。

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  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%,Function Compute將分配5%的流量到灰階版本,95%的流量到主要版本。

    規則模式

    灰階類型按指定規則灰階時,需配置此參數。

    表示對設定的規則的選擇模式,取值如下:

    • 同時滿足下列規則

    • 滿足下列任意規則

    規則列表

    灰階類型按指定規則灰階時,需配置此參數。

    表示具體的規則內容,包含以下三部分:

    • 參數類型:取值包含Header、Cookie和Query。

    • 參數:控制灰階發布的參數名。

    • 條件:計算條件。Function Compute參數的實際值與您填寫的參數值按照您設定的條件進行計算,如果滿足條件,則本條請求被路由至灰階版本。包含以下枚舉值:

      • =、!=、>、<、>=、<=:運算子比較條件。例如,設定條件=,表示僅當請求參數實際值等於設定的參數時,將本條請求路由至灰階版本。

      • in:字串匹配條件,僅當請求參數實際值包含在設定的參數以內時,將本條請求路由至灰階版本。

      • 值分布百分比:表示按照參數值的特定百分比灰階發布。例如,設定參數類型為Header,參數user-id20,表示根據HTTP請求Headeruser-id的具體分布,取其中20%分布值對應的請求路由至灰階版本。

    • :控制灰階發布的參數值。

    單擊下方的+添加規則,可以添加更多其他規則。

    進階選項

    預留執行個體灰階比例

    用於控制預留模式的灰階執行個體比例。當預留的執行個體數量大於1時,會按照該參數設定的比例產生預留模式的執行個體數量,否則,按照預設的1%產生預留模式的執行個體數量。

    重要

    僅當您預留的執行個體數量大於1時,該參數的值有效。

    待灰階版本運行穩定後,可以將線上流量全部切換到新版本2

常見問題

如何確定被調用的服務的版本?

使用灰階發布功能時,Function Compute按照您指定的權重來分配流量。您可以通過以下方式來確定被調用的服務的版本:

  • 通過context入參確定

    每次函數調用,context入參的service參數中會包括qualifierversionId兩個欄位。

    • qualifier:調用函數時傳入的版本資訊,可以是版本號碼,也可以是別名。

    • versionId:函數執行時根據qualifier解析出的具體版本號碼。

  • 通過同步函數調用響應確定

    同步函數調用的響應包含x-fc-invocation-service-version Header,可以指示已調用的服務版本。