🌀 serverless 时代和云计算时代
!本篇文章过于久远,其中观点和内容可能已经不准确,请见谅!~
想分享的是 serverless 的理解,保持眼界开阔,思考能力的价值,拥抱变化~~~
听起来很高大上,火的不要不要的词,看了 n 篇文章也不知道是什么,都在说思想多好多好,什么 Faas、Baas、无服务化、云原生之类的词,看的更迷糊了。
其实:
serverless 就是不需要买/租服务器就能把程序运行起来。
小朋友有很多问号:
- 那程序放到哪? 放到云服务商提供的云函数里面。
- 怎么提供服务? 一个云函数可以使用 http 被客户端访问返回响应,或者云存储里面的文件变动事件触发执行动作等。
- 调用数据库怎么办? 数据库、文件存储、日志等使用 Baas 服务调用接口或者 SDK,也可以通过网关路由访问传统数据库。
- 怎么写代码? serverless 更强调的是部署和运行,除了调用后端和无状态,其他和以前一样。
- 怎么部署和运行? 可以在云函数提供的在线编辑器,或者上传代码等方式到运行环境,不再需要自己处理环境、监听端口之类的。
那租服务器就可以,为啥用这个别扭的方式部署运行呢?
- 买 IDC 服务器不好扩容伸缩就直接不说了。IaaS 云服务器可以扩容伸缩,但是如果要负载均衡和分布式,和传统的服务器一样做集群,包括维护都是成本。
- serverless 不用管部署、架构或运维,只要你的代码逻辑没问题,再大的访问量都能自动承载,最后按需付费即可。
- 大厂在使用之后的结论说部署和运维的工作能减少 80%以上,非常可观。
serverless 不是一个技术、不是一个产品、不仅仅是 faas + baas、不是没有服务器、不只是可扩容、更不是某一个解决方案。。而是一个概念、一种实践思想、一种目标。有很多的具体产品、解决方案、很多的架构能够实现 serverless。
那 serverless 的定义从字面意义 “无需关心服务器” 来看:
- GitHub Pages 静态网站托管算不算 serverless?
- CDN 算不算是 serverless?
- 对象存储算不算是 serverless?
- githooks 触发,或者定时运行的第三方持续构建服务算不算是 serverless?
- 压缩包文件上传,触发的对象存储中的解压程序算不算是 serverless?
按照我的理解,这些都算,因为没有一个需要登录服务器,没有一个知道服务器或者代码在哪,不需要关心,这样这种思想来说这些服务虽然之前就存在,但是确实是实打实的不关系服务器,仅是这样我们的开发和部署就已经变得很轻松了。
serverless 更有前景,更加复杂,需要考虑比较多的是:“可伸缩” 的 “计算能力” 的 “不关心服务”,更强调在无需关心服务器的前提下,整个计算能力封装的解决方案,使得我们的计算能够根据承载需求尺度可变,用的时候才会有服务器运行计算。最终达到这样一个目标:
没人使用不付费、随时待命触发计算、能够无人介入的承载不同量级的计算需求、最后根据使用量付费。
云服务商费劲吧咧的推广 serverless,一方面解放中小公司的生产力,能够聚焦到更有意义的业务层面。另一方面也是修筑了更高的业务城墙,Baas 和 Faas 的实现如果迁移起来,将会是不可能完成的任务。
云服务商类如国内阿里云和腾讯云,一直在拼命地安利 serverless 的革命性,确实不可否认是很好的能力,对于他们内部利益相关的技术团队使用更加标准灵活的方案,对于成本、效率都是最优的,但是对于别的公司可能并没有那么美好。
一般中小型公司想要使用这种 serverless 的模式,从头开发的成本很高,无力实现,所以只能采购云服务商的方案,而每一个云服务商的 Faas 和 Baas 都是自成体系的,选了一个就很难后期迁移到自己的机房或者更换云服务商了,这也是很多技术人都很看好技术本身,但是没有大规模进入的原因。
所以云服务商提供这些能力,然后到处技术输出安利,也是一种圈地的表现,甚至有人说这是基建的垄断也是有一定的道理。从这个角度来说,非常希望业内能够将 FaaS 和 BaaS 技术和连接都标准化,或者开发出类似容器标准的架构,不过这个很不符合各个厂商自己的利益。
serverless 更多是在说怎么能不用管底层实现,按照规则无脑写业务就行的开发体验,写代码到 FaaS 部分提供计算和服务,调用 BaaS 部分的后端存储。所以并不会改变客户端范围写代码的姿势,还是要拼组件、调接口、写业务。
但是 serverless 降低了后端架构的成本和门槛,那些很重量的分布式、微服务、容器化等架构和玩法,在无状态的规则下很自然的抽象到了底层,能够更细粒度的实现架构与维护的标准化,能够让前端的开发有能力尝试提供可控的服务能力。
比如之前前端如果想要搭建面向前端的轻量中台 BFF 业务,比如接口聚合、服务器渲染等,但是负载、扩容、维护等没有后台的支撑很难搭建的起来,也就不了了之了。现在 Faas 可以根据需要自动水平扩展,后端的数据库、文件服务、消息推送、日志等以前需要精心设计互相连接,现在可以被 Baas 直接接管。整个后端的支持部分成本降低,只需要取数据、计算、返回,或者接受数据、计算、存进去,这些前端也能够玩得转了。
和 serverless 一定程度比较像的是 CDN,对于上层来说没有服务器的概念,可以水平扩展。 serverless 就相当于把计算和服务推送到云函数,怎么分发、怎么提供服务都不用管。
与前端联系比较紧密的业务上除了接口聚合(BFF)、服务器渲染(SSR),小程序的云函数是一个结合比较好的方案,WebIDE 各个大厂也在投入精力与 Serverless 结合实现轻量级开发的体验。
抛开前端的视角考虑,之前成本很高的后端,需要考虑业务扩张、技术栈选用、数据架构等,分布式、微服务、容器化、集群等名次相信让很多人头疼,可能团队太小、成本太高、安全性、维护成本、迁移成本等因素,导致预想太远拖累业务,或者后期流量上来遇到瓶颈。
Iaas、Paas、Baas 的介入缓解了一部分的工作量,但是实际业务的搭建依然需要手工定制,毕竟怎么做微服务、怎么实现路由网关、怎么划分集群、编排容器等工作每个公司都不相同,但是目前 serverless 的出现让这部分标准化了很多,更细粒度的切分业务,然后把部署和运行的工作甩了出去,只要业务无状态分离,水平扩展就很容易被接管了。
当然 serverless 提供的思想不一定非要实现全链路的去服务器,比如中间层做成无状态的话就能够很容易 scale out,划出集群来承载类似的去服务器在一些公司也是可以尝试探索的。
serverless 改变了传统的业务部署运行模式,可以让你不需要租服务器,不需要拿 IP 地址,不需要考虑扩容、不需要考虑服务器在哪。你只需要知道把代码交给 serverless,就能访问得到,运行得了,最后按需收到账单。
如果对以前 “云主机” 这个概念比较熟悉的话,可能有点似曾相识,当时也是将代码传到别人家的服务器上,配置虚拟域名就能够访问了,php + mysql 的架构,其中共享资源是最大的安全问题。
serverless 这方面也有一定的隐患,因为毕竟就算有安全沙箱也是在内核安全的基础上,现在内核安全都没办法保证的情况下,宿主机上的容器就很有可能被恶意影响,轻则计算能力被占用,重则业务数据泄露。
React、Vue 单页应用愈发火热,原理上无法避免的白屏却很影响用户体验,前端于是实现 SSR 服务端渲染直出方案来改进这块的表现,初心很美好,但是需要服务器资源运行,这对于前端就有点困难了,因为不太能搞得定比如多少台机器、怎么部署、业务量、高并发、扩容、配置路由这些问题,最好有办法能让前端不用管这些,传统的选择可能需要容器集群,但是现在 serverless 的成本更低,一个函数即可。
- 通过 http 请求触发(涉及到的云网关、路由、负载均衡等不用管)
- 执行到云函数(拉起运行容器,高并发量下能自动扩容启动更多容器服务)
- 调用副作用(无状态的请求过来,通过副作用调用用户数据、日志监控、文件存储等,比如拿到用户数据)
- 云函数获取参数、计算(这部分是具体的业务部分,比如 node 环境使用
ReactDomServer.renderToString
输出内容) - 返回(返回到 http 的 response)
这样一个轻量级开发,但是有很大业务弹性的业务就完成了。
比如一个完整论坛的开发,需要很多的接口和页面。传统开发就需要接口服务器、数据库服务器、文件服务器,负载均衡、集群管理、内部的消息服务等,需要写很多的辅助和支持代码才能让这些运行起来,维护部分就更不用说。好在其中的逻辑都是自己的,就算迁移到云服务器,也一样的能迁移下来,只是部署在哪的问题。
现在 Serverless 时代呢?只需要关心三个逻辑:云函数的服务和计算 + 对象存储的文件 + 数据库的记录,非常省心,而且水平扩展都是没问题。方案呢可选:阿里的 Function Compute + OSS + TableStore 或者 腾讯的 SCF + COS + CynosDB 都能实现我们的需求。
AWS 探索的比较早:API Gateway + Lambda + DynamoDB + S3 + SNS + DynamoDB Streams + SES + Cognito 一整套。
- 静态页面部分可以托管到对象存储中
- 动态页面可以使用 serverless 云函数拿到请求,根据需要返回 html 页面
- API 接口部分可以使用 serverless 云函数,读取 BaaS 的数据库,然后计算或组合数据,返回 json 响应
- 头像、上传文件等可以使用 serverless 云函数,调用 对象存储的接口存取
这也算是一直追求从代码到服务的最短路径。
Serverless 以无服务器运行的概念来说,我个人用了一些场景,博客(构建、部署、对象存储等)和个人工作流服务(数据存储、API 等,用来做任务清单、阅读追踪、笔记等),因为成本的问题,用到了很多免费的服务搭建。
下面是涉及的一些 Faas 或者 Baas 服务:
- 腾讯云 COS 对象存储可以提供静态网站的托管,包含有、index 索引、404 定向、CDN 的功能,算是一种 Serverless 的形式。
- 腾讯云函数 SCF 写了一个解压服务,上传到 COS 的某个目录,能够自动运行解压到 COS 中展开,实现静态网站的自动部署,是 FaaS。
- 腾讯云函数 SCF 写了一个 JSON 存储功能,提供数据的解析、存储和服务。
- LeanCloud 的云引擎,云函数的概念,提供了一个自动回复的服务,通过 API 调用,在 FaaS 写了一些代码,然后读取 BaaS 的存储服务,最后响应一些数据。
- LeanCloud 的数据存储、即时通信、短信、消息推送、社交后台等,腾讯云 COS、七牛云存储等,通过 REST API 能够访问,这些都是标准 BaaS 的范畴。
经典的全流程、发挥全部威力的 Serverless 提供服务还没有使用,比如后端 API、网站输出、构建、SSR 等场景没有尝试,不过感觉应该会挺有意思。
容器(Docker)、服务编排(Kubernetes)等能力将云计算的发展开上了快车道。各种分布式应用、大规模计算平台等现代架构的发展也释放了云计算的想象力。无服务器(Serverless)、微服务(Micro-Service)、云原生(Cloud Native)、服务化网格(Service Mesh)等都是现在很新潮的技术关键词,越来越细粒度的标准,让运维成本、开发成本越来越低,当然这也是云服务商不断推进的进步。
从 ‘云’ 这个概念出现以来,一直在演进分化,现代的云包括从单机云服务器,到大型分布式集群,再到云原生、服务化网格等,云这个字已经走了很远,我们程序员也在不断地适应这个时代,数字化的时代、信息爆炸的时代、技术飞速发展的时代、实现自己价值的时代。
保持眼界开阔,思考能力的价值,拥抱变化~~~
感谢您的阅读,本文由 Ubug 版权所有。如若转载,请注明出处:Ubug(https://ubug.io/blog/serverless-and-cloud-compute)