如何开发一个Java微服务项目脚手架

原创 吴就业 130 0 2022-06-14

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/0d15f2fb2f4c4e4e90672ffd0373839a

作者:吴就业
链接:https://wujiuye.com/article/0d15f2fb2f4c4e4e90672ffd0373839a
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

本篇文章写于2022年06月14日,从公众号|掘金|CSDN手工同步过来(博客搬家),本篇为原创文章。

创建一个项目通常需要依赖很多的二/三方组件,我们很难记住每个组件的maven坐标,并且有些组件的初始化工作很繁琐,一堆配置项很难记住。如果没有脚手架,每当需要创建一个新的project,我们通常会选择基于现有的project复制一份,然后修改修改。

如果是纯粹的只使用spring的三方组件就能创建一个project,那么我们完全可以使用start.spring.io提供脚手架,但通常我们都会自己写一些二方组件,或者基于三方组件封装二方组件,然后发布到公有/私有maven仓库,这时我们就需要定制一个适用于自己/公司技术栈的new project脚手架了。

maven提供了基于项目模版创建新项目的能力,即maven项目脚手架。当我们在idea->new maven project时,idea也会提示我们是否根据模版创建项目,并提供了一些可选的模版,只是这些模版都不适合我们。但我们可以自己定制maven项目模版。

以下就是自己开发一个maven模版项目,并将模版项目上传到私有仓库,最后根据模版创建新项目的步骤。

groupId=com.wujiuye.microservices.template
artifactId=microservices-template
version=1.0.0
mvn clean archetype:create-from-project

创建出来的模版项目,坐标的artifactId会被加上-archetype后缀,变成:

groupId=com.wujiuye.microservices.template
artifactId=microservices-template-archetype
version=1.0.0

进入/target/generated-sources/archetype目录下,修改pom.xml配置文件,添加私有仓库配置:

  <distributionManagement>
    <repository>
      <id>release</id>
      <url>http://{{我们自己搭建的nexus maven私有仓库的域名}}/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
      <id>snapshots</id>
      <url>http://{{我们自己搭建的nexus maven私有仓库的域名}}/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
  </distributionManagement>

进入/target/generated-sources/archetype目录下,执行下面命令上传archetype

mvn clean deploy
mvn -X archetype:generate -B \
    -DarchetypeGroupId=${替换为模版的groupId,例如:com.wujiuye.microservices.template} \
    -DarchetypeArtifactId=${替换为模版的artifactId,例如:microservices-template-archetype} \
    -DarchetypeVersion=${替换为模版的version} \
    -DgroupId=${替换为项目groupId} \
    -DartifactId=${替换为项目artifactId} \
    -Dversion=${替换为项目version} \
    -Dpackage=${替换为项目package} \

执行以上命令也可以使用临时的mvn环境变量,使用临时的mvn环境,如下:

M2_HOME=/Users/wujiuye/projects/microservices-initializr/apache-maven
export PATH=$PATH:$M2_HOME/bin
mvn clean archetype:create-from-project

同样需要进入/target/generated-sources/archetype目录下,修改pom.xml配置文件,添加私有仓库配置,再执行下面的命令。

cd target/generated-sources/archetype   
mvn clean deploy --settings /Users/wujiuye/.m2/settings.xml

maven提供的脚手架功能还是相对简单的,我们只能替换下项目的groupId、artifactId、version、package这些。但我们可以基于此,开发一个更完善的脚手架,并提供像start.spring.io提供的勾勾点点就能自动生成项目的一个脚手架网页。

首先,我们创建一个web项目,然后将根据maven模版坐标创建模版项目的功能封装到web项目。提供一个api,前端调用一下,就通过执行shell脚本,执行mvn -X archetype:generate命令创建模版项目。

截屏2022-06-14 13.34.39.png

然后,我们就可以基于生成的模版项目去实现更多的定制化功能了。例如,实现按需勾选依赖组件功能。

截屏2022-06-14 13.34.46.png

前端获取可选依赖库展示,后端根据前端传递的用户勾选的依赖项,先读取项目的pom.xml依赖配置文件,写入勾选的依赖的maven坐标。再根据勾选的依赖,添加初始化代码,以及添加配置项。 例如在Main类上添加@EnableXxx注解,在application.yaml配置文件中添加配置项。

其中的难点是如何修改pom.xml配置文件、application.yaml配置文件,以及如何修改java源码文件。读写xml文件可使用dom4j组件实现,读写yaml文件可使用snakeyaml组件实现,而修改java源码文件可使用javaparser组件实现。

最后,将模版项目压缩成jar包,响应jar包的下载链接给前端,前端使用下载链接生成下载按钮。

#中间件

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Go调用Lua性能压测与调优

基于go提供的基准测试能力编写并发测试用例,为排除脚本本身的性能影响,脚本只实现简单的逻辑,并实现预编译。通过调整虚拟机池策略、cpu数、并行度等,输出调用lua脚本的平均耗时、占用的内存。

被开源组件坑惨了,文件上传到MFS后MD5不一致

moosefs没有关于底层自定义二进制通信协议的文档,且各大版本api上差异很大。我们在github上找到一个go语言实现api操作moosefs的开源库,但不幸的是,这个组件实现的api版本很低,在测试阶段,我们发现上传文件到moosefs后,moosefs上存储的文件的md5与本地原文件md5不一致,如果是图片,能很明显的看出少了一块像素。

基于dubbo-go二次开发荔枝RPC框架

本文介绍如何基于dubbo-go的扩展点,二次开发支持公司内部rpc协议,支持java项目和go项目的互相调用。

Dubbo支持自适应等待无损下线

无损上下线是服务治理不可忽视的问题,在应⽤上下线发布过程中,如果上下线不平滑,就会出现短时间的服务调⽤报错,如连接被拒绝(`Connection refused`)、请求超时或请求异常。

Xxl-job SDK引发的OOM

由于输出的错误日记字符串长度过长,导致xxl-job-admin处理callback请求无法将日记入库。sdk会将失败的callback写入一个重试文件(xxl-job-callback.log),sdk有一个后台线程,定时每几秒会全量load重试文件到内存中...

Dubbo之HTTP RPC vs Dubbo RPC性能压测

此次性能测试对比的是我们基于Dubbo扩展点自实现的Http rpc协议,与Dubbo原生Dubbo rpc协议的单次请求响应平均耗时、吞吐量。