一文读懂什么是serverless和它的重要性

前一阵子,我在公司实习的时候,给小组内做了这样一个分享,今天终于有时间,整理出来。变成一片文章,与您分享。内容是我初次探索 Serverless 架构学习到的一些知识,如有错误的地方,希望您能指出。谢谢。

1. 前言

语言的进化、浏览器的进化、服务器的进化,都是从复杂到简单,底层到封装的过程,而 Serverless 是后端 + 运维作为一个整体的进一步封装的过程,是把运维“外包”出去的服务架构。

2019年,是 serverless 的元年,国内各个云平台(如阿里云,腾讯云,小米云等)提供商都前后推出了 serverless 的试水服务。在国外著名云平台服务提供商 Amazon 和 azure 也早已推出这种服务,并且占据大多数国内市场。serverless 的意义在于不能受制于人,在于空前的提高开发更新迭代的效率。

2. Serverless 发展历程和地位

2.1 从技术的演进来看 FaaS

2.1.1 CGI

CGI,全称 Common Gateway Interface,简单来说就是_把命令行软件执行的结果通过网络输出_。

这种架构下,只有 web 服务器是常驻运行的,后面的 CGI 程序都是按需运行的,运行后就释放资源。于是诞生了一批支持 CGI 协议的脚本语言,比如 perl,php,asp,一方面脚本语言可以粘结 web 服务器和应用程序,另外一方面它本身也可以包含逻辑,于是逐渐出现专门针对 web 的用脚本编写的应用。

这种方式的优势很明显,按需运算,没有调用就几乎没有资源占用,一台机器就能托管大量的中小网站,运维成本也小,只需限制下 CGI 进程的执行时长和内存占用量就行。

但缺点也很明显,每次调用都独立运行一个进程,如果并发量大,进程管理的资源浪费严重。

2.1.2 FastCGI

FastCGI,全称 Fast Common Gateway Interface。常驻内存,socket 或者 tcp 通信。

随着互联网的发展出现了叫做 FastCGI 的技术。这种技术的思路是执行逻辑的进程不再是按需运行,而是常驻方式,web 服务器和 FastCGI 服务之间通过 unix socket 或者 tcp 进行交互。

2.1.3 JavaEE

JavaEE,全称 Java Enterprise Edition。以动态方式把 web 服务器和应用程序合并成同一个程序。

应用按照 Java EE 的规范暴露入口方法,然后打包成独立的发布包,部署到应用服务器中。应用服务器动态将应用加载到内存,相当于以动态方式把 web 服务器和应用程序合并成同一个程序,同时通过多线程而不是多进程来解决并发问题。这种方式兼顾了性能和应用独立发布的需求,同时依托应用服务器可以支持更多特性,所以 Java EE 能广泛占据企业端的市场。

2.1.4 微服务

突破传统单体应用架构的制约,增加应用架构的灵活性。更清晰的职责,更快的交付节奏、更灵活的资源扩展,但是同时也带来了运维复杂度的增加。

使用微服务架构对传统部门带来的无法抗拒的变化:部门组织架构变化、运维复杂度增加、微服务治理(微服务通信、调用链管理、状态管理、健康检查、日志错误跟踪报警排查)等。

2.1.5 Serverless

Serverless:与微服务相似,都是云计算的产物,都强调功能解耦。微服务最小单位:微服务,Serverless 最小单位:函数。目的是一致的:提高应用开发的效率,交付的效率。相比微服务带来的运维复杂度,Serverless 更低。

2.2 从云的发展来看 FaaS

2.2.1 SaaS

SaaS,全称 Software as a Service,购买 -> 租赁

软件即服务,比如 ERP、CRM、邮箱服务等,以软件为粒度提供服务。

2.2.2 IaaS

IaaS,全称 Infrastructure as a Service,硬件虚拟化商品化。

基础设施即服务,比如计算机存储、网络、服务器等基建设施以服务的方式提供。

2.2.3 PaaS

PaaS,全称 Platform as a Service,构建在IaaS之上,提供操作系统安装、监控和服务发现等功能。

随着以 Docker 为代表的容器技术兴起,以容器为粒度的 PASS 部署逐渐成为主流,是最常用的应用部署方式

大中型企业,自有数据中心,将服务部署在自己的云平台上,应对超高访问量情况,在访问量较低时,大量闲置机器作为作为PaaS出售(公有云)

2.2.4 FaaS

FaaS,全称 Function as a Service。

函数即服务,每一个函数都是一个服务,函数可以由任何语言编写,除此之外不需要关心任何运维细节,比如:计算资源、弹性扩容,而且可以按量计费,且支持事件驱动。业界大云厂商都支持 FAAS,各自都有一套工作台、或者可视化工作流来管理这些函数。

2.3 FaaS 服务哪家强?

亚太市场份额,如上,亚马逊AWS(24.1%)、阿里巴巴(15.9%)和微软(11.1%)依然占据了前三名,Google(4.7%)首次被腾讯云(5.8%)反超,位列亚太区第五。[1]

中国市场份额上,1-5名分别是:阿里云、腾讯云、Sinnet(光环新网,AWS中国伙伴)、China telecom(电信)和China Unicom(联通)。[1:1]

2.4 BaaS 的发展

2.4.1 MBaaS

MBaaS,全称 Mobile Backend as a Service,在早些年间,因为安卓和 iOS 的崛起,为移动设备的应用提供基于API的后端服务。后来随着时间的退役,这个概念慢慢被泛化,推广到广义的 BaaS。

2.4.2 广义 BaaS

MBaaS 被逐渐推广到传统的应用领域。

2.4.3 侠义 BaaS

BaaS的叫法就统一了“为移动设备的应用提供基于API的后端服务”和“数据库后台”,“缓存后台”,“mongo后台”,应用可能依赖的一切第三方服务,对象存储、数据库、身份验证、分布式缓存。

2.5 还有什么 XaaS ?

3. 什么是 Serverless

FaaS + BaaS 可以称为一个完整的 Serverless 的实现。

不需要关心代码运行在哪台服务器,无需关心服务器环境、不用担心负载均衡、中间件服务随时调用。

其实前端存在的意义就是解决人机交互问题,大部分场景下,都是一种锦上添花的作用,而不是必须.

Serverless 一般架构1

Serverless 一般架构2

3.1 Serverless 架构示例

假设现在有一个订单系统,使用传统的架构设计,即部署在服务器上的订单系统上的 API 服务调用数据库进行增删改查的业务。

订单系统架构设计

这样一个系统如果用 serverless 来改造,应该是这样子的:

serverless 改造的订单系统架构图

3.2 国内 Serverless 平台

阿里云

阿里云 函数计算

  1. 支持多种触发器

    通过集成的事件源服务产生事件来触发函数执行,通过API/SDK可以直接调用函数。

  2. 支持多种编程语言

    支持多种主流语言,例如Java、Python、NodeJS等。

  3. 细粒度按量收费

    支持毫秒级别的按量收费。

  4. 完备的日志和监控

    从不同的维度查看日志 ,多维度的指标监控。

Serverless 一般架构3:阿里云

腾讯云

腾讯云 无服务器云函数

在微信小程序的应用

微信公众平台 云函数

4. 自建数据中心的重要性

不能被大厂扼住命运的咽喉

高晓松关于“精准收费”和“统一收费”的理论[2]

  1. 5G 时代是运营商的时代
  2. 5G 时代是垄断的时代
  3. 5G 时代是精准收费的时代
  4. 5G 时代是按量收费的时代

比如做自助餐,必然会追求大而全;做音乐,做内容的,也会追求大而全;而运营商,也会天然的想去垄断(中国移动,中国联通,中国电信 之争);

netflix 的推广优惠

高晓松说,现在的宽带收费模式是,按照时间收费,一年宽带 500 元,用或不用,都是 500 元一年。运营商最喜欢的就是成天加班,不怎么用网的用户,最痛心的就是天天了;流量跑满的用户。

未来可能是运营商垄断宽带,宽带按流量收费,或影视流量免费,但影视本身,面相用户,定制化收费。

高晓松

5G 时代必将引起大数据爆发,高速的数据传输会使物联网大规模变成现实;

大数据+物联网,将使内容分发场景被充分打散,app 一统江湖的时代结束,多元化的内容分发共享将成为新的赛道;

如果说 5G 把上层的内容分发场景打散的话,区块链技术就是把内容的推广、付费等等的下游 C 端消费侧行为打散。通过区块链去中心的碎片化功能,交易和传播可以发生在内容消费群体的任何角落。

也就是说:如果我们没有自建的数据中心,如果以后 serverless 流行起来,那么我们要用 serverless 架构的话,费用的定价就会落到其他提供商的手里,就会很大程度上的受制于人。

5. Serverless 的落地开花

基于 hexo 的静态博客把 Serverless 应用到极致

5.1 从前端的演进来看 Serverless

前端的发展历史

ajax 使得前端的角色逐渐分离出来,nodejs 促进了前端的开发模式向传统编程语言靠近(工程化),react 的出现,基本结束了后端常常对前端”技术变化快“的吐槽,至此,前端的技术体系逐步成熟和标准化。

可以说 cdn 是 serverless 理念的的先行者

5.2 What matters in a blog system ?

博客系统的关键因素

5.3 静态博客的优势

5.3.1 打开网站速度快

因为用户在浏览器上访问博客时,只用从服务器(如nginx)拿来编译好的静态资源即可,无需实时从数据库获取博文、图片、评论、访问量等资源,效率极高,打开网站的速度会非常快速 !

5.3.2 无需精通开发和运维

用户可以专心写博客,不用管服务器维护等琐事,够省心

5.3.3 SEO优势

静态博客对SEO天生有优势,各大搜索引擎收录速度比较快

5.3.4 省心部署到GitHub Pages

部署方便,很多静态博客生成器都有一键部署的模块或脚本,可以省心部署到GitHub Pages等服务器上去,避免购买服务器的花费。

5.4 传统博客系统

WordPress

5.5 静态博客

所谓静态博客,即通过工具,直接将作者所书写的博文编译成最终的htmlcssjs等文件。作者/博主,只需将生成的文件部署在静态server上面即可被在互联网中访问。

静态博客生成器

静态博客的架构理念:Serverless

用户直接通过浏览器获得静态资源

5.5 静态博客有哪些?

Hexo

  • 作者:tommy351

  • 主页https://hexo.io/

  • 简介: Hexo是一款基于node.js开发的博客程序,拥有简单的服务器,可用作简单的动态博客使用。也有生成器,生成的静态文件可以一键部署到Github Pages上,也可以部署到任意静态文件服务器上。它相当简约,并且可使用Markdown来编写文章!

hexo主页截图

Jekyll

  • 作者:Tom Preston-Werner,Nick 等

  • 主页https://jekyllrb.com/

  • 简介: Jekyll 是一种基于Ruby开发的、适用于博客的静态网站生成引擎。使用一个模板目录作为网站布局的基础框架,提供了模板、变量、插件等功能,最终生成一个完整的静态Web站点。即只要安装Jekyll的规范和结构,不需写html,便可生成网站。

Jekyll主页截图

Hugo

  • 作者bep, spf13

  • 主页https://gohugo.io/

  • 简介:Hugo是一个用Go语言编写的静态网站生成器,它使用起来非常简单,相对于Jekyll复杂的安装设置来说,Hugo仅需要一个二进制文件hugo(hugo.exe)即可轻松用于本地调试和生成静态页面。

Hugo主页截图

作为一个博客,谁最了解博客,谁最在意博客的UI?那当然是前端的朋友们了,所以hexo就是当仁不让的不二之选。

而且hexo插件丰富主题繁多,多到琳琅满目,应接不暇。而且使用的中国人超级多,很容易就能寻得帮助。

不仅是hexo群聊很多,某些主题也会建立自己的群聊

笔者使用过hugo,使用过程太过复杂,概念生僻;全程英文;遇到问题基本处于孤立无援状态;而且主题大部分都其丑无比,没有满意的效果。

反观hexo,使用相对而言简单很多,而且主题很漂亮炫酷。故此我们本教程选用hexo来作为静态博客生成器。

5.6 Hexo 生命周期

5.6 UV、PV

不蒜子统计

5.7 评论系统

Valine

Gitment

Gitalk

5.8 持续部署:CircleCI

6. 把 Serverless 做到极致?

有一个叫做 PWA 的概念,概念有点类似于微信小程序,和MIUI的快应用,但是比他们更简单,没有平台依赖性,你只需在浏览器中访问支持PWA的网页,就能收到安装提示。

PWA

这里附上两篇我自己写的文章,可以让您把 serverless 应用到极限。

  1. PWA踩坑记-从零到一让你的博客也能离线访问

    https://tellyouwhat.cn/p/pwa-your-blog-can-also-be-accessed-offline/

  2. TWA踩坑记-从零到一让你的博客变成app并上架商店

    https://tellyouwhat.cn/p/twa-you-blog-can-become-an-app/

7. 书籍推荐

深入浅出Serverless(技术原理与应用实践)

您可以在https://item.jd.com/12506392.htmlhttps://www.amazon.cn/dp/B07LD4KXG3买到这本书

8. PPT

9. 参考资料


  1. 中国云市场 谁在挑战阿里云、腾讯云? https://www.cnbeta.com/articles/tech/828555.htm ↩︎ ↩︎

  2. 晓说 第204期 一场没有“诗和远方”全是苟且的演讲 https://www.youtube.com/watch?reload=9&v=TyEwgPxNq0w ↩︎


   转载规则


《一文读懂什么是serverless和它的重要性》 Harbor Zeng 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
如何使用docker搭建hadoop的cdh版本单节点伪集群开发测试环境 如何使用docker搭建hadoop的cdh版本单节点伪集群开发测试环境
前言 docker 是一个容器化技术的程序。不仅适用于微服务集群部署,而且作为开发者个人使用,也是十分方便的,比如我们可以快速安装数据库,缓存等中间件,丝毫不影响物理机的系统环境,不会因为卸载,更新等,带来不可预知的问题,也减少了重装系统的可能性。 在容器化技术,docker 一直走在前列,docker 是用 go 语言编写的一个容器平台,他的基本单位是容器,每个容器就像一个独立的操作系统一样
下一篇 
在JavaScript中元素id和name可以当做全局变量直接调用 在JavaScript中元素id和name可以当做全局变量直接调用
HTML标准API之异端邪说:id和name可以不用getElementBy和querySelector(all)即可直接当做全局变量使用。 现象 偶然一次浏览到别人的项目,发现https://github.com/zjcqoo/zjcqoo.github.io他的html代码写法好奇怪,直接把html里面标签的id当做变量来使用。 <!doctype html><html&g
  目录