曹宇 编辑
蔡芳芳 引言
近几年来,低代码和开发平台成为了技术圈子的热点话题。很多企业也开始尝试使用低代码来快速搭建应用,从而减少开发成本和运维成本。FreeWheel核心业务开发团队在打造云原生微服务架构的过程中,搭建新服务的需求日趋增多。为了应对这一挑战,我们研发了基于AWS的低代码开发平台。本文从低代码和开发平台的基本概念讲起,带你体验FreeWheel核心业务开发团队低代码的实战之旅。
什么是低代码开发平台低代码(Low-code)是一种全新的开发范式,开发人员仅仅需要少量代码甚至是0代码就可以快速完成服务的搭建。低代码开发平台(Low-CodeDevelopmentPlatform,LCDP)是基于低代码和可视化界面的开发平台。咨询公司ForresterResearch在年6月首次给出了它的定义:
低代码开发平台旨在通过很少的代码降低服务在全生命周期的开发成本,从而实现业务快速交付。从定义不难看出,低代码开发平台是一种提效降本的重要手段。为此,低代码开发平台应当具备以下3种能力:
可视化界面
我们可以把低代码开发平台理解成一种IDE。用户可以从它的组件库里以可视化甚至是拖拽的方式,像搭积木一样完成服务的创建。另外,和传统的IDE如VisualStudio的MFC所支持的可视化能力相比,低代码开发平台应当有能力支持端到端的可视化编程。
规模化生产
用户往往需要搭建不同类型的服务,甚至是不同语言的服务,这就需要平台具备规模化生产的能力。我们可以通过提供服务模板功能来做到这一点。不同的模板对应不同的业务场景下的最佳实践,用户搭建服务时选择合适的模板即可。
全生命周期管理
低代码开发平台需要支持软件的全生命周期的管理。通过平台,我们不仅要能够轻松地设计并开发服务,也要能够一键部署服务,还要满足服务的运维需求。平台对服务生命周期的管理也会带来聚合效应,使得平台成为服务的百科全书。
低代码开发平台的优势事实上,低代码开发的诞生可以追溯到年代初期,如快速应用开发(RapidApplicationDevelopment,RAD)、VisualStudio的MFC等工具。但与这些早期工具不同的是,低代码不等于零代码,而是要少写代码,比如通过少写重复代码来提高生产力、通过少写基础代码来屏蔽底层技术细节等等。那么,低代码开发平台可以给企业带来什么呢?
提效降本
低代码开发平台致力于以工业化标准化的方式替代传统手工作坊式的软件开发。平台提供了众多的基础设施、公共组件、自动化流水线等功能。这就使得业务团队能够从重复的工作中释放出来,更多的聚焦在业务本身。
质量保证
质量保证始终是软件开发绕不开的话题。线上故障频发,项目延期交付甚至成为了行业常态。低代码开发平台的引入将规范化软件开发的流程,减少人工出错的可能。
团队协作
软件开发过程非常的复杂,往往也需要不同职能团队的配合。但在传统的开发模式下,各个团队往往各司其职,长期来看会形成团队壁垒,使得跨团队的沟通极其低效。而低代码开发平台的引入会使得诸如业务开发团队、基础设施开发团队、运维团队工作在同一个平台下,轻松打破团队间的壁垒,实现高效协作。
作为FreeWheel核心业务的开发团队,我们发现微服务的构建有很多重复的工作,例如微服务的脚手架、CICD等等。同时,公司新业务线的拓展也意味着新的微服务的诞生。因此,如何快速地搭建新服务成为了我们急需解决的问题。
低代码开发平台构建之路经过数月的开发、试错与重构,我们打造了基于AWS的云原生低代码开发平台,公司内部代号bingo。我们自研的低代码开发平台包含了一套WebUI,用户可以通过可视化界面创建新的服务;平台提供了规模化生产、CICD、监控、日志等功能的支持。随着平台功能不断完善,运维团队的小伙伴也加入了Bingo的开发团队,Bingo平台也已经在公司范围内推广使用。
平台的技术选型针对Bingo平台,我们围绕以下几个方面进行了技术对比和选型:
前端技术栈
前端技术栈选择了React。一方面,React有着非常成熟的社区与生态;另外一方面,我们团队有着丰富的React使用经验。
后端技术栈
后端编程语言选择了Golang。和其他Web框架如RubyonRails相比,Golang使用更加繁琐,但有着更好的性能。此外,这也与团队微服务的技术栈一致。
数据存储
数据库选择了AmazonRelationalDatabaseService(RDS)。文件存储选择了AmazonSimpleStorageService(S3)和AmazonElasticFileSystem(EFS)。云原生的方式极大地降低了维护成本。
部署方式
Bingo平台的部署可以考虑AmazonElasticKubernetesService(EKS)、AmazonElasticComputeCloud(EC2)或者AmazonLambda。鉴于平台可以独立于微服务集群存在,没必要部署到EKS当中。另外,和EC2相比,Lambda更加灵活,部署更为简单,成本也更为低廉。因此,平台选择了无服务器的架构。同时,平台的CICD是自服务的,即Bingo的上线发布采用了Bingo平台提供的CICD的功能。这就使得平台上线任何新功能都可以通过平台做一手的验证,然后再交付给我们的用户。
平台的架构根据以上对比,我们选择了一套云原生+定制化组件的架构,如下图所示。与业内流行的低代码开发平台类似,Bingo平台有一套可视化UI,即WebUI。Bingo的后端包含模板管理、服务管理、服务创建、服务部署等功能,每个功能是一个单独的Lambda。存储层包含数据库存储RDS与用于存储模板代码、服务代码的代码存储GitHub。
图中左边展现的是日志收集的过程,我们通过AmazonCloudWatch收集Lambda的日志,并经由Kafka将日志通过ElasticSearch+Logstash+Kiabana呈现给用户。图中右边是CICD部分,CI流水线会在每次服务代码改动后将服务打包并上传到远端仓库;CD流水线会从仓库中获取Lambdazip包,然后上传到S3,再完成部署。部署使用了运维团队提供的基础设施即代码(InfrastructureasCode),很轻松地做到了不同环境部署的自动化。
平台的落地实现
Bingo平台提供了一套可视化界面,支持服务模板的管理和服务全生命周期的管理。
服务模板的管理我们提供了服务模板的管理功能来做到规模化的生产。针对每一种类型的服务提供一种模板,每个模板定义了一个业务场景的最佳实践,团队成员使用Bingo创建新服务时,根据业务场景选择合适的模板即可。这里举几个例子:
AmazonGateway+Lambda模板提供外部API
AmazonALB+Lambda模板提供内部API
AmazonEventBridge+Lambda模板处理异步任务、定时任务
AmazonKinesis+Lambda模板处理数据流
gRPC+微服务模板搭建基于gRPC的微服务
模板管理功能提供了模板列表页面和模板详细信息页面。模板列表页支持模板的分页和搜索的功能。可以点击特定的模板进入详细信息页面。每个模板都有一个对应的详细信息页面。页面包含贡献者、模板名称、模板代码的git仓库、使用场景介绍、关键字标签等等。其中关键字标签支持编辑功能,可以选择添加已有标签或者创建新的标签,也可以按需删除标签。此外,还可以通过点击创建模板问题按钮,来对模板提出反馈。如下图是一个使用ALB+Lambda构建API的模板。
模板管理还提供了新增模板的功能。新增模板时需要填写贡献者、名称、模板代码的git仓库、使用场景介绍、关键字标签等等。其中模板代码的git仓库需要预先准备好,并包含对应的模板代码文件。
模板代码是模板的核心内容。模板代码由说明书、Makefile、配置文件、部署描述文件、流水线文件等组成,并包含一个可执行的helloworld程序。下图是ALB+Lambda的模板代码的目录结构。
说明书即README.md,包含模板的名称和使用说明。
functions目录包含了一段可执行的代码,例如一个返回helloworld的API,团队成员可以基于此进行二次开发,实现自己的业务逻辑代码。代码示例如下:
funcGetHelloWorld(ctxcontext.Context,req*model.Request)(interface{},error){InitConfig()log.Println("HelloWorld!")log.Printf("Requestpath:%v",req.Path)//getparametervaluefromLambdaenvDomainServiceUrl:=os.Getenv("BingoService")message:=fmt.Sprintf("Message:Hello,Bingo!Bingoserviceurlis[%s](Time:%s)",DomainServiceUrl,time.Now().UTC().String())returnmessage,nil}//InitViperConfigfromEnvironmentVariables.funcInitConfig(){v:=viper.New()v.AutomaticEnv()config.Set(config.Config{Viper:*v})}
Makefile文件定义了单元测试、测试覆盖率、打包等命令。这些命令是约定俗成的,会整合到持续集成的流水线中。
配置文件是给开发环境、预发布环境、生产环境等环境使用的配置变量。
部署描述文件是基于yaml的DSL,用来描述AWS云原生的部署内容。在服务实际部署时,DSL文件会被转成基础设施编排工具Terraform可以识别的tf文件。部署描述文件的代码示例如下:
#bingo-alb-templatebingoconfigapplication:bingo-alb-template