ServerLess技术探索

915 阅读9分钟

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开发,就是云函数开发?我们先不解答,先看一些概念。

  1. Faas,function as a service,函数即服务,又叫云函数,函数作为一个组件/服务,为用户提供一种能力。这些能力包括:web服务、网络站点。

  2. Baas,backed as a service,后端即服务,针对移动应用提供边界服务,主要包括后端开发中的中间件、资源池、消息通知、LBS、周边SDK等提供的后端服务。

    那Faas === ServerLess吗?从开发者的角度出发,我们使用ServerLess的模式,大多数情况下,就是在写一个个的云函数,但是云函数只是一种事件,我们在这个云函数中,会驱动一些其他的东西,比如查数据库,得到了结果,然后再返回给用户。其中,那些和数据库,或者第三方交互的地方,我们不能称之为Faas。那些提供应用开发的数据库、缓存等一系列功能的东西,应该叫Baas。

    所以,大多数情况下,应该是ServerLess = Faas + Baas;

  3. Laas,infrastructure as a service,基础设施即服务,基础性的软硬件设施服务,包括docker、k8s等。这是ServerLess的基石。我们所有的ServerLess应用的想象空间,都是基于这个前提下,才能实施。

    此外,还有其他的一些概念,比如Paas、Saas等等。

从运维的角度看待ServerLess技术

说起Serverless,我们不得不从运维的角度,来看待ServerLess这门技术。我们可以简单的把运维的工作,分为三个阶段,每一个阶段,运维的工作截然不同。

  1. 最初始的运维模式

    在这个阶段,我们需要熟悉大量的工作所需的组件,比如服务器、nginx、tomcat、mysql、redis、mq、kafka,运维的工作非常复杂,需要把一个一个的项目,根据项目类型的不同,所需要的组件不同,把一个一个的项目部署到服务器上。

    当然,复杂性不仅仅是这些,同样的代码,所依赖的环境也不一样,有些在windows下可以运行,有些在linux系统上可以运行。同样的代码,所依赖的第三方版本库不一致,也有可能导致代码运行的各种问题。

  2. docker技术

    那上面的运维的工作,解决方案是什么?对,就是docker,docker的本质,就是统一了硬件环境的差异。docker是一个标准的linux系统,它可以运行在任何服务器上(linux、windows),但是它的内部,提供了软件运行的统一环境,部署一种服务,我们可以选择组建不同的镜像环境,所谓的镜像,就是把依赖的软件环境,固定下来,比如node8,比如Java1.8,比如redis某个版本之类。

    这样的好处,就是只要一个运行环境确定下来,想做机器的扩容、资源的编排治理,都非常的方便。k8s,就是对docker进行编排治理的工具。

    这时候的运维的工作,效率提升了,人力成本也节省了。

  3. ServerLess

    ServerLess的基础服务提供商,其实只有那些大公司,才玩得起,这个阶段,这些大的服务器厂商,把运维的工作,已经做的非常好了,同时也提供了各种便于开发者利用的周边生态,让开发者不必关注服务器运维和部署相关的知识,只专注当下的应用开发。

    也就是说,在理想的Serverless开发模式下,我们做一个应用,不需要运维的工作。

淘宝开放平台-Serverless开发

淘宝方面的ServerLess开发,又叫云服务,前端开发工程师,只需要在淘宝开发者工具里面,就能完成一个具有前端、数据库、接口能力完全具备的业务应用。

具体的开发细节,不在文章的探讨内容之内,我们重点是需要理解,淘宝小程序的ServerLess开发,到底由哪些模块组成。以及这些模块之间的关系。

淘宝开发者工具

主要的作用,就是进行小程序开发,云服务的开发。以及这些应用的上传、应用的关联等等。

小程序的开发,主要是遵循淘宝开放后台,商家应用的开发规范就行。它有相关的语法规则、文件结构等等。

云应用(ServerLess)

一个标准的小程序应用,如果使用云应用的模式开发,它的目录结构是这样的。

image.png

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;
  }
};

我们可以看到,该云函数,提供了一个简单的列表查询的能力。

云函数可以直接发布,可以选择发布不同的环境:测试、预发、线上等。

在淘宝开发者工具中,我们可以可视化的看到,已经发布的云函数有哪些,如下图所示:

image.png

数据库

云函数会对数据库进行操作,比如数据的增删改查等功能,我们的ServerLess开发,并不是说,没有真实的数据存储,它本质上还是会存储到各个厂商的云服务器中,但是我们无需关心它是怎么存储的。在淘宝开放平台中,给我们提供了可视化的数据库表的新建、删除、更改的能力。

image.png

比如,这样的一个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/