十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

腾讯云CloudBase云开发是什么?从云函数到云托管,一篇文章搞懂Serverless后端开发

腾讯云CloudBase云开发是什么?从云函数到云托管,一篇文章搞懂Serverless后端开发 前几天在开发者社区看到一个提问在腾讯云服务器上装了 Redis改了密码之后重启服务一直失败怎么办评论区里各种排查建议都有配置文件、权限、日志看得我特别有代入感。因为我自己刚接触后端的时候也是被这类问题折磨过端口忘放通、二级域名解析半天、Docker 镜像推不上去。这些事和业务逻辑本身没有任何关系但就是会耗掉你一整个晚上。那几年我就在想如果把“服务器”这层东西彻底藏起来是不是就没这么多事了腾讯云的 CloudBase 云开发平台给我的答案基本是能。CloudBase 是腾讯云推出的一站式云开发平台核心由云函数、云数据库、云存储、云托管等能力组成目标是把传统后端开发和运维的繁琐环节抽象成开箱即用的服务。你不需要买服务器、配环境、管安全组只需要写业务代码平台负责弹性伸缩、高可用和大部分运维工作。这篇文章我会以一个实际使用者的视角把 CloudBase 从定位、功能、实操到成本、踩坑、适用场景完整过一遍。不管你是想给小程序做个后端的前端开发者还是被服务器运维搞得焦头烂额的独立开发者又或者只是想快速验证一个产品想法这篇内容应该都能给你一些参考。1. 平台定位与设计思路拆解1.1 先聊聊传统后端开发的那些“体力活”我在文章开头提到的 Redis 例子其实是很多后端开发者的日常缩影。传统模式下做一个带用户体系和数据存储的应用流程大概是买一台云服务器、选操作系统、配安全组、装运行时、装数据库、装缓存、配反向代理、写部署脚本然后才是写真正的业务代码。等这些基础设施全部跑通一两天时间已经没了期间还要和各种奇怪的报错搏斗。更麻烦的是这些基础设施不是装完就结束的。数据库要备份服务要监控流量大了要扩容磁盘满了要清理安全补丁要打。这些事情和你的业务没有任何直接关系但它们会持续消耗你的时间和精力。这也是为什么 Serverless 理念这几年越来越流行把基础设施的复杂度收走让开发者只关心业务逻辑本身。CloudBase 的出现本质上是把这条链路里“和服务器相关的部分”全部替换成 API 和 SDK。你不再需要关心代码跑在哪台机器上只需要关心函数怎么响应事件、数据怎么读写、文件怎么存取。这种设计思路对于中小型项目和快速迭代场景来说是非常舒服的。1.2 CloudBase 到底是什么核心组件有哪些CloudBase 全称是腾讯云开发 Tencent CloudBase经常被简称为“云开发”。它并不是某一个单一产品而是一整套后端能力的组合。我平时用得最多的几个组件是云函数跑业务逻辑的地方本质是 FaaS函数即服务。写一个 Node.js 或 Python 函数它就能在云端被事件触发执行。云数据库一个文档型数据库用起来有点像 MongoDB。不需要自己建表直接往集合里插入 JSON 文档就行。云存储对象存储加 CDN 加速用来放图片、音视频、静态资源文件。云托管容器服务可以跑完整的 Docker 镜像适合那些不太适合函数形态的 Web 服务。静态网站托管把前端打包产物直接部署上去自带 HTTPS可以绑定域名。身份认证内置了微信登录、匿名登录、邮箱密码登录等认证能力省去自己写账号系统的麻烦。这些能力通过一套统一的 SDK 暴露给前端和后端小程序端、Web 端、移动端都能接。用一句话概括你只需要写前端页面和后端逻辑剩下的基础设施全部交给平台。1.3 与传统服务器、其他 Serverless 方案横向对比很多人会纠结我到底该用传统服务器还是 CloudBase还是自己搭一套 SCF API 网关我根据自己的使用体验拉了一个对比表格对比维度传统服务器CVM 自建CloudBase 云开发纯 Serverless 自组SCF API 网关等微信云开发搭建速度慢环境配置繁琐快分钟级开通环境较快但需要自己组装各产品快小程序内免配置运维负担高系统/数据库/备份全要自己管低平台托管中需要自己处理各产品联动低平台托管成本模型包月/包年闲置也收费按量计费有免费额度按量计费按量计费后端灵活度高完全掌控中云函数受限但云托管可补高中生态集成全部自己搭腾讯云生态小程序一体化腾讯云全家桶微信生态强绑定适合人群有专职运维的复杂系统快速交付、前端团队、独立开发者有 Serverless 经验的团队以微信小程序为主的项目我的个人体感是选型这件事没有绝对好坏关键是看你愿意放弃什么。用传统服务器你换来的是高度自由和掌控感代价是时间和运维成本。用 CloudBase你换来的是极快的交付速度和近乎为零的运维负担代价是平台绑定和一定程度的灵活性限制。想清楚这一点很多纠结就不存在了。2. 核心功能拆解与实操要点2.1 云函数理解 Serverless 的运行逻辑云函数是 CloudBase 所有功能里最核心的部分几乎每个项目都会用到。它的运行方式可以理解成“外卖餐厅”来一单做一单没有单子的时候不占任何资源。你只需要写好一个函数入口平台会在请求到达时自动拉起执行环境执行完自动回收。我最早接触云函数的时候最大的不适应是“无状态”这三个字。传统开发中你可以把一个对象放在内存里跨请求复用但云函数不行因为每次调用都可能是一个全新的运行环境。所以你的代码必须设计成无状态的所有需要持久化的数据都写进数据库所有需要复用的配置都放在环境变量里。云函数支持的语言包括 Node.js、Python、Java、PHP、Go绝大多数场景用 Node.js 就够了。写函数的时候核心是导出一个main方法接收event和context两个参数。event是调用方传给函数的参数context是运行环境信息。一个最简单的函数长这样exports.main async (event, context) { return { code: 0, msg: hello cloudbase, event: event }; };写完之后可以在控制台直接测试输入一个 JSON 格式的 event就能看到返回结果。这个调试体验比传统后端要轻量很多因为不需要本地起服务、不需要配路由写好函数立刻就能验证。关于函数粒度我踩过一些坑。一开始图省事把所有逻辑塞进一个大函数结果每次改动都要重新部署整个函数而且不同场景对内存和超时时间的要求也不一样全部用同一套配置很浪费。后来我习惯按业务动作拆分比如用户相关的操作放一个函数内容相关的操作放一个函数每个函数设置适合自己的超时时间和内存大小。内存设置也需要留意内存越大单价越高但运行速度也会更快这里面有个性价比平衡点。2.2 云数据库权限模型才是最大的坑CloudBase 的云数据库是文档型数据库集合对应传统数据库的表文档对应行。往里面插数据非常简单一个add方法就搞定const db app.database(); db.collection(messages).add({ content: hello, createdAt: Date.now() });听起来很美好但很多人包括曾经的我都会在权限模型上翻车。云数据库的权限配置在控制台里有一套模板包括“所有用户可读仅创建者可读写”、“仅创建者可读写”、“所有用户可读”、“所有用户不可读写”等几种。如果你没认真理解默认配置很可能不是你想要的。我举个例子。假设你做的是一个留言板希望任何人访问页面都能看到留言但只有登录用户能发布。如果你把集合权限设置成“所有用户可读仅创建者可读写”那么前端直接写入时非创建者会失败。如果你设置成“所有用户可读”加上“所有用户可写”虽然需求满足了但任何一个访问者都可以篡改或删除别人的留言安全风险很大。后来我学到一个更稳妥的方案不在前端直接操作数据库而是全部通过云函数中转。前端调用函数函数内部做数据校验和权限判断再使用管理端权限去操作数据库。这样即使数据库权限设置成“仅管理端可写”也完全不影响业务而且所有逻辑都集中在服务端安全性高得多。对应的自定义安全规则也是支持的比如{ read: true, write: doc._openid auth.openid }这种规则的意思是任何人都能读但只有文档创建者本人能改。规则本身很灵活但我个人还是推荐默认走云函数逻辑更清晰也更好排查问题。2.3 云存储与静态托管上传下载与自动部署云存储解决的是文件存取问题和对象存储产品类似上传文件后返回一个 fileID通过 CDN 加速访问。权限上同样有公开读、私有读等选项。我的习惯是头像、商品图、分享海报这类公开资源设置公开读用户上传的私密文件走云函数生成临时链接。静态网站托管是我很喜欢的一个功能。以前部署前端项目不是丢到 Nginx 就是找个静态托管平台需要额外配置。CloudBase 的静态托管打通了 CLI前端项目打包完之后一条命令就能发布tcb hosting deploy ./dist部署上去之后平台会自动分配一个默认域名并且自带 HTTPS。如果你想用自己的域名在控制台里绑定域名、配置 CNAME 就行。如果你在传统服务器上折腾过二级域名解析、申请 SSL 证书这些事到这里会明显感觉到什么叫省心。2.4 身份认证、云托管与扩展能力身份认证模块内置了微信登录、匿名登录、邮箱密码登录等方式。做小程序项目时直接对接微信生态非常方便做 Web 项目时匿名登录加自定义登录也能覆盖大多数场景。这里有个小提醒匿名登录的 openid 不代表真实用户身份用户换设备或清缓存后匿名身份会变所以需要绑定正式登录方式时要及时引导用户完成注册。再说说云托管。它是 CloudBase 里一个比较特别的能力核心是容器服务可以跑完整的 Docker 镜像。什么时候会用到它我举两个例子一是你的服务需要 WebSocket 长连接云函数天然不适合二是你希望跑一个完整的框架应用比如完整的 Node.js Web 服务而不是拆分到单个函数。使用流程也不复杂本地打好镜像推送到腾讯云容器镜像服务然后在云托管里创建服务、部署版本即可docker tag my-app:latest ccr.ccs.tencentyun.com/你的命名空间/my-app:latest docker push ccr.ccs.tencentyun.com/你的命名空间/my-app:latest把镜像推送上去之后在控制台创建服务时选择这个镜像平台会自动拉取并启动容器。相比传统服务器上手动部署 Docker云托管帮你管好了负载均衡和自动扩缩容体验好不少。3. 从0到1一个留言板项目的完整落地3.1 环境准备与创建云开发环境理论说了不少下面用一个完整的案例串一遍实操流程。我选的需求是做一个“访客留言板”功能很简单访客能查看已有留言也能发布一条新留言。这个案例覆盖了云函数、云数据库、静态托管和前端调用很适合用来理解 CloudBase 的整体工作流。第一步打开腾讯云控制台搜索“云开发 CloudBase”进入产品页后创建一个环境。这里我推荐按量付费环境因为它自带免费额度个人项目和小型应用基本可以在免费额度内跑很久。创建环境时会生成一个环境 ID记得复制后面代码和部署都会用到。第二步在本地安装官方命令行工具npm install -g cloudbase/cli tcb login登录之后在项目目录里执行tcb init按提示关联刚才创建的环境。到此为止本地环境和云端环境就打通了。3.2 编写并部署云函数我在项目里建了一个cloudfunctions/messageBoard目录里面放index.js和package.json。云函数的代码逻辑分两个动作list查列表add发留言。完整代码大概长这样const cloud require(cloudbase/node-sdk); const app cloud.init({ env: cloud.SYMBOL_CURRENT_ENV }); const db app.database(); exports.main async (event) { const { action, content, nickname } event; // 查询留言列表 if (action list) { const res await db.collection(messages) .orderBy(createdAt, desc) .limit(20) .get(); return { code: 0, data: res.data }; } // 新增留言 if (action add) { if (!content || content.length 200) { return { code: 1, msg: 内容不能为空且不能超过200字 }; } const addRes await db.collection(messages).add({ content, nickname: nickname || 匿名用户, createdAt: Date.now() }); return { code: 0, data: addRes.id }; } return { code: 2, msg: 未知操作 }; };这里有个地方需要解释cloud.init里的SYMBOL_CURRENT_ENV意思是“使用当前函数所在的环境”这样部署到哪个环境函数就自动连接哪个环境的数据库不用在代码里硬编码环境 ID。部署命令也很简单tcb functions:deploy messageBoard部署完成后在控制台的云函数模块里点“测试”输入类似{action:list}的 JSON就能看到函数返回的数据库查询结果。这里能直观体会到 Serverless 开发的感觉不需要启动任何本地服务写好函数一部署云端直接出结果。3.3 数据库设计与安全规则配置留言板需要先用一个集合来存数据。在控制台的“数据库”模块里新建集合命名为messages。我设计的数据结构是字段名类型说明contentstring留言内容nicknamestring昵称createdAtnumber创建时间用时间戳_openidstring创建者标识平台自动写入如果所有数据库操作都走云函数权限直接设置成“仅管理端可写”就好了前端不直接碰库安全性和可控性都强。这也是我在这套案例里采用的方式。数据量小的时候不需要额外建索引但如果留言量多了列表页按时间倒序查询会越来越慢。建议在控制台的索引管理里给createdAt字段建一个降序索引。这是很多人容易忽略的点等数据涨到几万条才想起来往往已经晚了。3.4 前端接入与自定义域名绑定前端页面我用一个简单的 HTML 来实现。通过cloudbase/js-sdk初始化应用调用云函数拿数据script srchttps://static.cloudbase.net/static/js-sdk/2.x/index.js/script script const app cloudbase.init({ env: 你的环境ID }); async function loadMessages() { const res await app.callFunction({ name: messageBoard, data: { action: list } }); console.log(res.result.data); } async function addMessage(content, nickname) { const res await app.callFunction({ name: messageBoard, data: { action: add, content, nickname } }); return res.result; } loadMessages(); /script需要注意Web 端调用云开发能力时有一个“Web 安全域名”的限制。在控制台里找到“安全配置”把你前端的访问域名加进去。开发阶段用 localhost 调试时也要把 localhost 加进白名单否则会报跨域或域名不合法。这个坑我遇到过不止一次很多时候你以为代码写错了其实只是域名没加白。前端页面写好后构建打包然后一条命令部署到静态托管tcb hosting deploy ./dist部署完成后访问默认域名就能看到留言板页面。要绑定自己的域名可以在“静态网站托管”的域名管理里添加配置 CNAME 解析等证书签发完成就能用 HTTPS 访问了。3.5 成本怎么算如何避免月底惊魂用过云开发的人都明白按量计费最怕的就是月底一看账单吓一跳。这里我按一个最简单的个人博客或者留言板来估算。假设你的应用每个月被访问 1 万次每次调用云函数时分配 128MB 内存、运行约 200ms那么云函数资源使用量大约为1 万次 × 0.128GB × (200 / 3600 小时) ≈ 71 GBs这个量级在免费额度内基本能覆盖。再加上数据库读写几万次、存储几 GB、CDN 流量几 GB整体成本大概就是个位数到十几元。作为对比哪怕是最低配的云服务器一个月也要几十块而且还要自己搭环境。免费额度每天都在消耗如果你的应用突然被爬虫刷接口或者代码出现死循环免费额度很快会用完。我的做法是在腾讯云控制台设置费用预警金额超过阈值就短信提醒同时在代码里做好基本防护比如频率限制、参数校验避免被恶意调用。这个习惯能帮你避开绝大多数“月底惊魂”的场景。4. 常见问题、避坑经验与适用场景评价4.1 高频问题排查速查表用的时间久了我把一些高频问题的现象、原因和解决办法整理成了表格遇到问题可以直接对着查现象可能原因解决办法云函数部署失败或超时CLI 版本过旧、本地依赖未安装升级cloudbase/cli在函数目录执行npm install后重新部署前端调用函数时跨域报错Web 安全域名没有配置在控制台安全配置里加白当前域名localhost 也要加前端直接操作数据库失败集合权限太严格改成通过云函数操作数据库或调整安全规则第一次请求耗时明显较长云函数冷启动业务能接受就忽略不能接受就预留并发或用云托管费用或流量突然飙升异常调用、循环触发、日志刷屏设置费用预警查看云函数调用量监控检查代码逻辑上传文件一直失败存储权限过严或文件大小超限检查存储权限配置和文件大小限制修改环境变量后不生效函数没有重新部署修改环境变量后重新部署对应函数4.2 我踩过的坑几条独家心得第一权限永远选最小化。这句话我说了很多次但每次帮别人排查问题十个里有七个还是栽在权限上。开发环境为了省事开放全部读写测试的时候没问题上线就出事。不如一开始就用云函数收口数据库操作省心得多。第二不要拿文档型数据库当关系型数据库用。CloudBase 的云数据库支持基础查询和聚合但复杂到多表关联、复杂事务这种操作它并不是强项。如果你发现业务 SQL 思维很重关联查询很多那可能说明你的场景更适合传统关系型数据库。第三日志别乱打也不要完全不打。云函数的日志是排查问题的重要线索但如果你在循环里打日志十几万条日志会把调试信息淹没。我一般只记录关键流程和异常分支配合console.log和console.error分开用这样排查起来效率很高。第四环境隔离很有必要。哪怕只有你一个人开发我也建议至少分开 dev 和 prod 两套环境。不需要两套都开最高配置但避免在同一个环境里“边改边用”能省掉很多数据污染的麻烦。4.3 云开发适合谁不适合谁说了这么多最后聊点实在的到底哪些项目适合用 CloudBase哪些不适合我自己的判断是适合的场景包括小程序或 H5 项目尤其是和微信生态绑定的应用CloudBase 的一体化体验非常顺畅前端团队主导的快速原型和中小型产品不需要专职后端也能独立交付活动页、内容社区、工具类应用、企业内部管理系统这类业务逻辑相对标准化的项目教学演示和个人作品集花一个下午就能把想法变成能对外演示的 Demo。不太适合的场景则是大型核心交易系统对延迟、一致性、审计合规要求极高Serverless 的冷启动和配额限制需要非常谨慎地评估已经有成熟微服务或容器体系的团队迁移成本往往比收益大需要深度控制基础设施、依赖特定网络环境的项目平台能力再丰富也替代不了裸服务器的自由度。CloudBase 的优势在于快和稳交付快扩容稳劣势在于平台绑定深度使用后想迁走成本不低。我的建议是小步快跑的项目优先考虑它先把业务验证起来等规模真正大了再根据那时候的具体情况做架构演进。如果让我给 CloudBase 一句话评价我会说它比你想的更接近“让开发者只关心业务”这个理想但前提是你能接受把一部分基础设施控制权交给平台。从我自己的经历来看它最适合拿来做那些“想快速上线、不想天天陪运维玩”的项目。我第一次用云函数部署接口时从注册账号到跑通一个带数据库的完整后端只花了一下午而同样的事放在传统服务器上光环境配置就得折腾一两天。最后分享一个小技巧多翻腾讯云开发者社区里关于 CloudBase 的实战文章很多官方团队和社区同学会发新功能的踩坑记录我几次疑难问题都是在那里找到解决思路的。我始终觉得选平台不是选“最强”而是选“最合适”CloudBase 的合适之处恰好在于它把“从想法到上线”的距离压缩到了很短很短。
返回列表