小试牛刀:基于Golang的腾讯云Serverless使用体验

  • 2019 年 12 月 28 日
  • 筆記

| 导语:Serverless符合云计算发展的方向,把用户关注点放在业务功能上,屏蔽底层网络框架、计算资源和机器运维等细节。这里基于Golang试了一把腾讯云SCF,简单把使用体验记一下

目录

一、谈谈Serverless背景

  1. 为什么要使用Serverless?
  2. 帮业务解决什么问题?
  3. 核心构成:Trigger+FaaS+BaaS

二、基于Golang的腾讯云SCF简易使用流程

  1. 创建编辑函数
  2. 编写Golang代码
  3. 上传调试
  4. 添加函数触发器
  5. 完善ApiGateway配置
  6. 查看函数日志
  7. 查看函数监控

三、谈谈Serverless使用感受

  1. 优缺点和使用场景
  2. 当前SCF业务接入情况
  3. 冷启动问题
  4. 关于本地缓存/全局变量的使用
  5. 调试工具不方便
  6. 测试环境搭建
  7. 关于灰度策略

一、谈谈Serverless背景

为什么要使用Serverless?

  • 业务应用开发:聚焦业务逻辑、变轻变薄变简单
  • 背后基础设施:能力不断完善、变重变厚变标准
Serverless演进.png

帮业务解决什么问题?

让业务在无服务器架构演变中收益:

无服务器架构.png

核心构成:Trigger+FaaS+BaaS

Serverless由Trigger+FaaS+BaaS构成:

  • Trigger:函数的触发器,一般有ApiGateway、定时器、消息队列等多种触发模式
  • FaaS:函数即服务,Serverless的核心,完成业务应用逻辑的载体
  • BaaS:后端即服务,FaaS运营依赖的远端组件或服务,比如DB、KV、COS和后端SVR等

如一个背单词小程序简要架构图:

背单词简要架构图.png

二、基于Golang的腾讯云SCF简易使用流程

腾讯云SCF:https://cloud.tencent.com/product/scf

创建编辑函数

  • 登录到腾讯云控制台后,选择函数服务>选择地区和namespace->创建函数
  • 几个主要关注项:运行角色、超时时间、环境变量、公网/内网访问、日志集等
创建函数.png

编写Golang代码

  • 引入SCF的Golang SDK:github.com/tencentyun/scf-go-lib/cloudfunction
  • 下面是最简单的SCF代码,通过cloudfunction.Start()绑定Handler,函数触发后会调用
  • 入参ctx为环境变量,req为自定义请求体(这里用ApiGateway触发,所以用了SCF默认的ApiGateway请求体结构),出参string为函数输出数据
编写代码.png

上传调试

  • 编译出二进制后,上传到SCF上就完成部署了。golang只支持上传二进制,像python、nodejs等脚本语言可直接上传代码且在控制台上编辑
  • 除了控制台,一般使用VsCode插件或者命令行工具 CLI来上传
  • 上传完保存后,就可点测试触发函数,入参为可选测试模板或自定义参数
上传函数.png

添加函数触发器

  • 选择触发方式,就可以添加1个或多个函数的触发器,当前CSF支持了API网关、Ckafka、CMQ、定时器等常用方式
  • 添加了ApiGateway后,就自动给你生成url,一条cgi就完成了,不需搭建nginx、cgi-proxy等工程,全部云给你快速搞定
添加触发器.png

完善ApiGateway配置

  • 点击API服务名,就可到ApiGateway的控制台,管理Api的访问方式、挂业务域名、配错误码、管理版本和环境等等
完善ApiGateway.png

查看函数日志

  • 选择运行日志,就可看到函数每次触发的运行日志信息。但只能按时间和请求ID检索,很不方便。一般通过挂载日志集,同步到腾讯云日志服务
函数日志.png

查看函数监控

  • 同样,监控信息里也包含了函数运行时间、流量、吞吐量等一些基础监控,也可配告警。更个性化和深入的业务监控,就需业务接入云监控等其他组件了
函数监控.png

三、谈谈Serverless使用感受

优缺点和使用场景

  • 优点:真心叫快速上线;降低开发运维成本,特别是对机器这方面;统一业务云开发框架;兼容微服务架构能力;能做到自动扩缩容,按需付费;
  • 缺点:对云平台强依赖,被绑架以后必须都和云玩;服务类型受限,像无状态、长期运行等服务不合适;当前调试发布功能真心不完善;冷启动问题需优化
  • 使用场景:虽然有些服务受限,以及存在调试不方便和冷启动等问题,但我感觉Serverless作为一种全托管、免运维的模式,能做的场景非常多。不只是后台业务服务、像数据服务、AI服务等都可以Serverless化

当前SCF业务接入情况

  • 腾讯内:手机管家,NGW,微信内读书/支付一堆小程序,腾讯视频,腾讯地图,腾讯相册等
  • 腾讯外:拼多多的运营活动小程序,TPLINK,英孚教育,北京尚德,新东方等
  • 吞吐比较大的函数超过10+亿/天调用

冷启动问题

很多人担心函数冷启动,需初始化环境与VM、拉取代码等执行过久,导致首批请求失败。这里也有一些优化方案:

  • 函数打薄:通过减少函数代码等,让容器更轻启动更快速
  • 实例预留:Serverless比较聚焦讨论的话题,通过历史函数访问模型,计算实例预启动和保留策略,也可以业务自己配置,这里就不展开

关于本地缓存/全局变量的使用

目前SCF函数执行完会有3min左右环境保留,所以像本地缓存还是可使用的,只是什么时候失效变成未知数

此外,SCF也提供了像ServerlessDB等SDK,对连接池做了一些优化

调试工具不方便

作为刚入门的,也可能因为不熟悉,真心觉得Serverless调试还不是很方便,本地测试环境和现有测试服务打通很繁琐

几个点后面可完善使用:

  • VsCode插件:查看函数,开发调试,同步文件等
  • 命令行工具CLI: 实现函数打包部署,可和脚手架/CI结合使用
  • 用例调试:本地和云端调试,完善用例工具

测试环境搭建

因为SCF函数并没环境区分,环境变量也只能设置一种,所以一般通过不同命名空间下,创建不同的函数来做测试环境。函数可一键复制,减少创建成本,但始终觉得有些冗余

关于灰度策略

现在SCF发布有版本控制,但还不支持流量控制和灰度策略。这点对于每次慢慢灰度小心翼翼的我很不习惯,希望可以早日完善这个功能