作者:铖朴、良名
12 月 3 日,微服务 x 容器开源开发者 Meetup 上海站上,阿里云智能技术专家,云原生应用脚手架项目负责人良名宣布阿里巴巴云原生应用脚手架项目正式开源,并在现场做了相关内容介绍。
本次开源的云原生应用脚手架是一款基于 Spring Initializr 项目基础之上,支持多种工程架构、提供代码示例片段、组件更丰富、生态更开放的一款脚手架。其致力于在当下云原生时代,为广大开发者提供更简单、更高效的项目构建体验。
云原生应用脚手架
常规的工程构建流程
接下来,我们通过回顾一下过去数十年间一个后端软件工程师一般是怎么来开发一个新项目的来了解云原生应用脚手架。随着技术的发展,和大量提升研发效能工具的持续涌现,一个后端 Java 企业级项目的创建过程总体上经历了手工构建、脚手架构建等历程。
手工构建
在 start.spring.io 脚手架项目被推出之前,很多后端工程师的项目构建过程都是纯手工的形式进行。那时,Spring 项目是后端新项目构建主要使用框架之一。因此,我们以一个 Spring 企业级项目构建为例进行说明。该阶段新建项目大致可分为:新建工程、添加依赖、添加配置、编写测试代码和运行测试5个步骤,接下来分别进行详细说明。
新建工程
在 Spring 项目盛行的手工项目构建阶段,新建工程一般采用得较多的集成开发工具(Integrated Development Environment, IDE)那个时候用得最为普遍的还是 Eclipse。
新建新项目总体来说比较简单。按照 IDE 的新建项目提示即可快速新建一个相关工程。
添加依赖
由于一个企业级项目一般会依赖于很多外部组件,比如 MySQL 数据库、Redis 缓存,因此需要添加很多第三方组件依赖。这个过程比较繁琐,需要操作的同学了解具体所需的功能与对应的依赖名称,有的功能还可能需要多个组合依赖。当项目所需外部依赖较多时,整个过程会比较耗时。对于一些有经验的工程师,一般都通过留存一些项目依赖模板,在创建新项目的时候通过参考模板来进行依赖添加,这样能稍微加快项目构建进程。
添加配置
Spring 项目构建过程中最为复杂的部分莫过于进行各种各样的配置了,例如下方所示为一个基本的 MySQL 连接配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd " default-lazy-init="false"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://10.0.xxx.xxx:3306/xxxxx?xxxxx" /> <property name="user" value="root" /> <property name="password" value="root" /> <property name="maxPoolSize" value="40" /> <property name="minPoolSize" value="1" /> <property name="initialPoolSize" value="1" /> <property name="maxIdleTime" value="20" /> </bean> <!--配置sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-xxx.xml" /> </bean> </beans>
除了数据库,依赖的外部组件都需要进行手动编写配置文件,完成项目配置,整个过程非常繁琐。就算有参考模板通过拷贝相关文件来做二次修改,也可能稍不留神就出现漏配或者错配一些内容,导致项目运行不起来。
编写测试代码
在完成以上依赖添加和配置设置以后,为了验证项目依赖和配置是否都正确,一般还需要编写一些最简单的测试case来对上述过程进行验证。
运行测试
对于一些经历过多次项目构建并且留有一些自备模板的老司机,按照模板完成上述操作后一般问题就不大,到这里基本上算是完成了新项目的初始化工作。如果是一些新人,之前没有模板参考,或者备用模板无法满足需求的人,到这里基本上还只是噩梦的开始,测试过程中很可能出现各种依赖缺失、依赖冲突、配置漏配或配置错误等问题,需要不断反复修改调试。整个过程耗时费力。
因此,在手工项目构建阶段,为了追求效率,一般新项目工程构建的任务都交给团队内较为资深,有多次项目构建经验的资深工程师来进行,以提高效率。如果在没有模板参考的情况下,很有可能新建一个项目可能花1天时间都不一定能搞定。
脚手架构建
随着 Spring Boot 慢慢成为新项目构建的主流选择,其提出的“约定优于配置”的设计,通过为组件提供默认配置以及通过 starter 依赖的方式极大的简化了手工构建时期的配置繁琐问题,做到了让一般的常规项目达到开箱即用的效果。另外,来自 Spring 社区的 start.spring.io[1] Java 相关项目脚手架,通过点击几下鼠标即可帮你生成一个所需的项目,让项目构建变得让没有经验的小白工程师项目构建起来都毫不费劲。尽管如此,一般企业级项目构建过程还是不得不经历:新建工程、添加配置、编写测试代码和运行测试 4 个环节。
[1] start.spring.io
新建工程
相比于手工项目构建时期的 Eclipse IDE,新阶段也有了新的更好用的 IDE——IntelliJ IDEA。相比于 Eclipse 单一的白色界面。IDEA 提供了炫酷的暗黑模式,让大量长时间写代码的工程师们缓解了用眼疲劳问题。由于 start.spring.io 工程脚手架的出现并与 IntelliJ IDEA 进行了整合。在 IDE 中新建工程、添加依赖仅需通过点击几下鼠标即可帮你生成一个所需的包含特定依赖的项目。
在 https://start.spring.io 网站上进行工程创建:
添加配置
虽然通过 start.spring.io 脚手架可以帮助用户很好地解决依赖添加问题,但其创建项目过程无法为用户创建示例代码和相应的参数配置示例,在该阶段用户仍然需要自己手动编写或者 Copy 一些模板配置来进行二次修改。
编写测试代码
市面上主流的脚手架工具在创建项目过程中也无法为用户创建示例代码,在该阶段用户仍然需要自己手动编写或者 Copy 一些模板代码来完成测试验证代码的补充。
运行测试
由于有脚手架帮助进行项目创建,脚手架本身会帮助用户保证所选依赖之间具备兼容性,所以一般通过脚手架工具生成的项目一般都没有问题,因此,只要保证编写的测试代码本身正确无误一般运行测试阶段象征性的测试一下运行无误整个项目创建就完成了。
云原生应用脚手架构建
本次开源的云原生应用脚手架基于 Spring 开源的 intializr[2]项目进行构建。相比于 start.spring.io 脚手架,云原生应用脚手架不仅可以帮助用户管理依赖,其更为重要的是帮助用户生成测试或者可以直接使用的代码片段,可让用户创建完工程就可测试,测试完就可以基于示例代码进行项目开发。因此,基于云原生应用脚手架构建项目仅需完成:新建工程和运行测试即可,大大提高新建工程的效率。
[2] intializr
https://github.com/spring-io/initializr
新建工程
与 start.spring.io 脚手架一样我们也提供了 2 种帮助用户直接构建应用的访问方式,用户既可以在IDEA中通过在项目构建时选择所需的依赖进行项目构建:
用户也可以在官网。start.aliyun.com[3]中进行项目构建后,再将项目导入到本地开发环境:
[3] start.aliyun.com
通过云原生应用脚手架构建的项目,不仅具备了依赖、配置还有相关的示例代码,构建完成即可进行项目测试。
下图是一个 Spring Cloud Alibaba 工程使用 Nacos 作为注册中心,服务消费者项目构建过程中提供的示例代码:
下图是一个 Spring Cloud Alibaba 工程使用 Nacos 作为注册中心,服务消费者项目构建过程中提供的注册中心连接示例配置:
另外,针对云原生场景下的,大量企业级用户的用云述求,我们为用户提供云厂商所提供的云服务客户端连接所需的依赖添加能力,帮助外部用户更好地在云原生时代基于云构建可生在云上,长在云上的云原生应用。
运行测试
由于有脚手架帮助进行项目创建,脚手架本身已经帮助用户保证所选依赖之间具备兼容性,并且已经给出配置示例,用户仅需比如修改配置示例中的注册中心链接地址等信息,即可使用示例代码进行功能测试。整个过程实现了开箱即用的效果,用户再也不用关心如果新构建的项目依赖是否兼容、配置是否正确、示例代码如何编写等问题。帮助工程师们扫除一切项目构建阶段的障碍。
小节
最后,由于手动构建方式无论什么内容都需要用户手动设置或者添加,跟脚手架方式比不具备优势。因此,我们仅小节对比一下一般脚手架构建和云原生脚手架构建项目之间的区别和差异:
拥抱开源
云原生脚手架的前身——Aliyun 工程脚手架,于 2020 年初正式发布上线,在过去的 2 年多时间,其为外部用户构建了数百万个新项目,为广大开发者带来了实实在在的便利和价值!
在服务外部用户 2 年多个时间里,我们一方面收到了很多用户对脚手架的开源诉求,另外一方面考虑到脚手架长期的发展,如今,通过开源的方式,希望能聚集一批开发者一起共同建设云原生时代更加好用,生态更加繁荣的项目构建工具,未来,我们会在当前所提供的能力基础之上,在以下方面进行持续建设:
未来展望
云原生应用脚手架是站在 Spring 社区的 Initializr 基础工程和 start.spring.io 脚手架巨人的肩膀上构建而来,能有机会在过去2年服务大量用户并在如今有机会开源出来,首先需要向前辈致敬!
云原生应用脚手架项目在未来计划建设为一个功能强大,社区生态丰富的应用构建工具,为大量需要构建云原生微服务应用的用户提供便利,社区未来的相关规划如下图所示:
加入社区
目前,国内外云原生应用相关的构建脚手架领域基本处于空白状态。阿里巴巴云原生应用脚手架今天开源了!欢迎加入社区,一起来参与来构建一款服务广大开发者的云原生应用脚手架工具。钉钉群号:32268357。
点击进入 GitHub 链接: https://github.com/alibaba/cloud-native-app-initializer