腾讯云函数和Serverless开发简单验证
Serverless是一种构建和管理基于微服务架构的完整流程,允许你在服务部署级别而不是服务器部署级别来管理你的应用部署。它与传统架构的不同之处在于,完全由第三方管理,由事件触发,存在于无状态(Stateless)、暂存(可能只存在于一次调用的过程中)计算容器内。
构建无服务器应用程序意味着开发者可以专注在产品代码上,而无须管理和操作云端或本地的服务器或运行时。Serverless真正做到了部署应用无需涉及基础设施的建设,自动构建、部署和启动服务。
在我前面分享过一篇关于Serverless无服务器架构概述和应用场景的文章,可以先参考。
你应该了解的Serverless无服务器架构和应用场景
同时对Serverless无服务器架构我也明确指出,要短期做到全部替代当前企业内部IT应用架构和开发模式是不可能的,更多的还是在一些特定的场景下进行使用。因此今天结合网上的开发教程对腾讯云的Serverless云开发和云函数进行简单的验证。腾讯云账号注册和环境创建
第一步-注册腾讯云账号
https://cloud.tencent.com/register
在这里注册后需要进行实名认证,推荐直接采用微信扫码实名认证即可,在认证完成后可以对相关的用户,用户组,访问安全等基础信息进行必要的配置。
第二步-创建环境
https://console.cloud.tencent.com/tcb
在账号注册完成后,登陆上面的控制台,进行云开发环境的创建。这里可以选择"按量计费"环境,记得勾选开启免费资源,默认是有一定的免费额度,完全够一些小应用跑跑,一般个人博客也没什么问题。作为学习和实验就资源就更够用了。
在环境创建的时候,输入一个环境名称,选择空模板。
在环境创建成功后,点击环境即可以进入到该环境控制台。
从这里可以看到环境信息,提供和可使用的基础服务,同时当前订购和资源信息和资源的使用情况信息等。云开发的设计是环境,环境包含各个资源的统计和能力,一个环境一般对应一个应用,当然也可以部署多个应用。你可以把环境类似为虚拟机,但是这是有本质的区别的,因为当应用没有被访问的时候,是不占空间和资源的。创建云函数
在环境创建成功后,点击左边的云函数,进入到云函数创建界面。
在这里填写函数名称,选择运行环境。从下拉框可以看到当前支持Nodejs, Python, Go等多种运行环境可以选择。在这里运行环境我们选择默认的Nodejs, 由于是简单测试,所以函数内存选择128m即可。
进入下一步:
注意红框为默认生成的代码,不用修改,直接提交即可完成云函数创建。
创建完成后点击创建好的云函数,进入到函数代码页面,在这里会出现一个在线的代码编辑器,可以直接进行代码编辑和修改。我们对函数代码进行简单修改,修改完成后保存。
注意下面有两个按钮,一个保存,一个保存并安装依赖。注意这里的例子实际上不涉及到依赖包的安装,因此直接点击保存即可。
在完成了云函数的编写后,可以将函数发布为一个http api接口。因此进入到云函数配置页面进行相关的配置工作。
在这里主要是配置http服务访问路径,如下图,点击进入到服务规则配置。
在这里,选择触发路径为/say-hello,鉴权暂时不启用,如下图:
点击确认后开始进行Http访问服务创建,整个过程预计3到5分钟完成。完成后通过生成的访问地址,即可以正常访问该API接口服务。
数据库CRUD操作
在云开发环境提供了一个 NoSQL 数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录。一般我们称数据记录的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete) 统称为 CRUD。下面,我们基于云函数对数据库进行操作。
第一步:创建数据库集合
在这里首先需要通过基础服务里面的数据库来创建数据库集合。
在这里,我们创建一个名词为test的集合。
第二步:创建云函数
我们创建两个云函数来进行验证,一个是插入数据,一个是查询数据。
点击云函数列表中的QueryData函数,进入代码编辑页面。
在编写代码之前,我们需要安装一个 Node.js 模块 tcb-admin-node , 该模块提供了在云函数或者说在Node.js 服务端器环境下,可以操作数据库、云存储等的一些方法/API。
创建 package.json 文件
因为需要引入 tcb-admin-node 模块,所以先要创建 package.json 文件。
点击文件菜单,选择新建文件,文件名为:package.json
package.json 文件内容如下,可以复制进去。{ "dependencies": { "@cloudbase/node-sdk": "*" } }
完成后点击保持并安装依赖按钮。
编写脚本代码
在进行代码编写前,先进入到环境总览功能获取环境ID信息,比如我这里是:
hello-test-1gepfo089f00059d
同时进入到控制台-》访问管理-》API密钥管理生成ID和Key
修改index.js文件,具体如下:
具体代码如下:"use strict"; //引入云开发 Node.js SDK const cloudbase = require("@cloudbase/node-sdk"); //初始化环境,环境ID即上面从环境总览获取的值 //注意ID和Key修改为你自己的值 const app = cloudbase.init({ env: "hello-test-1gepfo089f00059d", secretId: "##", secretKey: "##" }); //获取数据引用 const db = app.database() //集合名即前面创建的test数据库集合 //在集合中添加json对象并返回结果 exports.main = async (event, context) => { let result = await db.collection("test").add({ name: "test", age: 25, create_time: new Date() }) return result }
完成后点击保存并安装依赖。同时采用和前面创建云函数相同的方法来创建Http 访问服务。
在这里我们创建/InsertData 的方法服务,并进行调用。
完成后进入到数据库,test数据库集合,可以查看到具体产生的数据信息。
采用和上面同样的方法对QueryData云函数进行修改和编辑,具体步骤仍然为:1.创建package.json,引入依赖包
2.修改index.js文件
3.保持并安装依赖
4.创建http访问服务
具体index.js的代码如下:"use strict"; //引入云开发 Node.js SDK const cloudbase = require("@cloudbase/node-sdk"); //初始化环境,环境ID即上面从环境总览获取的值 //注意ID和Key修改为你自己的值 const app = cloudbase.init({ env: "hello-test-1gepfo089f00059d", secretId: "##", secretKey: "##" }); //获取数据引用 const db = app.database() //集合名即前面创建的test数据库集合 //查询集合并返回结果 exports.main = async (event, context) => { //使用 where 方法查询 name 为 test 数据 //链式调用 get 方法,执行查询过程并返回数据 let result = await db.collection("test").where({ name: "test" }) .get() //获取返回的数据结果 return result.data }
在创建好/QueryData访问服务后,通过浏览器访问可以正常返回结果。
静态网站托管
直接进入到静态网站托管菜单。
在这里上传一个简单的index.html文件进行测试。
在上传完成后通过默认域名即可以正常进行访问。
云端一体化模式
一个网站离不开动态数据,也离不开静态页面。因此推荐动静结合的方式。如下图
参见w3cschool
第 1 种方式,可以在云函数中访问数据库和云存储,也是前面篇章提到的方式;然后在静态托管中通过 Ajax 请求云函数的 HTTP 服务。
第 2 种方式,可以使用云开发端上 SDK,直接请求数据库和云存储等服务,可以不写云函数,整个站点全部都是前端 JavaScript 代码。
第 3 种方式,就是第一种和第二种方式的结合体,适当时机用云函数 HTTP 触发,适当时机用端侧 SDK,然后配合静态网站托管,也就是云端一体化开发模式。使用CLI来开发项目
安装云开发 CLI 之前需要安装 Node.js。如果本机没有安装 Node.js,请从 Node.js 官网下载二进制文件直接安装或者直接使用npm安装,建议选择 LTS 版本,版本必须为 8.6.0+。
安装好Node.js后,可以开始安装cloudbasenpm i -g @cloudbase/cli
安装完成后进行验证,如下:[root@localhost ~]# cloudbase -v CloudBase CLI 1.2.2 1.2.2 [root@localhost ~]# tcb -v CloudBase CLI 1.2.2 1.2.2 [root@localhost ~]#
在安装完成后,通过如下命令,根据提示输入ID和key登录。tcb login --key
登录后,可以进行环境创建操作tcb env:create env-name
详细说明可以参考腾讯云开发官方文档。
可以这么理解,控制台是一个平台,可以在上面使用 Web IDE(cloud studio) 编写代码,也可以管理各种配置,例如安全域名、独立域名设置、文件管理等等。但是有一些操作其实可以放到命令行的,比如静态网站部署是不是可以一行命令,就可以将文件上传上去。Serverless Framework应用
对于Serverless Framework本次暂时没有验证。
Serverless Framework 是业界非常受欢迎的无服务器应用框架,开发者无需关心底层资源,即可部署完整的 Serverless 应用架构。Serverless Framework 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码、调试、测试、部署等全生命周期,帮助开发者通过联动云资源,迅速构建 Serverless 应用。
从上图可以看到整个云端IDE进行云函数的在线开发和远程调试功能已经相当强大。
Serverless Framework 主要支持以下几个开发场景:
基于云函数的命令行开发工具
通过 Serverless Framework,开发者可以在命令行完成函数的开发、部署、调试。还可以结合前端服务、 API 网关、数据库等其它云上资源,实现全栈应用的快速部署。
传统应用框架的快速迁移
Serverless Framework 提供了一套通用的框架迁移方案,通过使用 Serverless Framework 提供的框架组件(Egg/Koa/Express等),原有应用仅需几行代码简单改造,即可快速迁移到函数平台。同时支持命令行与控制台的开发方式。简单总结
今天仅仅对腾讯云的Serverless云函数和云开发做了简单验证。
从整体情况来看,当前的云开发和Serverless完全可以应用到类似个人小APP,博客,图片网站,微信小程序的开发中。但是对于企业传统IT系统的开发暂时很难,其核心一个原因还是企业内部业务本身的复杂度,这个复杂度已经不是简单的DB或存储提供一个API接口,而是复杂的业务逻辑处理校验和事务处理能力。
在当前的应用场景下可以看到,云函数本身实际是属于偏前端开发的内容,即前端进行数据处理和规整后直接通过后端的数据库或存储服务进行持久化。但是如果涉及到复杂的后端数据库数据间的联动,规则处理,关联等,这些内容仍然不适合在前端开发中进行处理。
而真正要做到这点,即需要企业在整个IT转型里面将可复用的业务服务能力全部识别出来,并提前部署到自己的服务能力共享中心或者能力中台,在这个前提具备后前端应用开发才能够真正做到通过服务进行组装和整合。
云开发中也可以看到一个重点,即首先要去资源化,即将我们传统面对的数据库,存储,消息等涉及持久化的资源全部转变为服务接口调用,这个我在前面谈云原生转型的时候也谈到多次。当去资源化后,整个前端应用就更加灵活,剩下的问题就是业务领域服务层如何下沉的问题。