最近在写SpringBoot项目和学习Linux,在项目部署的过程中遇到了一些问题,特以此文章进行记录,希望可以帮助更多人少走一些弯路;
服务器通常是Linux系统,虽然部署的过程是有一步又一步的步骤所组成,我们可以借助搜索和chatgpt快速推进和遇到的解决问题,但我们还是需要掌握Linux的基础知识和指令,以快速推测导致问题的原因。
以下文章围绕着SpringBoot项目开发部署过程中的重要步骤和可能遇到的问题展开。
数据库的部署
在需求文档、项目原型图确定以后,前端和后端开始对接口,写接口文档。这时候,后端就需要根据项目的实际需求,构思ER图,建立数据库。这时候我们就需要思考一个问题,在程序的开发环节,多名后端开发人员是独自使用本地的数据库,还是使用一个共享的数据库?答案是人员少,方便管理的情况下,可以使用共享的数据库,因为这样就不需要每一名开发人员都在自己的电脑上运行同一份sql脚本和模拟假数据了。人多不方便管理,可以考虑小批共享数据库和使用本地数据库。
在我们的项目中,由于后端开发人员较少,所以直接使用共享数据库。将数据库直接部署到服务器上,建立多名操作数据库的用户,授予不同的权限进行管理。
数据库部署请查阅这篇文章数据库部署
SpringBoot项目部署
1.在服务器上下载jar,配置环境变量
由于我们的SpringBoot使用的是3.0.5,需要JDK17进行支持,所以以JDK17的下载和配置为例。
在官网下载jdk-17_linux-x64_bin.tar.gz linux版本的JDK17压缩包,通过Xftp(文件传输工具)将下载的压缩包上传到服务器上面,解压到任意目录,这里我是解压到/opt/develop/目录下,具体步骤如下:
- 解压缩JDK安装文件
tar -zxvf jdk-8u351-linux-x64.tar.gz -C /opt/develop/
- 配置JDK的软链接(替换Linux系统中自带Java程序的软链接使用)
ln -s /export/server/jdk1.8.0_351 /opt/develop/jdk
- 配置JAVA_HOME环境变量,以及将$JAVA_HOME/bin文件夹加入PATH环境变量中
# 编辑/etc/profile文件,在文件的最下方进行配置
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin
- 执行 /etc/profile文件,使配置的环境变量生效
source /etc/profile
- 配置java执行程序的软链接
# 删除系统自带的java程序
rm -f /usr/bin/java
# 软链接我们自己安装的java程序
ln -s /export/server/jdk/bin/java /usr/bin/java
- 执行验证
which java //看命令执行的路径是否是/usr/bin/java
java -version//看JDK版本是否同我们安装的版本一致
2.运行SpringBoot项目的jar包
由于SpringBoot工程内置轻量的服务器,使我们可以直接通过java -jar运行,因此我们不需要额外下载第三方的Web服务器,如nginx;将我们的命令进行打包(先clean,再package)
将我们打包好的项目jar包通过Xftp或者其他传输软件,上传到服务器。
java -jar /opt/SpringBootProject/CAP-1.0-SNAPSHOT.jar //将位置替换成你的
如果在运行的时候出现端口占用的情况,导致项目不能正常启动,我们需要查看那一个进程占用我们项目启动的端口,来决定关闭占用端口的进程还是更换我们项目启动的端口
先使用netstat -nlp | grep 8080(替换为你项目使用的端口)命令查看什么进程占用了端口,我们发现是9018进程占用了我们的端口,再使用ps -ef | grep 9018 查看9018进程的详细信息,我们发现是一个jar的项目,此时我们可以直接选择kill -9 9018进程或者更改SpringBoot项目中的port配置
3.SpringBoot项目持续运行
此时虽然我们可以在服务器上运行自己的SpingBoot项目和解决部署过程中的一些简单问题。但是我们会发现,一旦我们退出服务器或者关闭当前bash命令窗口,我们的SpringBoot项目就无法进行正常的访问。
原因:我们在bash窗口中通过java -jar
启动 Spring Boot 项目,该进程会被分配到该终端会话所在的进程组中。如果我们关闭了终端,该进程组也会被关闭,导致运行项目的进程也一并被终止。可以通过下图中的命令进行摸排。
思路:是否存在一种方法,将我们的项目向守卫进程(服务)一样在后台持续运行,就比如防火墙的服务。也就是说,我们需要想办法,把由进程启动项目变为由服务启动项目
解决:使用systemd服务来让Spring Boot项目一直运行,我们需要创建一个systemd服务单元文件并进行配置。下面是详细的步骤:
- 创建服务单元文件: 在Linux系统中,打开一个文本编辑器,并创建一个名为
your-application.service
的文件。将your-application
替换为您的应用程序名称。 - 编辑服务单元文件: 将以下内容添加到服务单元文件中:
[Unit]Description=Your Application
After=syslog.target
[Service]User=<your_user>
WorkingDirectory=/path/to/your/application
ExecStart=/usr/bin/java -jar your-application.jar
SuccessExitStatus=143Restart=always
[Install]WantedBy=multi-user.target
注意替换以下内容:
<your_user>
:将其替换为您要运行应用程序的用户。/path/to/your/application
:将其替换为您的应用程序所在的路径。your-application.jar
:将其替换为您的应用程序的JAR文件名称。- 其他地方不要进行更改。
3 . 保存服务单元文件: 将服务单元文件保存到/etc/systemd/system/
目录下。请确保使用管理员权限保存文件。
Plain rm your-application.service文件的位置 /etc/systemd/system/
4. 设置文件权限: 执行以下命令以确保服务单元文件具有正确的权限:
sudo chmod 644 /etc/systemd/system/your-application.service
- 设置开启自启用该服务:
sudo systemctl enable your-application
- 启动服务:
sudo systemctl start your-application
- 验证服务状态:
sudo systemctl status your-application
如果一切正常,服务运行的状态如下:
现在,Spring Boot项目已经可以通过systemd服务在Linux系统中持续运行。您可以使用systemctl命令来管理和控制应用程序的状态,例如停止、重启或查看日志等。