腾讯云函数的版本管理

June 27, 2020

 

前段时间体验了下腾讯云的云函数,试着将一个古老的cgi迁移到云函数,由于特性比较简单,整体还算顺利。

云函数的概念比较多,新接入的开发者需要了解许多概念,如果是简单的功能接入还是挺方便的,跟着文档操作一遍就行了。但许多文档还不是很深入。比如如何在golang云函数操作HTTP Header使其返回302,这个就研究了挺久。

如果在生产环境使用腾讯云函数相关的能力来进行版本的迭代,官方并没有给出标准解决方案。大致摸索了一下云函数、云网关的相关能力,介绍如下。

云函数

通常一个逻辑服务server对应一个云函数。后续相关需求的迭代,对应的逻辑服务也会有频繁的版本更新发布。

云函数版本

  • 版本概念跟git/svn仓库类似,但默认只有$Latest版本可以重新上传代码,所以:
    • 建议$Lastest用于开发,其他版本用于(预)发布。
    • 当存在多人并行开发时,建议建立个人云函数,以及对应的云网关,避免相关影响。
  • 功能特性上线时应该发布到新的版本。只能使用 $LATEST 的配置和代码生成新版本,代码版本发布后不可变更。

别名

  • 大部分代码(云函数)的版本特性迭代,是属于云函数内部逻辑的变更,应该不涉及到云网关路由的变更,所以在云函数和云网关之间引入了别名的概念,降低发布成本。
    • 云网关也分多套环境,如果每次逻辑服务的变更需要调整每个云网关下对应函数的版本,这个会是个比较大的发布成本。
  • 别名也可以起到流量控制的左右。同一个函数版本可以特定路由规则路由到不同的版本。
  • 针对不同的版本可以设置几个固定的别名用作路由(流量)控制。建议根据环境的数量,创建对应的别名。如test/release/prepub三个不同的别名,分别用作云网关的三套环境。后续代码迭代变更只需要调整别名的具体路由即可。不涉及网关调整。
  • 存在一个默认别名DEFAULT,可以用作开发环境。

云网关

云网关属于触发器的一种,用于提供对外的服务API,定位类似接入层。还有其他类型的触发器用作定时任务等场景。此处只讨论云网关触发器+云函数的版本控制。

API编辑

  • 云网关下存在多个API(云函数),每个函数的路径不同。也可以在云函数中二次路由,减少维护成本。
  • 在编辑中可以针对API设置默认参数、参数校验、默认返回值等。

环境

  • 每个云网关存在三套独立环境:test/release/prepub,分别对应不同的path。
  • 每套环境可以切换不同的云网关版本,一般在无新增API的情况下可以不用变更云网关。
  • 三套环境的发布流程也是相互隔离的。
  • 理论上新增API在历史云网关中是无法路由的。【未验证】

云网关的版本

  • 每套环境有不同的云网关版本,每个版本的发布流程都是单独的,发布前需要编辑每个云函数对应的别名、超时时间、参数、默认返回等。(如上所述,如果特性迭代不涉及这些调整,可以忽略)
  • API调整完毕后就可以发布云网关版本了,发布时需要指定本次发布的环境(test/release/prepub)

    理论上每个特性的发布需要再test/release/prebu上都发布一遍,成本比较高。所以才引入了别名,尽量减少云网关的发布。

  • 可以切换每个环境对应的版本,但是历史版本不能调整。

总结

  • 云网关、别名和云函数的关系
    • 云网关:用作对外入口,定位类似nginx,云函数版本变更基本不涉及网关的变更。
    • 云函数:类似内部逻辑层,实现业务逻辑。也可以在云函数内实现多个功能,自己实现二级路由。
    • 别名:类似内部路由控制层,控制云网关到云函数的路由调度策略。
  • 建议部署关系
    1. 新版本直接在Latest上开发、发布。使用test别名+test path访问,多人开发时可以独立拆分云函数,避免相互影响。
    2. 提测时发布测试环境,云函数新增一个版本,并调整别名路由策略即可。可以使用prepub用作测试。并调整对应别名路由策略。
    3. 正式环境发布,调整release别名对应版本即可。
See all postsSee all posts