趁五一假期体验了下云函数。本来购买腾讯云是为了部署网站,后来网站走了 Netlify,体验非常好,服务器就吃灰了。
这次是需要为某个开发商生成免登录 Token。目标系统分发 Token 的接口当然不能暴露给他人,又不便做二次开发,就考虑用云函数了。API 网关响应请求,函数内发起对目标接口的调用,把响应回复给调用者,和计费说明里的示意图完全一致。
长期使用云函数的免费额度为事件函数和 Web 函数各 5 万次调用,外网流量 0.5GB,资源使用量 2 万 GBs,还是足够应付一些轻量级的应用的。
腾讯云提供了大量 demo,可以看看代码结构是什么样的。
新建事件函数,这样后期可以按调用次数创建限流规则。开发语言选择了 Node.js,这样 Postman 里验证完接口可以直接生成调用代码。
触发器可以选择 API 网关触发(当然如果有个地方(Redis/Memcached)可以把 Token 持久化,或者改成主动推送模式,也可以考虑定时器触发)。选中「集成响应」,这样云函数就可以向调用者发送反馈了。
如果完全使用的在线编辑器开发,需要主动维护 package.json
并开启「自动安装依赖」或在终端中执行 npm install
或 yarn add
。
API 网关对函数响应有一定要求,函数的返回值需要满足如下类型:
class Response {
isBase64Encoded: boolean;
statusCode: number;
headers: map-like;
// 如果响应是 JSON 类型的,body 就使用 JSON.stringify 序列化
body: string;
}
腾讯云的最佳实践建议「在代码中尽可能多地使用 log/print
语句,给调试工作带来充足的信息」,不过我这里足够简单,使用测试功能就基本可以验证了。
在触发管理里可以看到如何调用这个云函数,由于我使用了无鉴权 GET 请求触发,可以直接通过 curl 验证。
$ curl https://service-*.gz.apigw.tencentcs.com/release/showcase-1651284537
{"success":true,"payload":{"status":200,"msgs":{},"data":{"token":"******","timeout":604800000},"success":true}}%
需注意 114 等 DNS 或许不能及时更新地址记录,依赖 getaddrinfo
解析域名的工具(如 curl)不一定如预期工作。Chromium 系的浏览器或许有自己的一套域名解析机制(比如这里就有一些讨论),因此不受影响。这时候把 DNS 改成 8.8.8.8
之类的就好。
在 API 网关中新建系统插件,「基础流量控制」支持多种条件设置指定时间区间内允许的调用次数。创建插件后绑定云函数即可。
超出调用次数后将返回 Requests rate limited. stage: trafficcontrol
。