SpringBoot是基于JavaSpring框架的套件,它预装了Spring一系列的组件,开发者只需要很少的配置即可创建独立运行的应用程序。
在云原生体系中,有大量的平台都可以运行SpringBoot应用,例如虚拟机、容器等。但其中最有吸引力的,是以Serverless的方式运行SpringBoot应用。我将通过《SpringBootServerless实战》系列文章,从架构,部署,监控、性能、安全等5个篇章来分析Serverless平台运行SpringBoot应用的优劣。
为了让分析更有代表性,我选择了Github上star数超过50k的电商应用Mall作为示例。这是该系列文章的第一篇,本文会从架构角度对SpringBoot应用的Serverless化进行分析。
Mall架构简介
Mall是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
Mall的架构如下图所示,分为网关层,应用层,数据存储层。请求首先通过网关到达SpringBoot应用服务。网关实现负载均衡,流量控制等功能。应用层包含3个SpringBoot应用和1个前端应用:
mall-admin:后台商城管理系统mall-portal:前台商城系统mall-search:于Elasticsearch的商品搜索系统Mall-admin-web:mall-admin的前端展示,基于Vue+Element实现
Mall使用了MySQL,Redis,MongoDB,ElaisticSearch等多种数据库。主要业务数据存储在MySQL,缓存数据存储在Redis,用户行为分析数据存储在MongoDB,搜索数据存储在ElasticSearch中。SpringBoot应用服务间使用RabbitMQ实现异步通信。
Serverless计算平台-函数计算简介
函数计算(FunctionCompute)是目前国内唯一入选Forrester领导者现象的Faas产品,是一项事件驱动的全托管Serverless计算服务。开发者无需管理服务器等基础设施,用户在上传好代码包或者容器镜像后,函数计算会自动准备好计算资源,并且以弹性、可靠的方式运行代码。
函数计算的产品优势总结为:
高效免运维:聚焦业务逻辑开发,无需关心服务器购买、自动伸缩等运维操作弹性高可用:预留实例系统不自动回收,可长驻不销毁,消除冷启动带来的延时毛刺按需低成本:按量付费模型按实际使用计算资源计费、资源利用率高稳定高可靠:函数计算分布式集群化部署,支持多可用区
函数计算提供全面的可观测和问题诊断能力,但是其最突出的特点还是内置了网关层能力,能够实现缩容到0,快速的自动伸缩。
函数计算的这些特点,使其很适合SpringBoot这类Web应用。使用函数计算,开发者只需要专注于SpringBoot应用逻辑的实现,而不再费心应用运行环境的搭建、部署、监控等无差别的工作。
Mall应用Serverless架构纵览
Mall是一个非常标准的3层架构Web应用,改造为Serverless架构非常容易,架构如下所示。由于函数计算内置了网关服务,自动拉起实例运行应用,因此开发者只需要上传应用代码即可。
应用实例在函数计算平台上运行,能够自由的访问其他服务,因此和MySQL,Redis,RabbitMQ等服务的访问方式相同。
函数计算内置了日志收集和展示能力。开发者为函数计算指定阿里云日志服务的LogStore,打到标准输出的日志会自动收集到日志服务查询、展示。开发者也可将日志投递到自己的日志处理系统中,但需要做一些额外的配置。在本次示例中(见文末阿里云日志服务网址),我们会采用阿里云日志服务来处理应用日志。
函数计算也提供了一系列工具,帮助开发者通过JenkinsCICD工具发布应用。我们将在后续的文章中进一步展示。
在函数计算平台上运行SpringBoot
在演示阿里云函数计算平台上运行Web应用前,先为大家介绍以下几个概念:
服务
函数计算的服务资源对应微服务。一个服务下可以创建多个函数,这些函数共享服务级别的配置,包括日志、权限、VPC网络访问配置等等。一般来说,开发者根据业务场景设计微服务架构,为每一个微服务创建函数计算的服务。然后再根据需求,将微服务变为更细粒度的函数。比如有些逻辑是计算密集型的,可以将它拆分为另一个函数,配置不同的实例规格,既满足性能要求,又优化了成本。按照微服务的理念,一个服务下的函数个数不宜太多。
函数
函数是运行开发者代码的基本单位。函数的粒度可以很细,比如对应1个API,也可以较粗,对应一组API。不同的函数配置不同的实例规格。函数计算提供了各种语言的运行时,也提供customruntime/customcontainer和语言无关的运行时。如果只是用函数计算实现片段代码,可以使用相关语言的运行时。在我们的场景下,因为要无缝迁移SpringBoot应用,我们会选择customcontainer运行时。Mall项目已经支持了将Mall应用自动打包为容器镜像,因此只需要将镜像上传至阿里云容器镜像仓库,并在函数上指定相关信息即可。
HTTP触发器
为函数配置HTTP触发器后,函数可通过HTTP请求的方式调用。函数计算配套的ServerlessDevs工具会为HTTP触发器生成测试域名,开发者可以方便的调试和运行Web应用。
至此,阅读本篇后,相信大家已经对Mall应用架构以及Serverless平台已经有了一个基本的了解。下周同一时间,我们将在的《SpringBootonFC-部署篇》中为各位详解如何将Mall应用部署到函数计算平台上。
相关链接
1)SpringBoot: