背景
Serverless 是炙手可热的技术,被认为是云计算发展的未来方向。尤其是在前端研发领域,使用 Node 开发云函数,可以让前端工程师更加专注于业务逻辑,实现全栈工程师的角色转变。
Serverless 适用于事件触发的场景。当某个事件发生时,拉起并调用 Serverless 云函数,比如文件上传、消息队列中的消息事件、定时器事件,也可以是 IoT 设备的某个事件。还可以用于一些文件处理,比如图像处理、音视频处理和日志分析等场景。
当然,这些事件也包括 HTTP 请求事件,这是 Serverless 的一个很大的适用场景—— HTTP Service,主要实现基于 HTTP 应用的后端服务,比如 REST API、BFF 和 SSR 服务,以及业务逻辑的实现。 serverless这个方向国内的大厂基本都已经进入,且形成了自己的产品,阿里的mPaas,腾讯的叫做CloudBase。我们先看一下腾讯对于CloudBase的定位:
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等 Serverless 化能力,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用、Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
实际的例子
上面的描述还比较抽象,接下来我们通过一个实际的例子来体验一下serverless技术给我们带来的便捷。因为有很多应用是通过小程序入口的,为了方便我自己后面扩展,也因为cloudbase提供了免费的套餐,这里我使用CloudBase进行测试。例子的内容是常见的数据库CURD操作,我们使用golang在cloudbase快速实现一个获取人员信息的接口,并快速部署上线提供公网访问。
准备测试环境
我们需要先开通腾讯云的账号,并登陆CloudBase serverless控制台,console.cloud.tencent.com/scf/ ,同时申请开通一个免费云数据库MemFireDB ,最后就是我们自己的开发机了,这里我用的是centos7上的docker容器。CloudBase和MemFireDB的注册流程这里就不详细描述了,可以按照网站的引导一步步完成操作。这里介绍下开发环境的配置
获取镜像,使用docker search可以查看最新的镜像
使用docker pull拉取镜像
镜像获取成功后,使用docker images查看
使用docker run -it /bin/bash 启动该镜像,并进入镜像中进行操作,这里我们还需要安装一下vim编辑器用来开发代码
apt-get update
apt-get install vim
apt-get install lrzsz
到这里我们所有的开发和测试环境就已经准备就绪了,接下来我们来编写代码
编写代码
serverless讲究的是每个云函数功能单一,短小精悍,所以我们只需要一个main.go可以,代码内容如下:
package main
import (
"fmt"
"context"
"github.com/tencentyun/scf-go-lib/cloudfunction"
"github.com/go-pg/pg/v10"
"encoding/json"
)
type Persons struct {
Id int `json:"id"`
Name string `json:"name"`
}
type DefineEvent struct {
// test event define
Key1 string `json:"key1"`
Key2 string `json:"key2"`
}
type Header struct {
Content_Type string `json:"Content-Type"`
}
type Resp struct {
IsBase64Encoded bool `json:"isBase64Encoded"`
StatusCode int `json:"statusCode"`
Headers Header `json:"headers"`
Body string `json:"body"`
}
func hello(ctx context.Context, event DefineEvent) (Resp, error) {
opt := pg.Options{
// 填写自己的云数据库地址、用户名、数据库名、密码
Addr: "",
User: "",
Password: "",
Database: "",
OnConnect: func(ctx context.Context, cn *pg.Conn) error {
println("new connection created")
return nil
},
}
db := pg.Connect(&opt)
defer db.Close()
header := Header{Content_Type: "application/json"}
resp := Resp {
IsBase64Encoded : false,
StatusCode : 200,
Headers : header,
Body : "hello world",
}
var persons []Persons
err := db.Model(&persons).Select()
if err != nil {
fmt.Println(err)
return resp, err
}
personstr, err := json.Marshal(persons)
resp.Body = string(personstr)
respstr, _ := json.Marshal(resp)
fmt.Println(respstr)
return resp, nil
}
func main() {
// Make the handler available for Remote Procedure Call by Cloud Function
cloudfunction.Start(hello)
}
编译生成可执行程序并打包准备部署
go mod init tcb-postgres-golang
go mod tidy
GOOS=linux GOARCH=amd64 go build -o main main.go
zip main.zip main
部署测试
现在MemFireDB中通过在线编辑器插入一些数据
在cloudbase中创建云函数,并上传上一步中编译好的可执行程序
按照下图中来配置云函数的各项参数,运行环境选在Go1,函数类型选择事件函数,函数代码选择“本地上传zip包”,并选择我们上一步中准备好的main.zip,填好之后点击“完成”
部署完成后会跳转到函数管理页面,点击“测试”按钮,可以看到函数执行是否正常
增加触发方式,选择API网关触发,为了方便测试,我们这里可以选择“免鉴权”,请求方法选择“Get”,最后点击“完成”按钮
最后可以看到该接口的调用地址,我们可以在浏览器上直接访问该地址
浏览器返回的内容
到这里我们的接口就已经开发部署完毕了,我们无需购买任何云资源,也无需安装部署自己的服务器,只需要开发自己的业务代码就可以快速的上线服务,服务后面的高可用和扩展完全交由cloudbase平台托管。
注意事项
SCF 运行返回 “error”:403,”error”:”Invalid scf response format. please check your scf response format.” 怎么办?
API 网关会将云函数的返回内容进行解析,并根据解析内容构造 HTTP 响应。通过使用集成响应,可以通过代码自主控制响应的状态码、headers、body 内容,可以实现自定义格式的内容响应,例如响应 XML、HTML、JSON 甚至 JS 内容。在使用集成响应时,需要按照 API 网关触发器的集成响应返回数据结构,才可以被 API 网关成功解析,否则会出现 {“errno”:403,”error”:”requestId xxx , Invalid scf response. expected scf response valid JSON.”} 错误信息。
总结
本文介绍了serverless的背景和场景,并通过利用CloudBase和云数据库MemFireDB快速构建了一个人员信息查询的接口的例子来演示Serverless的便捷性。正如CloudBase描述的那样:为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等 Serverless 化能力,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用、Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/9804.html