前言
众所周知,Springcloud项目由一个个springboot项目组成,而springboot项目本身自带Tomcat,当我们想要部署springboot项目时,只要使用maven工具将其打成jar包,放到有java环境的系统,使用命令java -jar xxx.jar,即可成功运行起来。
本文以微服务架构项目尚医通的后端部分为例子,作打包部署时遇到的问题总结。尚医通也是我学习的第一个微服务实战项目,网上有详细免费教程,课程最后没有讲到如何部署,经过调查研究有了此篇文章。
项目结构
截图展示到模块,再展开就是模块内部结构。可以看到此项目分了最多三层,在顶层项目yygh_parent下有多个子模块,其中common、service、service_client模块内又有多个子模块。
service:业务模块,放置所有的业务逻辑
common:公共模块,包含一些工具类,被业务模块多处引用
model:模型模块,放置所有的实体类,作为父类被继承或基础类使用
service_client:feign模块,用于微服务之间的调用
service_gateway:全局网关
hospital-manage:一个独立项目,后面不再涉及
项目打包
在打包之前,应该确保项目在本地能够正常运行。
maven的打包方式
maven有三种打包方式,分别为jar(默认)、pom、war
jar:默认打包方式,打包后在项目的target文件下会产生一个新的jar包,此jar包自带Tomcat环境,可以直接运行
pom:用于父项目,用于做版本控制
war:打包成一个web项目
修改pom.xml配置文件
在此项目下,所有的父项目都应该以pom作为打包方式,子项目以jar为打包方式。比如service属于父项目,没有自己的启动类,所以打包方式为pom,service下的service_hosp是子项目,打包方式为jar。
其次,打成jar包需要配置打包插件,项目使用springboot提供的插件。
<build>
<finalName>service_hosp</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
运行打包命令
配置完后,在总项目目录(yygh_parent)中输入打包命令mvn package进行打包。或者点击idea提供的打包图形化工具:
如果打包后没有报错,打好的jar包会放到target目录下:
可以先做测试,直接在终端到达此目录下,使用java -jar service_hosp.jar运行jar包,像在idea中启动一样做好相关测试。
打包时遇到的问题
项目如果足够复杂,有些依赖是自己开发的,比如这个尚医通项目,在业务模块service_hosp中需要引入common模块的子模块rabbit_utils
如果不做任何处理,在本地测试时会自动引入,但打包时就会报错,原因在于找不到这个包。分析原因,maven在打包时会将依赖引入,它会先到本地的maven仓库中查找有没有相关依赖,如果没有会到网络仓库(在maven文件中配置,默认maven自己的仓库)中查找。如果我们不事先将这个依赖放到仓库,肯定会报错。
在执行上述步骤全局打包之前,可以先执行以下代码:
mvn dependency:resolve -Dclassifier=sources
此代码用于加载依赖资源,下载依赖资源,我们在debug、查看源码时,可能也会需要用到。最后报错信息中,会显示哪些依赖没有找到,比如上面截图的依赖,这时候再将这些依赖一一放到本地maven仓库就行。执行以下代码:
mvn install:install-file -Dfile=common/common_utils/target/rabbit_utils-1.0.jar -DgroupId=com.ouou -DartifactId=rabbit_utils -Dversion=1.0 -Dpackaging=jar
groupId、artifactId、version:依赖的gav坐标
packaging:依赖类型
file:文件路径。注意是相对路径,上面的终端在yygh_parent目录下打开,通过相对路径定位到这个jar包
尾声
这部分是啰嗦环节。
通过上面步骤成功打成的jar包,在本地测试没问题后,可以直接放到服务器上运行了,当然前提是还有数据库、nacos等配置需要改成真实的ip。我在本地测试也没问题,遗憾的是我没有放到服务器上。
首先是因为这个项目实在太大了,如果将前端部分、nacos、redis、MongoDB全部跑起来,有十多个服务,即使是在本地也无法全部启动。所以我做到后面经常程序崩溃(人也有点崩),内存溢出,只能是做了哪些功能就跑哪些服务。我的个人电脑有16g内存,然而测试服务器只有1g内存,目前还跑了其他项目。
其次,部署相关知识薄弱,还在小打小闹的阶段。用上述的打包方式会将依赖也一起打包,使得jar包臃肿,还有其他的打包方式和工具。应该可以做优化,还需深入学习。
最后,由于经历过各种软件安装的锻炼(zhe mo),打算了解下docker。