ServerLess到底是什么?
Serverless的概念,很火,但是具体能说清楚,什么是ServerLess的开发者,很少。
在云积分的业务开发中,由于云积分是各个电商平台的ISV,特别是淘宝平台,做了很多的淘宝小程序应用,有了ServerLess的使用场景。并且在今后的业务开发中,ServerLess的模式,也是淘宝小程序开发的主要方式。
ServerLess
ServerLess,是Server和Less两个单词的合拼,Server是指“服务”的意思,Less是“少,没有”的意思。直接翻译过来就是“无服务器”的意思。
官方的概念解释是这样的:Serverless 是指构建和运行不需要服务器管理的应用程序的概念。
我个人理解的服务器管理,就是没有了运维工作的意思。
我们再看看一段英文,对于ServerLess的解释:
Serverless computing is a method of providing backend services on an as-used basis. A Serverless provider allows users to write and deploy code without the hassle of worrying about the underlying infrastructure. A company that gets backend services from a serverless vendor is charged based on their computation and do not have to reserve and pay for a fixed amount of bandwidth or number of servers, as the service is auto-scaling. Note that although called serverless, physical servers are still used but developers do not need to be aware of them.
翻译过来的中文是这样的:
无服务器计算是一种按需提供后端服务的方法。无服务器提供程序允许用户编写和部署代码,而不必担心底层基础结构。从无服务器供应商处获得后端服务的公司将根据其计算费用,而不必保留和支付固定数量的带宽或服务器数量,因为该服务是自动扩展的。请注意,尽管称为无服务器,但仍使用物理服务器,但开发人员无需了解它们。
一些社区的相关概念
了解上面的概念,还是不够的,我们还需要了解社区,针对ServerLess的一些周边概念。
比如,有人说,ServerLess开发,就是云函数开发?我们先不解答,先看一些概念。
-
Faas,function as a service,函数即服务,又叫云函数,函数作为一个组件/服务,为用户提供一种能力。这些能力包括:web服务、网络站点。
-
Baas,backed as a service,后端即服务,针对移动应用提供边界服务,主要包括后端开发中的中间件、资源池、消息通知、LBS、周边SDK等提供的后端服务。
那Faas === ServerLess吗?从开发者的角度出发,我们使用ServerLess的模式,大多数情况下,就是在写一个个的云函数,但是云函数只是一种事件,我们在这个云函数中,会驱动一些其他的东西,比如查数据库,得到了结果,然后再返回给用户。其中,那些和数据库,或者第三方交互的地方,我们不能称之为Faas。那些提供应用开发的数据库、缓存等一系列功能的东西,应该叫Baas。
所以,大多数情况下,应该是ServerLess = Faas + Baas;
-
Laas,infrastructure as a service,基础设施即服务,基础性的软硬件设施服务,包括docker、k8s等。这是ServerLess的基石。我们所有的ServerLess应用的想象空间,都是基于这个前提下,才能实施。
此外,还有其他的一些概念,比如Paas、Saas等等。
从运维的角度看待ServerLess技术
说起Serverless,我们不得不从运维的角度,来看待ServerLess这门技术。我们可以简单的把运维的工作,分为三个阶段,每一个阶段,运维的工作截然不同。
-
最初始的运维模式
在这个阶段,我们需要熟悉大量的工作所需的组件,比如服务器、nginx、tomcat、mysql、redis、mq、kafka,运维的工作非常复杂,需要把一个一个的项目,根据项目类型的不同,所需要的组件不同,把一个一个的项目部署到服务器上。
当然,复杂性不仅仅是这些,同样的代码,所依赖的环境也不一样,有些在windows下可以运行,有些在linux系统上可以运行。同样的代码,所依赖的第三方版本库不一致,也有可能导致代码运行的各种问题。
-
docker技术
那上面的运维的工作,解决方案是什么?对,就是docker,docker的本质,就是统一了硬件环境的差异。docker是一个标准的linux系统,它可以运行在任何服务器上(linux、windows),但是它的内部,提供了软件运行的统一环境,部署一种服务,我们可以选择组建不同的镜像环境,所谓的镜像,就是把依赖的软件环境,固定下来,比如node8,比如Java1.8,比如redis某个版本之类。
这样的好处,就是只要一个运行环境确定下来,想做机器的扩容、资源的编排治理,都非常的方便。k8s,就是对docker进行编排治理的工具。
这时候的运维的工作,效率提升了,人力成本也节省了。
-
ServerLess
ServerLess的基础服务提供商,其实只有那些大公司,才玩得起,这个阶段,这些大的服务器厂商,把运维的工作,已经做的非常好了,同时也提供了各种便于开发者利用的周边生态,让开发者不必关注服务器运维和部署相关的知识,只专注当下的应用开发。
也就是说,在理想的Serverless开发模式下,我们做一个应用,不需要运维的工作。
淘宝开放平台-Serverless开发
淘宝方面的ServerLess开发,又叫云服务,前端开发工程师,只需要在淘宝开发者工具里面,就能完成一个具有前端、数据库、接口能力完全具备的业务应用。
具体的开发细节,不在文章的探讨内容之内,我们重点是需要理解,淘宝小程序的ServerLess开发,到底由哪些模块组成。以及这些模块之间的关系。
淘宝开发者工具
主要的作用,就是进行小程序开发,云服务的开发。以及这些应用的上传、应用的关联等等。
小程序的开发,主要是遵循淘宝开放后台,商家应用的开发规范就行。它有相关的语法规则、文件结构等等。
云应用(ServerLess)
一个标准的小程序应用,如果使用云应用的模式开发,它的目录结构是这样的。
client部分:也就是小程序的部分。遵循小程序的语法。
server部分:也就是提供云服务的部分,也就是一个一个的云函数,提供各种服务的能力。
一个标准的云函数代码如下:
exports.main = async (context) => {
const cloud = context.cloud;
const collectionName = 'users';
try {
// cloud,就是提供的基础的数据库操作的sdk,其中“users”就是需要连接的数据库,本次操作的功能就是查询所有的users表中的数据。
const res = await cloud.db.collection(collectionName).aggregate([{
$match: {}
}]);
return {
code: 200,
msg: 'ok',
data: res
};
} catch (e) {
console.log(`添加失败!, 请先在IDE中创建集合 users (${context.env}环境)`);
return e;
}
};
我们可以看到,该云函数,提供了一个简单的列表查询的能力。
云函数可以直接发布,可以选择发布不同的环境:测试、预发、线上等。
在淘宝开发者工具中,我们可以可视化的看到,已经发布的云函数有哪些,如下图所示:
数据库
云函数会对数据库进行操作,比如数据的增删改查等功能,我们的ServerLess开发,并不是说,没有真实的数据存储,它本质上还是会存储到各个厂商的云服务器中,但是我们无需关心它是怎么存储的。在淘宝开放平台中,给我们提供了可视化的数据库表的新建、删除、更改的能力。
比如,这样的一个users表,里面有两个字端,分别是name、age。
腾讯云-Serverless开发
腾讯云的ServerLess开发,和淘宝小程序有很大的差异(至于为什么,后面解释),腾讯云它更多的是以提供一种广义的解决方案,它提供了一个npm包 —— serverless。
ServerLess,在国际上,也是有一定的标准的,腾讯云基于国际上的标准,实现了自身针对serverless的标准提供了自身的解决方案。
tips:不过,根据个人的思维,ServerLess想要在整个行业内统一,是一件非常困难的事情,因为ServerLess的底层就是各大厂商的云服务器,Serverless标准的制定,本质上是云服务在整个市场上的占比问题,但是显然,toB的服务,它不像toC,能够那么容易一统江湖,它更多的是客户关系以及客户的各种需求驱动的。
所以,serverless开发并不是没有缺点的,它的很大的局限性,是由于分裂的云服务厂商所决定的,不同的云服务厂商,在实现serverless的标准的时候,都不一致。
根据文档,使用腾讯云的ServerLess,首先需要全局安装serverless。
npm i -g serverless
然后,我们使用sls命令,对一个服务进行初始化、开发、发布等一系列操作。
腾讯云的ServerLess的标准,主要体现在一个文件中,每一个腾讯云的serverless项目,都必须要有。
serverless.yml
component: website
name: websiteDemo
app: serverless-demo-139616b4
inputs:
src:
src: ./src
index: index.html
error: index.html
region: ap-guangzhou
bucketName: my-website-starter
protocol: https
ServerLess产生的意义
大家一直在思考一个问题,就是前端的边界是什么?现在的前端,早已经不是以往的web开发工程师,他可以做小程序、做App、做桌面应用,甚至做服务端。那么,前端的短板在哪里?其实前端的短板就是运维能力、服务并发能力。
ServerLess的诞生,本身就解决了这样的问题,我们不需要关注运维、部署、并发这一类问题。我们可以真正的聚焦于业务。这时候,我们不应该称自己为前端开发工程师,其实应该叫应用开发工程师/云端开发工程师。我们这个时候,不需要运维,甚至不需要后端,直接使用前端ServerLess技术,解决企业的所有问题。
相关资料
ServerLess中文网:serverlesscloud.cn/
ServerLess开发:cn.serverless.com/