前言
serverless,如果百度一下,你会发现一堆的针对于serverless讲概念,讲原理的文章,什么无运维,FaaS(函数既服务),BaaS(后端既服务)等等,我觉得这些文章写的都挺好,但是看完这些文章后。我只想说道理我都懂了,那我要怎么做呢?这里我就从微信小程序作为切入点,来让我们实实在在的来一把serverless开发
我认为的serverless
微信小程序出现后,我们发现原来我们开发前端应用还可以寄放在别人那里。我们小程序开发完后,只要去开发者平台点下上传就完成了前端部署,我们要做的只是部署后端服务。
但是后端服务运维是一件很麻烦的事情,我们能不能懒一点,把这个后端服务也部署到别人那里,当然有,那就是阿里云,腾讯云。我们要做的只是把我们本地调试好的后台服务部署上去
但是我们能不能更懒一点,就别去部署了,直接就在别人那里开发前端和后端的应用,我们要做的就是按照别人定的规则来开发前后端应用就好,开发完后直接把两个都上传上去就行了。基于这种想法云开发serverless云端一体化就应运而生了。
其实这种想法大大的降低了前端开发人员进入后端开发的门槛,和前端开发人员中所谓的全栈工程师不谋而合。
小程序中的serverless
在微信小程序中我们能非常简单的建立起一个serverless应用,只要在新建项目时候选择小程序云开发即可,如下图

这样新建的项目中除了我们常规的小程序目录以外会多一个cloudfunctions目录,顾名思义就是云函数目录,所谓的云函数可以理解成我们前端开发中调用的接口,也就是后台服务处理函数
有了这个目录后,我们需要去创建一个应用,把这个目录部署上去,很简单,点击微信开发工具左上角第四个图标,云开发

按照引导一直点到开通,给你的应用起个名字,这些做完后右键点击cloudfunctions目录,选择你创建的那个环境,然后点开app.js文件把你的应用ID配置进去。

到这里你们的serverless应用已经建立起来了。可以在云开发控制台工具里看看你的后端服务:日志,数据库,文件存储功能都有
剩下的就是按照微信小程序的规则来进行开发即可,项目本身就自带实例。
函数开发完成后右键点击cloudfunctions下面的对应的函数文件夹比如这里使用实例自带的login函数就是login文件夹,选择上传,这个函数就会变成云函数,可以在云开发控制台的云函数列表里看见,然后就可以在前端代码里通过
wx.cloud.callFunction({
name: 'login',
data: {},
success: res => {
console.log('[云函数] [login] user openid: ', res.result.openid)
app.globalData.openid = res.result.openid
wx.navigateTo({
url: '../userConsole/userConsole',
})
},
fail: err => {
console.error('[云函数] [login] 调用失败', err)
wx.navigateTo({
url: '../deployFunctions/deployFunctions',
})
}
})
这种方式来调用云函数,具体可以看项目里的官方实例。
调用文件系统,数据库等都有对应的API,可以查看微信官方文档
现在再回过头来看看FaaS和BaaS的概念就会更清晰了,所有的服务都是通过函数来调用,所有的后端都是服务
其他各端的serverless
上面只是说了小程序端的serverless,其他端的呢,比如web端,app端。就我目前来看国内其他各端的云开发serverless云端一体化方案较为成熟的还是Dcloud,它和阿里云和腾讯云都有合作,而且提供了uni-app多端打包方案
可以根据它的官方教程建立serverless云项目,必须要用它提供的开发工具HBuilderX,建立出来的项目目录几乎和微信小程序建立出来的一模一样

然后创建应用,然后右键cloudfunctions选择你的应用
做好上面的步骤,我们来用它开发一个最简单的注册页面
1.建立数据库表
右键点击编辑器里的cloudfunctions文件夹选择"打开uniCloud Web控制台",在控制台里点击"云数据库",新建一个表名字就叫userData吧
2.建立云函数
右键点击编辑器里的cloudfunctions文件夹选择"新建云函数"起名字叫login,它会自动生成index.js,修改这个文件代码如下
'use strict';
const db = uniCloud.database() //连接数据库
exports.main = async (event, context) => {
const collection = db.collection('userData') //获取数据库里的userData表
const res = await collection.add(event) //接受客户端传来的用户数据,往表里查一条
if(res){// 状态返回
return {
status:'sucess'
}
} else {
return {
status:'fail'
}
}
};
然后右键点击login目录,选择上传部署看编辑器下面控制台提示完成即可

3.做个注册页面
uniapp是基于vue的所以,修改page/index.vue文件代码如下
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<view class="title">{{title}}</view>
<input type="text" v-model="username" placeholder="用户名" />
<input type="text" v-model="password" placeholder="密码" password />
<button @click='onButtonClick'>注册</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: '注册页面',
username:'',
password:''
}
},
onLoad() {
},
methods: {
async onButtonClick(){
const { username,password } = this
const res = await uniCloud.callFunction({
name:"login",
data:{
username,
password
}
})
console.log(res)
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
input{
display: block;
border-bottom: 1px solid #f4f4f4;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
flex-direction: column;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>
其实就是做一个简单的注册页面,重点是onButtonClick方法,通过uniCloud.callFunction调用云函数login,传入用户名和密码
4.调试
点编辑器里的预览会有一个页面

填好信息点注册,然后到uniCloud Web控制台里的云数据库里看一下,表里增加了一条信息

这样一个最简单的注册功能就完成了。
PS:其实像注册/登陆这种常用功能Dcloud已经集成好了,我们直接按照官方文档提供的api来实现就行了
最后
通过云开发serverless云端一体化,我们能像上面那样非常简单的实现业务功能,不再需要考虑这个服务怎么配置,那个服务怎么配置,对于开发人员来说真的很方便了。而且对于前端开发人员转全栈算是提供了一条捷径
不过我暂时还没在dcloud上找到像redis,消息队列等服务调用的文档。不知道以后会不会有