serverless简述
serverless翻译成中文: 无服务器,这并不代表着应用运行不需要服务器,而是说对开发者而言,写代码时就不需要关心服务器的问题了。
serverless面向的函数,正如同SOA架构体系中面向的是服务,Java面向的是对象。
在我看来,serverless的主要目的就是提升开发效率,随着底层基础设施越来越完善,开发者几乎不用再关心服务部署、系统管理、日志等问题,只需要关心怎样以最快的速度把代码变成函数,或者说服务;
那么对serverless整体架构而言,那么就得需要具备以下能力:
- 利用现成的资源能力:包括基础服务、数据库资源、缓存资源以及其他PaaS资源,以供上层函数调用;
- 集成所能集成得一切:不仅是部署代码,还应该把管理态的信息集成在一起,这样对于开发者而言,我既然开发人员,也可以是运维人员;
体系结构阐述
研发运维一体化
方案
severless的体系主要聚焦的是:
- 前台业务开发变轻,只关注业务逻辑的实现,进而提升研发效率;
- 后台基础能力变厚,提供丰富的可复用能力,提升系统的稳定性;
根据不同的业务场景,我们可以来定制不用的severless方案,比如低代码、微应用、云端一体化以及其他根据租户的需求来定制的方案;
- 低代码:通过可视化的图形界面来拖拉拽业务逻辑组件,而后生成逻辑代码并部署到serverless上,可以快速响应业务需求;
- 云端一体化:做到在云端开发跟在本地开发一体化,消除开发环境与运行环境的差异,开发者只需要聚焦业务逻辑的实现;
- 租户个性化定制:根据租户的业务个性化场景,来定制相应的解决方案;
Serverless 方案定制能力来完善云端一体研发者市场,提供开发者更多选择、打造云端一体的研发集成闭环来提供业务更快的交付速度、以及业务低成本的使用基础 BaaS 服务能力以及业务 BaaS 成为研发平台的核心抓手。
从研发到交付再到运维
对开发者而言,使用serverless的目的是为了达到快速的开发交付;
- 创建
开发人员可以在serverless初始化一个项目,可以在serverless管理平台上创建项目、创建应用、配置好环境变量、选择租户等等,就可以着手进行项目的开发;
- 研发
研发就是一个不断敏捷迭代的过程,在serverless管理平台上提供对迭代的版本管理功能,以及支持对页面的定制、模块的开发,开发人员还可以从BaaS市场上开通指定的服务能力用到开发的函数当中;
在本地IDE中,平台可以提供一系列的ide插件,进而可以将本地代码连上云端的环境,进行调试;
- 交付
研发后的代码就直接可以上传到serverless管理平台上,然后就可以走上线流程了;
平台提供了版本控制、回退、灰度发布等功能,还可以根据租户的需求来进行上线流程的定制;上线到生产环境开发者还可以配置预案,针对异常情况的处理。
- 运维
在serverless视角上,开发人员不仅是开发者,也可以是运维人员,所以开发者可以在serverless管理平台上进行日常的运维操作;
平台提供实时可视化的日志查询功能,可以自动或手动对函数资源进行扩缩容、设置实例驻留时长、以及手动的应急操作等功能;此外,平台会实时记录函数的调用量,针对流量生成费用账单;
租户
平台可以根据不同多租户需求来定制个性化的方案;
租户入驻平台后,可以针对业务场景、或者地市需求,来定制不同的研发方案、上线流程以及运维手段等等。
平台上的每个租户都有对应的租户管理员,对各自租户的函数稳定性负责,包括租户下函数的单元化部署规则、大促管控、自建网关配置、容器额度、租户私有解决方案等,为此平台提供了一系列运维工具。
BaaS
让开发着选择使用serverless,一个最重要的点就是要提供丰富的后端资源服务,即BaaS;
BaaS包括业务能力BaaS和基础能力BaaS,以及对这些BaaS能力的管控;
业务BaaS
我们可以将已实现的业务场景微服务化,比如业务中台的微服务化,进而尽可能的多去复用这些服务,比如产商品中心、政企中心、客服中心的微服务;未进行微服务化的业务同样也可当作BaaS,只要这些业务能够稳定的运行,比如发布在服务集成平台(ESB)上的服务。
基础BaaS
我们可以将底层的资源作为服务提供出去,比如数据库、消息队列以及其他PaaS中间件;
我们同样可以将一些通用的能力视为BaaS,比如用户登录时的认证体系、分布式session、三户体系等等;
BaaS能力市场
当底层的BaaS能力越来越多时,这就有点类似于微服务架构,需要考虑对底层的BaaS能力进行统一管控,比如服务治理、服务注册、服务发现等等,形成一个BaaS能力市场,供开发者选购开通;
运行态
对开发者而言,只需要考虑的代码逻辑以及如何部署,底层的服务器以及其他资源就不需要考虑,所以这就是无服务器(serverless)。
对serverless平台来说,黑盒化底层资源,通过事件来触发函数,真正做到自动化、按需计费,这就是serverless的主要实现点。
事件
函数运行是通过事件的驱动来触发。serverless会通过对事件解析,以及协议头参数的解析,来执行相应的触发器;
比如通过网关HTTP事件来触发、或者定时任务事件来触发等等,此外,也提供函数的API,支持函数相互之间的调用触发;
网关
同微服务,serverless也会有相应的网关,来统一函数的输入、输出;
首先,网关需要考虑安全方面的内容,包括调用端鉴权、限流降级以及恶意事件触发处理等作用;
其次,网关实现对请求内容转发,指定函数运行、返回结果,以及容灾方面的支持等等;
最后,网关对执行结果进行统一封装返回,包括抵用日志的记录、流量的计费等等;
计算
函数的本质就是上传的业务代码,函数计算也就是执行业务代码。
serverless支持多种代码语言,比如Java、node.js、golang以及其他脚本语言等等,不同的语言就需要提供相应的执行引擎来执行代码;
函数与微服务一个最大的不同点是:微服务一直运行着,而函数只有事件驱动才运行。所以,可以认为,函数的第一次运行相当于就是重新启动容器,执行代码,也就是冷启动。一些脚本语言冷启动倒是挺快(基本上都是毫秒级别),但是针对像Java这类的动态语言冷启动就不太乐观了。但是可以考虑通过别的手段来避免冷启动的问题,比如通过Quarkus技术方案,或者在预计高峰业务期即将到来时,先预热指定的函数。
虽然函数在物理上是区分了代码语言,但是在逻辑上的作用都是一样的,都是接收参数,而后返回结果。在函数的统一调度上,所以需要考虑函数稳定性,加入到全链路监控当中,进而达到出现问题能快速定位等作用。
容器
函数最终是运行在容器里的,每一个函数其实就是对应一个容器实例。
那么就涉及到对容器的管理,比如服务注册发现、负载均衡、弹性扩容等功能,用现成的方案k8s来实现即可。
BaaS
无状态是serverless的一个重要特点。
如果在函数计算过程中,需要持久化指定数据,那么就需要使用到一些存储能力,比如数据库、redis以及其他中间件;
此外,函数可以选择调用中台的微服务,获取底层的PaaS能力。
总结
- serverless是面向开发者,提供了一套贯穿创建、研发、交付、运维阶段的能力集合;
- serverless可以居于基础服务,集成所能集成的一切,做到“厚后台,轻前台”;
- serverless是FaaS+BaaS的结合体,运行的是函数,通过事件触发,复用底层资源,按需计费;
业务开发实例分析
现开发流程
调研了四川移动某政企项目,其协同单业务的开发流程如下:
(注:红色表示开发人员需要完成的部分)
- 开发人员写前端页面逻辑,同时也写后台工程代码,后台工程主要是为前后端交互的数据处理;
- 后台工程在去调用网关或者nginx负载,进而调用指定业务中心或第三方服务;
问题:
- 部署麻烦,牵一发动全身
后台工程不断累积代码,工程规模越来越大,修改一个小功能有时都要把整个后台工程打包,然后走上线流程部署。
- 扩容麻烦,难以承载较大流量
如果需要集群扩容,又要走流程,申请主机、申请其他硬件资源,应对高峰流量下表现较差;
- 固定架构,新人员学习成本高
由于底层技术架构、规则均是固定的,新来人员理解技术架构和规范往往都得需要较长时间,然后才能对业务开发;
serverless优化后的开发流程
优化的后的理想图如下:
与优化之前的开发流程相比,用serverless的函数替代了后台工程,函数之间相互独立,不再与工程耦合在一起;
将整个底层资源服务加入到BaaS市场,前台web请求先到函数,然后函数再去调用网关或者Nginx,最后再到指定的中台微服务或三方服务;
这样做的好处有:
- 自动化扩缩容,开发人员不用再为资源操心了;
- 细粒度的功能开发,只动该动的部分,上线也只需要上线对应的函数即可;
- 多语言的兼容,python程序员也可以用自己的想法来开发函数,不用担心还要被逼着去学习SpringBoot了;
- 便捷的日志管理,在serverless平台上开发者就能看到调用日志,也可以轻松的配置监控告警需求;
- 统一的BaaS市场,开发者直接选用指定的BaaS能力即可。
参考资料
中台| Serverless 云研发_业务 (sohu.com):https://www.sohu.com/a/435912238_99953378
云函数 工作原理 - 产品简介 - 文档中心 - 腾讯云 (tencent.com):https://cloud.tencent.com/document/product/583/9694
Serverless Architectures (martinfowler.com):https://martinfowler.com/articles/serverless.html
发表评论