您可以為服務發布一個或多個版本,版本就相當于服務的快照,當您發布版本時,函數計算會為服務生成快照,并自動分配一個版本號與其關聯。您還可以為服務的版本創建別名,指向該版本。結合服務的版本和別名,您可以輕松實現發布、回滾以及灰度發布等功能。本文介紹如何在函數計算控制臺使用服務的版本和別名實現灰度發布。
視頻演示
灰度發布流程
前提條件
步驟一:準備函數并測試
當您初次創建一個服務以及該服務下的函數時,該服務的版本號為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為例。
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數名稱。
在函數詳情頁面的右上方,在版本或別名下拉列表中選擇新創建的別名alias1。
單擊函數代碼頁簽,然后單擊測試函數。
執行完成后,可以查看日志輸出。從日志輸出中,可以看到函數執行時的版本信息qualifier為alias1,解析出的versionId為1,即本次執行的函數為別名alias1下的函數,該別名指向版本1。
新版本開發完成后,需要使用灰度版本幫助新版本的穩定發布。
發布新版本2。具體操作,請參見發布版本。
發布完成后,可在版本列表中查看新發布的版本。
在左側導航欄,單擊別名管理。
在別名列表中找到指向版本1的別名alias1,在其操作列,單擊編輯。
在編輯服務的別名面板,將新版本2設置為灰度版本,設置灰度類型,然后單擊確定。
按百分比隨機灰度
需填寫灰度版本權重,如下圖所示。
設置完成后,調用別名alias1驗證是否已將部分線上流量切換到新版本2。本示例中,如果共調用別名alias1執行函數10次,結果中將有3次調用版本2,7次調用版本1。
按指定規則灰度
說明按指定規則灰度目前僅支持HTTP函數。
本示例中,僅當參數key取值為
x-test-uid
時,將請求消息路由至灰度版本。
創建灰度發布規則的參數說明如下。
參數名稱
參數說明
名稱
要創建的別名的名稱。
主版本
設置別名的主版本。
啟用灰度版本
是否啟用灰度版本。
灰度版本
設置別名的灰度版本。
灰度類型
根據不同的灰度策略分為按百分比隨機灰度和按指定規則灰度。
按百分比隨機灰度:設置一定的權重切換流量到灰度版本。
按指定規則灰度:設置一定的規則,并按照指定的規則模式進行灰度發布。
灰度版本權重
當灰度類型為按百分比隨機灰度時,需配置此參數。
表示切換流量至灰度版本的百分比。例如,設置該參數的值為5%,函數計算將分配5%的流量到灰度版本,95%的流量到主版本。
規則模式
當灰度類型為按指定規則灰度時,需配置此參數。
表示對設置的規則的選擇模式,取值如下:
同時滿足下列規則
滿足下列任意規則
規則列表
當灰度類型為按指定規則灰度時,需配置此參數。
表示具體的規則內容,包含以下三部分:
參數類型:取值包含Header、Cookie和Query。
參數:控制灰度發布的參數名。
條件:計算條件。函數計算將參數的實際值與您填寫的參數值按照您設置的條件進行計算,如果滿足條件,則本條請求被路由至灰度版本。包含以下枚舉值:
=、!=、>、<、>=、<=
:運算符比較條件。例如,設置條件為=
,表示僅當請求參數實際值等于設置的參數值時,將本條請求路由至灰度版本。in
:字符串匹配條件,僅當請求參數實際值包含在設置的參數值以內時,將本條請求路由至灰度版本。值分布百分比
:表示按照參數值的特定百分比灰度發布。例如,設置參數類型為Header,參數為user-id
,值為20
,表示根據HTTP請求Headeruser-id
的具體分布,取其中20%分布值對應的請求路由至灰度版本。
值:控制灰度發布的參數值。
單擊下方的+添加規則,可以添加更多其他規則。
高級選項
預留實例灰度比例
用于控制預留模式的灰度實例比例。當預留的實例數量大于1時,會按照該參數設置的比例生成預留模式的實例數量,否則,按照默認的1%生成預留模式的實例數量。
重要僅當您預留的實例數量大于1時,該參數的值有效。
待灰度版本運行穩定后,可以將線上流量全部切換到新版本2。
常見問題
如何確定被調用的服務的版本?
使用灰度發布功能時,函數計算按照您指定的權重來分配流量。您可以通過以下方式來確定被調用的服務的版本:
通過context入參確定
每次函數調用,context入參的service參數中會包括qualifier和versionId兩個字段。
qualifier:調用函數時傳入的版本信息,可以是版本號,也可以是別名。
versionId:函數執行時根據qualifier解析出的具體版本號。
通過同步函數調用響應確定
同步函數調用的響應包含x-fc-invocation-service-version Header,可以指示已調用的服務版本。