页面加载中...

Serverless(无服务器架构)的理解

| 云原生 | 0 条评论 | 790浏览

serverless简述

serverless翻译成中文: 无服务器,这并不代表着应用运行不需要服务器,而是说对开发者而言,写代码时就不需要关心服务器的问题了。

serverless面向的函数,正如同SOA架构体系中面向的是服务,Java面向的是对象。

在我看来,serverless的主要目的就是提升开发效率,随着底层基础设施越来越完善,开发者几乎不用再关心服务部署、系统管理、日志等问题,只需要关心怎样以最快的速度把代码变成函数,或者说服务;

那么对serverless整体架构而言,那么就得需要具备以下能力:

  1. 利用现成的资源能力:包括基础服务、数据库资源、缓存资源以及其他PaaS资源,以供上层函数调用;
  2. 集成所能集成得一切:不仅是部署代码,还应该把管理态的信息集成在一起,这样对于开发者而言,我既然开发人员,也可以是运维人员;

体系结构阐述

研发运维一体化

方案

severless的体系主要聚焦的是:

  1. 前台业务开发变轻,只关注业务逻辑的实现,进而提升研发效率;
  2. 后台基础能力变厚,提供丰富的可复用能力,提升系统的稳定性;

根据不同的业务场景,我们可以来定制不用的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能力。

总结

  1. serverless是面向开发者,提供了一套贯穿创建、研发、交付、运维阶段的能力集合;
  2. serverless可以居于基础服务,集成所能集成的一切,做到“厚后台,轻前台”;
  3. serverless是FaaS+BaaS的结合体,运行的是函数,通过事件触发,复用底层资源,按需计费;

业务开发实例分析

现开发流程

调研了四川移动某政企项目,其协同单业务的开发流程如下:

协同单开发流程

(注:红色表示开发人员需要完成的部分)

  1. 开发人员写前端页面逻辑,同时也写后台工程代码,后台工程主要是为前后端交互的数据处理;
  2. 后台工程在去调用网关或者nginx负载,进而调用指定业务中心或第三方服务;

问题:

  • 部署麻烦,牵一发动全身

后台工程不断累积代码,工程规模越来越大,修改一个小功能有时都要把整个后台工程打包,然后走上线流程部署。

  • 扩容麻烦,难以承载较大流量

如果需要集群扩容,又要走流程,申请主机、申请其他硬件资源,应对高峰流量下表现较差;

  • 固定架构,新人员学习成本高

由于底层技术架构、规则均是固定的,新来人员理解技术架构和规范往往都得需要较长时间,然后才能对业务开发;

serverless优化后的开发流程

优化的后的理想图如下:

协同单开发流程优化

与优化之前的开发流程相比,用serverless的函数替代了后台工程,函数之间相互独立,不再与工程耦合在一起;

将整个底层资源服务加入到BaaS市场,前台web请求先到函数,然后函数再去调用网关或者Nginx,最后再到指定的中台微服务或三方服务;

这样做的好处有:

  1. 自动化扩缩容,开发人员不用再为资源操心了;
  2. 细粒度的功能开发,只动该动的部分,上线也只需要上线对应的函数即可;
  3. 多语言的兼容,python程序员也可以用自己的想法来开发函数,不用担心还要被逼着去学习SpringBoot了;
  4. 便捷的日志管理,在serverless平台上开发者就能看到调用日志,也可以轻松的配置监控告警需求;
  5. 统一的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

发表评论

最新评论

    来第一个评论吧!