新建应用面临的问题
在实际项目来发中,当我们创建一个新应用时,大概会遇到哪些问题?
-
创建应用过程比较繁琐,很多内容其实都是类似的,但就是得重新写一遍。有人可能会说用 Spring Initializr
,对于自己测试来说还好,但对于实际项目来说,还是不太方便。首先,每个公司里面应该都会有对应的应用分层规范,这时候一个项目是涉及到多个模块的,从这一点上来说,
Spring Initializr 就不支持;然后一些公司自己的二方包,也没办法快速引用 -
模块问题:对于一些复杂的业务系统,真的是有非常多的模块,如果没有系统的学习过相关内容,或者没有经历过这么复杂的业务开发,可能我们很难理解为什么会有这么多的模块?但不可否认的是,很多项目就是这么复杂
-
依赖问题:一种是各类开源的依赖;还一种是公司自己开发的一些公用组件,或基于一些开源组件二次开发的组件。引用开源组件时一般都是看对应的官方文档,公司自己开发的一般也有对应的接入文档。但如果涉及到的依赖太多,接入成本其实很大的。一个是依赖之间的版本管理问题;一个是各个组件的初始化配置问题。对于老同学来说,还比较好解决,该踩的坑都踩过了,但对新人来说,是一件非常痛苦的事情:可能中途会遇到各种问题,会浪费很多时间,环境问题本来就是很复杂的问题
-
配置问题:每个公司对配置的管理肯定是不一样的,这一块其实也是很头痛的;文档详细还好,文档如果不详细,很磨人的。这里少了个配置也要引入这个namespace,那里少了个配置要引入那个namespace,新人哪里知道那么多?或者说没接触过哪里知道这些?这时候很依赖文档,然后就想问问你,你对自己维护的文档很满意吗?一个应用中可能依赖了很多技术栈,每个技术栈对应的文档都散落在不同的地方,难搞
-
对于市面上的一些开源脚手架项目,一般就是集成了一大堆功能,其实用处不大。和公司自己的技术栈对不上,有什么用?有些应用也根本用不上那么多功能,还得自己再把这些内容给删除,搞来搞去,最后出问题的可能性可能更大
《2020最新Java基础精讲视频教程和学习路线!》
如何解决这些问题
- 创建应用过程比较繁琐,每次都要写大量类似的东西:我们可以提供对应的模板,然后有一个对应的脚手架基于这些模板快速创建一个应用
- 模块问题:脚手架肯定要支持多模块,可以基于 Spring Initializr 该创造,也可以自己实现,但肯定要能支持多模块
- 依赖问题:一般就是公司自己维护一个父pom,然后所有的应用都使用这个父pom,这样可以有效的解决依赖冲突问题
- 配置问题:基于脚手架生成的应用,同时为引入的组件生成相关的初始化代码,可以在代码注释中带上相关的文档链接
还有哪些可以优化
- 使用方式必须要简单: 参考 Spring Initializr 和 阿里 Starter 的使用方式,直接在界面上勾勾选选
- 灵活性:动态新增修改一些组件相关的信息,比如版本升级,应该是可配置的。这部分相关的内容可以由管理员来维护
- 友好提示:在组件展示的时候,该组件对应的负责人和文档链接应该展示出来,以便使用者可以便捷的了解这个组件
- 示例代码:基于脚手架创建应用时候,同时可以根据用户选择的组件生成对应的示例代码。但这部分应该是可选的,新人可能有示例代码会友好一些,但老同学可能觉得没必要
- 动态模板:不同业务团队,可能需要生成的模板代码是不一样的。怎么说?公司内对于应用的层次结构基本是一致的,但是不用的业务团队,需要生成的对应的模板可能是不一样的,而如果不用模板生成就会带来很多重复性工作。这一块也需要支持
- 一体化:公司内新建一个应用,应该需要去对应的系统上注册,可以和这个注册系统打通,应用注册成功直接跳转对应的脚手架创建应用界面,创建成功后直接将这部分文件初始化的gitlab
如何实现
- 开始参考了 Spring Initializr
的实现,觉得有点复杂,也不够灵活,所以还是基于freemarker实现了一个。基于freemarker实现有一个好处:灵活,可玩性比价大,比如说:我希望在创建应用的时候,将对应的创建人添加到代码注释上。这应该是一个比较常见的需求吧?脚手架接入SOS就可以获取到当前应用创建人信息,在用户创建应用的时候,我们可以将对应的用户信息存到上下文并透传给freemarker。同理,基于这个特性,我么可以定义一些其它的变量,可玩性比较高 - 应用 -> 模块 -> 依赖 : 三层结构。依赖就是我们应用中具体的依赖;模块是通用的:比如 WEB层、SERVER层、CORE层
等等;一个应用对应一个或多个模块,代表这个应用的结构。基于这个我们可以定义一些通用的应用,比如:简单应用、复杂应用、测试专用
等等。这样用户在创建应用时,就可以根据业务的复杂度快速的选择一个模块来创建应用了。应用、模块、依赖
都是可配置的,基于这个我们可以快速的创建一个新的应应用模板 - 模板文件:可配置。通过控制台可以上传对应的模板文件,除此之外每个模板文件应该有对应的作用域:所有范围生效、或者针对某个应用类型、或这对某个模块、或针对某个依赖
- 依赖问题:依赖之间的引用问题,一些依赖可能除了本身,还需要引入一些其它的依赖;一个模块也可以看成是另一个模块的依赖,这些问题都要处理好