当前位置: 首页 > 科技观察

让我们谈谈无服务器,以腾讯地图、微信小程序为例

时间:2023-03-19 15:06:00 科技观察

Serverless从去年开始就很火,尤其是最近,因为它确实可以解决我们的一些业务问题。借助腾讯云的Serverless产品,我将介绍腾讯云如何实现Serverless技术,以及Serverless技术的适用场景,最后介绍一些客户案例。Serverless的介绍如左图所示。蓝色的是无服务器的。在2016年,它的受欢迎程度超过了微服务和Kubernetes。右边是Serverless的产品化。比如2014年AWS率先推出Lambda,2016年微软、谷歌、IBM各自发布了自己的产品。国内方面,2017年国内厂商腾讯云推出了腾讯云SCF,阿里云也推出了自己的Serverless产品。2018年,腾讯云联合微信推出微信小程序云产品TCB。2019年,腾讯云推出Serverless2.0产品TSFServerless,支持新的应用场景。什么是无服务器?Serverlessserverless并不是真的不需要服务器,而是服务器由云厂商维护。它是一种软件系统架构思想和方法,而不是软件框架、类库或工具。其核心思想是无需关注CPU、内存、数据库等底层资源,只关注业务发展。让我们从另一个角度来看为什么无服务器技术如此受欢迎。从这张图的前三列大家应该能看出来,这三列代表了云计算的发展阶段,从最初的On-Premise到IaaS层,再到PaaS层。第四列是FaaS层,serverless就是这一层。在软件研发领域,我们绕不开的两个环节就是软件部署和运维。如果我们要开展业务,在On-Premise阶段,我们需要购买物理服务器,然后可能需要自己搭建机房,安装制冷设备,招聘运维人员,然后搭建一系列的上面的基础设施,比如:Virtualization,operatingsystem,container,Runtime,Runtime可以理解为python,golang,nodejs之类的软件。接下来,我们将安装软件开发框架。最后,我们将编写我们真正需要的业务功能。在IaaS层阶段,云厂商维护着硬件和虚拟化两大基础设施。到了PaaS,Stratus厂商维护了OS、容器、Runtime,然后到了FaaS阶段,用户只需要关注Function,也就是只需要关注自己的业务逻辑。可以看到,随着阶段的演进,用户需要关注的越来越少,越来越关注自己的业务逻辑。所以在On-Premise阶段,我们可能需要8个人来开发一个业务。在FaaS阶段,我们只需要2个业务,节省了很多人力。节省下来的人力可以投入到业务研发上,提高产品的迭代速度。从而提高产品的竞争力。从这张图我们也可以看出,过去十年的云计算其实是一个“去基础设施”的过程。这个过程可以让用户专注于他们真正需要的业务开发,而不是底层的计算资源。Serverless符合云计算的发展方向,是云的终极形态。这种独特的模式使得Serverless具有巨大的潜在价值。Serverless技术形态这里介绍一下Serverless的技术形态。目前,腾讯云Serverless有三种技术形态。一个是云功能。ServerlessCloudFunction是基于事件驱动的,大致意思就是外界对Serverless平台触发一个事件。Serverless平台收到触发事件后,会调用函数,传入触发事件数据和参数信息。函数内部做业务逻辑处理后返回给调用者。ServerlessCloudFunction可以对接多种云产品,例如:api网关、ckafka、cmq、COS对象存储等。事件函数是一种需要业务将业务逻辑拆分成函数的开发模型。这种方式在国外接受度比较高,但是国内很多用户还停留在HTTP阶段。为了方便现有服务的迁移适配Serverless平台,适配现有业务的调用方式,扩展Serverless的使用场景,我们还提供了TSFServerless的方式。TSFServerless和Service的形式可以理解为我们通常意义上的HTTP服务。简单的理解就是把HTTP服务的运行环境从物理机、虚拟机或者容器变成Serverless的计算资源。这种形式的服务进程是常驻的,不限制运行时间。因为服务进程是常驻的,一直在监听请求,所以请求延迟更低,也支持长连接和一定的内场共享能力。因为服务的形式和我们现在的服务运行模式是一致的,业务不需要做太多的修改就可以无缝迁移到Serverless平台上。同时TSFServerless支持SpringCloud的微服务框架和ServiceMesh的服务形态。另一种形式是腾讯云基地,是我们联合微信团队推出的,旨在简化小程序的开发流程。封装了云函数、对象存储、数据库等诸多功能,方便用户开发小程序。这也是云函数的一个典型应用场景,通过封装云函数来提供一些PaaS能力。ServerlessCloudFunctionComponentArchitectureCloudFunctionComponentArchitecture这里对CloudFunction组件架构做一个介绍,让大家了解我们在底层做了什么来实现Serverless技术。这张图描述了Serverless的组件架构。底层是基础设施层。底层计算资源我们使用docker和轻量级虚拟机技术。Docker是serverless1.0的计算资源表现形式,轻量级虚拟机是serverless2.0的计算资源表现形式。与Docker相比,轻量级虚拟机的性能有了显着提升,可以在几毫秒内启动一个业务流程。在最底层,我们也实现了双活,对底层资源进行了严格的安全保护。上层是资源管理层。比如我们有集群监控来监控我们的集群监控状态。如果某个集群不可用,我们会第一时间安排运维人员排查。当然,刚才说了我们有Active-active,当一个集群出现故障时,我们可以将流量切换到另一个集群上,用户是感知不到的,用户的请求不会受到影响。在这一层,我们有专门的自动缩放算法来响应用户请求的变化。再往上,我们有认证授权系统,通过认证授权来保证功能的安全。再往上就是接入层,主要用来触发Functions的调度和执行。最上面是架构层,主要是用来做一些进程调度的。上面两层是用户需要关心的。用户需要关注自己的业务代码,对数据库、存储等的调用,以及自己使用的一些框架。用户无需关心其他底层设施。它们都是由云提供的。厂家提供专业的保护和维护。我们还提供了很多周边工具系统来支持用户的开发、部署和故障排除。例如:DevOps支持、日志、监控和告警支持。后面会有介绍。运维工具建设刚才讲了Serverless如何支持功能的运行,其实是计算资源的问题。但是要真正使用serverless技术,光有计算资源是不够的,还需要其他工具来支持serverlss的开发和运维。接下来将从开发者工具、CI/CD、日志、监控告警等方面介绍腾讯云是如何支持Serverless的。首先介绍一下开发工具。为了支持开发者方便、高效地开发和部署云功能,我们开发了一系列工具。例如,我们提供VSCode插件。通过VSCode插件,开发者可以直接使用IDE轻松部署、更新、调试云函数。我们还提供了WebIDE,方便用户直接在网页上开发代码。此外,我们还提供了CLI工具,用户可以通过CLI工具在终端通过命令调用轻松便捷地完成配置、部署、调试、调用等功能。最后,我们还提供了API接口,满足用户对自动化和定制化的需求。最后,我们还提供了SDK,方便用户更方便的调用云函数接口。所以可以看出,要将Serverless商业化,还需要做很多其他工作来支持Serverless技术,尤其是工具。除了开发人员工具,我们还提供全面的DevOps支持。从最佳实践,到工作流,再到工具链,再到产品集成,我们提供了很多解决方案和支持。比如这里的工作流,我们支持编码、构建、打包、部署、测试、发布等一系列流程。在这边的工具中,我们提供了:CLI、应用模型等。对于产品,我们开放了很多产品,方便用户和这些产品进行交互,使用这些产品提供的能力,比如:Git仓库,API网关,ServerlessDB等。这是DevOps的支持。日志这里我们支持两种日志查询方式,方便用户查看日志。在scf控制台可以查看函数调用是否成功,每个阶段的调用时间,以及用户在日志或标准输出中打印的日志,支持用户通过RequestId查询日志。此外,我们还支持用户将日志输出到腾讯云日志服务系统,用于日志的持久化存储。在日志服务系统中,用户可以根据正则表达式搜索日志,也可以自定义检索规则,方便下次检索。ServerlessCloudFunction应用场景下面介绍一下应用场景。首先介绍一下云函数的应用场景。从这张图中我们可以看出,CloudFunction可以作为浏览器、APP、小程序的后台服务。我们提供的不同触发器可以支持不同的场景。比如通过API网关触发器,可以匹配websockt的应用场景。通过cos/cmq/ckafkatrigger,可以支持诸如:消息处理、损失计算、事件通知等应用场景。ServerlessCloudFunction客户案例这是腾讯地图的一个客户案例,采用事件函数的方式。场景是这样的:当用户访问腾讯地图时,会产生一些数据库,腾讯地图会将这些数据组织起来保存在Hbase和ES上,然后添加一个UI来查询数据。当用户产生一条数据时,数据会被放入kafka队列中,kafka会触发后端的云函数。cloudfunction进行数据处理后,会将数据放入kafka队列中,另外一个进程会从kafka队列中取出处理后的数据放入ES和Hbase中。下面腾讯云基地介绍一下TCB。做小程序开发,必须要有小程序前端和后端。在写后端的时候,需要处理很多后端需要的组件或者功能,比如数据库,存储,或者CDN等等,这些都需要研发工程师自己来处理。编写接口和调用产品是一个非常繁重的工作量。这时候可以通过TCB来解决,TCB就会变成像右边那个。前端还是有一个小程序的前端,中间的微信后台主要是用来授权的。授权通过后,将请求转发给TCB组件。这个组件会提供很多SDK,提供的SDK里面封装了很多功能,比如数据库,对象存储,云函数都是通过TCB的SDK直接调用的,这样就不需要处理那么多的后端组件,让用户开发小程序非常方便。TSFServerless下面是对TSFServerless的介绍。TSF是腾讯云的微服务产品。该产品底层此前支持基于虚拟机和容器部署应用。我们添加了第三种基于Serverless的部署方式。基于Serverless,用户无需关注底层资源,只需要部署容器即可。这是它的组件架构。底层是Serverless计算管理的一些功能,比如集群管理容器,是一些计算在Serverless底层的体现。增加一层微服务部署框架,该部署可以原生支持一些微服务功能,如服务注册、服务发现、服务限流、服务熔断、动态配置、服务监控、负载均衡、服务容错、服务审计等。TSFServerless应用场景下面是一个典型的TSFServerless应用场景。假设我有一个跨多个终端的APP,比如Android、iOS、Web。如果我要写后台,我可能要写多个接口来适应不同的终端。这样,如果后端有变化,就需要改变三个终端的API接口。同时,当我们需要对一个字符串进行处理时,比如限制140个字符,我们需要在各个客户端(Android、iOS、Web)分别进行更改,成本显然是相当大的。现在比较流行的方案是在前后端加一个BFF层(BackendForFrontend),实现前后端解耦。下面是BFF层可以承载的能力,比如:身份验证、日志记录、数据组合等。BFF一般都是前端工程师写的,以适应不同的后端。当后端发生变化时,只需要改变BFF层,不需要改变客户端。BFF层可以部署为HTTPService,即可以直接使用我们提供的HTTPService技术形式进行部署。通过BFF,前端工程师可以成为全栈工程师,开发不需要关注底层资源。因为BFF一般都是HTTP服务,TSFServerless非常适合这种场景。