02 概念新知:到底什么是 Serverless

文章详细介绍了Serverless架构的广义和狭义概念,指出Serverless并非真的无服务器,而是开发者无需关心服务器运维。它强调了自动弹性伸缩、按量付费等特点,并通过FaaS和BaaS的组合来实现。文章还讨论了Serverless的优缺点,包括依赖第三方服务、底层硬件的多样性和性能瓶颈等,并指出Serverless是云原生的一种实现方式。

上一讲我讲了 Serverless 架构兴起的必然因素,在这个过程中,我简单提到了 Serverless 的概念,相信你对 Serverless 已经有了初步的认知,这节课我将继续深入剖析到底什么是 Serverless。

有不少刚接触 Serverless 的同学会认为 FaaS 就是 Serverless,也有同学认为 PaaS 也是 Serverless,还有同学说使用 Serverless 就没有服务器了。总的来说,很多同学对 Serverless 到底是什么并没有一个很清晰的认知,概念还比较模糊,所以咱们就用一节课的时间,搞定这个概念。

在我看来,你可以从广义和狭义两个角度入手,这样会更清楚 Serverless 的特点,对它有个整体的认知。先来看一下广义上的 Serverless 是指什么?

广义的 Serverless

在我看来,广义的 Serverless 是指:构建和运行软件时不需要关心服务器的一种架构思想。 虽然 Serverless 翻译过来是 “无服务器”,但这并不代表着应用运行不需要服务器,而是开发者不需要关心服务器。而基于 Serverless 思想实现的软件架构就是 Serverless 架构。

那与 Serverless 对应的概念就是 Serverful。回顾01 | 前因后果:Serverless 架构兴起的必然因素是什么?”中的电商网站,我们直接在虚拟机上部署网站的架构,就是 Serverful 的架构,在这种架构下,如果要保证网站持续稳定运行,就需要解决很多问题。

  • 备份容灾: 要实现服务器、数据库的备份容灾机制,使一台服务器出故障不影响整个系统。

  • 弹性伸缩: 系统能根据业务流量大 小等指标,响应式地调整服务规模,实现自动弹性伸缩。

  • 日志监控: 需要记录详细的日志,方便排查问题和观察系统运行情况,并且实现实时的系统监控和业务监控。

解决这些复杂的问题需要投入大量的人力、物力,小公司几乎无法自己去解决。而对开发者来说,Serverful 的架构开发成本也非常高,原本几行代码就可以搞定一个简单的业务逻辑,但你却得添加庞大的框架,比如 RPC(Remote Procedure Call,远程调用)、缓存等。

Serverless 就是为了解决这些问题诞生的。 它可以把底层的硬件、存储等基础资源隐藏起来,由平台统一调度、运维。并将常用的基础技术抽象、封装(比如数据库、消息队列等)以服务的方式提供给开发者。开发者只专注于开发业务逻辑,所有业务无关的基础设施,都交给 Serverless 平台。

总之, Serverless 和 Serverful 的架构有这样几个区别。

  • 资源分配: 在 Serverless 架构中,你不用关心应用运行的资源(比如服务配置、磁盘大小)只提供一份代码就行。

  • 计费方式: 在 Serverless 架构中,计费方式按实际使用量计费(比如函数调用次数、运行时长),不按传统的执行代码所需的资源计费(比如固定 CPU)。计费粒度也精确到了毫秒级,而不是传统的小时级别。

  • 弹性伸缩: Serverless 架构的弹性伸缩更自动化、更精确,可以快速根据业务并发扩容更多的实例,甚至允许缩容到零实例状态来实现零费用,对用户来说是完全无感知的。而传统架构对服务器(虚拟机)进行扩容,虚拟机的启动速度也比较慢,需要几分钟甚至更久。

所以,一个应用如果是 Serverless 架构的,必须要实现自动弹性伸缩和按量付费,这也是 Serverless 的核心特点。

狭义的 Serverless

广义的 Serverless 更多是指一种技术理念,狭义的 Serverless 则是现阶段主流的技术实现。之所以说是狭义的,是因为 Serverless 架构正在持续发展中,未来可能有更好的技术方案。

在我看来,狭义的 Serverless 是 FaaS 和 BaaS 的组合,为什么呢?

Drawing 0.png

Serverless 架构图

为了弄清楚这个问题,你需要对 FaaS 和 BaaS 有更多的了解。在 01 讲,我简单地提了 FaaS 和 BaaS 的概念,接下来我从一个案例入手,带你对其进行更深入的剖析。

假设你要实现一个接口,返回一个数组,你用的是 Node.js,传统的写法如下:

// index.js
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
// 定义 /list 路由
app.get('/list', (req, res) => {
  const data = ['a', 'b', 'c'];
  // 返回 data 数组<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源码头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值