serverless--全栈工程师的利器

背景

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控制台,https://console.cloud.tencent.com/scf/ ,同时申请开通一个免费云数据库MemFireDB https://memfiredb.com/ ,最后就是我们自己的开发机了,这里我用的是centos7上的docker容器。CloudBase和MemFireDB的注册流程这里就不详细描述了,可以按照网站的引导一步步完成操作。这里介绍下开发环境的配置

获取镜像,使用docker search可以查看最新的镜像

image.png

使用docker pull拉取镜像

image.png

镜像获取成功后,使用docker images查看

image.png

使用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中通过在线编辑器插入一些数据

image.png

在cloudbase中创建云函数,并上传上一步中编译好的可执行程序

image.png

按照下图中来配置云函数的各项参数,运行环境选在Go1,函数类型选择事件函数,函数代码选择“本地上传zip包”,并选择我们上一步中准备好的main.zip,填好之后点击“完成”

image.png

image.png

部署完成后会跳转到函数管理页面,点击“测试”按钮,可以看到函数执行是否正常

image.png

增加触发方式,选择API网关触发,为了方便测试,我们这里可以选择“免鉴权”,请求方法选择“Get”,最后点击“完成”按钮

image.png

最后可以看到该接口的调用地址,我们可以在浏览器上直接访问该地址

image.png

浏览器返回的内容

image.png

到这里我们的接口就已经开发部署完毕了,我们无需购买任何云资源,也无需安装部署自己的服务器,只需要开发自己的业务代码就可以快速的上线服务,服务后面的高可用和扩展完全交由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 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值