当前位置:   article > 正文

Spring boot系列3 - Spring boot项目的运行和关闭方式_运行一个 springboot3 项目

运行一个 springboot3 项目

Spring boot项目的运行方式

对于前面的hello项目,我们是在IDE中直接运行的,实际上Spring boot项目(主要讨论web项目)的运行方式有很多种,包括:

  • 在IDE中运行
  • 通过maven插件运行
  • 通过java -jar的方式运行
  • 直接打包成Linux系统下的可执行文件
  • 打包成war包的形式在容器中运行

下面我们简单看一下每一种运行方式

在IDE中运行

只需要找到入口类,然后直接右键运行就可以了。

通过maven插件运行

切换到项目的根目录下,执行 mvn spring-boot:run命令。

mvn spring-boot:run
  • 1

通过java -jar的方式运行

首先把项目打包成Jar文件,切换到项目根目录,然后执行打包命令:

mvn package
  • 1

如果在打包时想跳过测试可以直接执行下面的命令:

mvn -Dmaven.test.skip=true package
  • 1

maven会在target目录中生成一个hello-1.0.jar,执行下面的命令便可以运行hello项目:

java -jar target\hello-1.0.jar
  • 1

直接打包成Linux系统下的可执行文件

除了通过java -jar的方式运行外,在linux系统中,我们还可以直接把spring boot项目打包成可执行文件的形式,只需要添加如下配置,(为了方便,这儿把打包后的Jar包名称改成了hello):
在这里插入图片描述
打包结束后,把jar包拷贝到linux系统中,然后通过chmod u+x hello.jar赋予执行权限,便可以直接执行。

./hello.jar
  • 1

这种方式虽然非常方便,但在实际的环境中我们可能想要配置一些JVM参数之类的信息,这时应该怎么办呢?可以使用如下的方式:
在hello.jar所在的目录下创建一个hello.conf文件,然后在其中添加参数信息:

JAVA_OPTS=-Xmx1024M
  • 1

需要注意的是除了后缀不同,配置文件的名称必须和项目的jar包同名,也就是hello.jar对应的配置为hello.conf。具体的可配置项可以参考如下文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment Customizing a Script When It Runs 部分。

打包成war包形式在容器中运行

Spring boot项目默认的打包方式是jar,如果我们需要以传统war包的方式放到外部容器中运行,可以修改打包方式为war,在pom.xml中加入下面的代码:

<packaging>war</packaging>
  • 1

然后执行mvn package命令便可以在target目录下找到打包好的war文件,把war文件放到容器的应用目录下即可。

在Linux系统中作为后台进程运行 - nohup

在实际的生产环境中我们可能会以java -jar的方式运行spring boot项目,但是默认的方式却是以前台的形式运行,一旦我们关闭了命令行窗口,项目便会自动退出,这显然不符合我们的需求,我们想要的是让项目在后台默默无闻的永远运行着,除非我们主动关闭掉。可以使用nohup命令让spring boot项目在后台运行,并且关闭命令行窗口时依然存在。

nohup java -jar hello-1.0.jar &  
  • 1

这时,控制台的输出会被重定向到当前目录下的nohup.out文件中,如果需要重定向到其他文件,可以使用类似下面的命令:

nohup java -jar hello-1.0.jar &>> console.out &
  • 1

这儿的&>>表示把标准输出和错误输出全部重定向到console.out文件中,并且是以追加的方式写入。如果不想以追加的方式,而是直接覆盖,可以使用如下命令:

nohup java -jar hello-1.0.jar &> console.out &
  • 1

在Linux中作为Systemd服务运行

前提条件
在Spring boot的maven插件中配置executable属性为true。
在这里插入图片描述
把打包后的hello.jar文件被拷贝到Linux系统中,假设在/root/hello/hello.jar
在/etc/systemd/system目录下创建文件hello.service,添加如下内容:

[Unit]
Description=hello application
After=syslog.target


[Service]
Type=simple
ExecStart=/root/hello/hello.jar
ExecStop=/bin/kill -15 $MAINPID
User=root
Group=root
WorkingDirectory=/root/hello
SuccessExitStatus=143


[Install]
WantedBy=multi-user.target
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注:这儿是以root账户运行hello项目的,如果想要用其他用户运行,修改User和Group配置。
然后我们就可以通过如下命令启动和停止项目:

systemctl start hello
  • 1
systemctl stop hello
  • 1

其他命令:

systemctl status hello # 查看服务状态
  • 1
systemctl enable hello # 开机启动
  • 1
sytemctl disable hello # 禁止开机启动
  • 1

关闭Spring boot项目的方式

  • Linux kill命令
  • systemctrl stop
  • 优雅关闭
  • Actuator

使用Linux系统中的kill 命令

在Linux系统中,我们可以使用kill命令关闭进程,因此我们只需要找到spring boot项目对应的进程号,就可以使用kill命令关闭它。我们尽量使用sigterm信号关闭进程,如果实在关闭不了,也可以使用sigkill信号强制关闭,这种手段比较暴力,要慎用,因为可能出现数据不一致的情况,因为它没有给项目做一些必要的清理工作的机会。

ps -ef | grep hello # 找到进程号
kill -15 $APP_PID # 发送sigterm信号终止进程
  • 1
  • 2

使用systemctl stop关闭

如果我们已经把spring boot项目部署成了systemd服务,就可以使用systemctl stop命令关闭服务:

systemctl stop hello
  • 1

优雅关闭graceful

我们可能想要的结果是,当我们发出关闭命令时,已经接收的请求继续处理完成,而新的请求不再接收,等待这些正在处理的请求完成后,再关闭项目。这样便可以使应用程序处于一致的状态,这就是优雅关闭。spring boot在2.3版本后提供了优雅关闭的功能,要想优雅的关闭应用程序,需要在application.properties文件中配置如下两个属性:

server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=60s
  • 1
  • 2

第一个属性指定了我们想要启用优雅关闭的功能。优雅关闭的本意就是让程序体面的退出历史舞台,但是有可能某些原因导致程序始终赖着不走,这时我们也只好不留情面,强制干预了,因此第二个属性则指定了等待请求处理完成的时间,如果超过了这个时间,将会强制关闭。
我们怎么实验这种情况呢,一种方法是在我们的HelloController处理方法中让线程睡眠40s,在浏览器发出请求的同时使用kill 关闭程序,然后便可以检查它有没有遵守自己的承诺。

通过Actuator发送post请求

若想通过Actuator发送Http post请求的方式关闭项目,需要先做如下的配置:

  1. 引入对Actuator的依赖
    在这里插入图片描述

  2. 在application.yml中启用shutdown端点
    在这里插入图片描述
    配置完成后重启项目,然后通过浏览器发送 http://localhost:8888/actuator/shutdown请求关闭项目。
    注:如果用于生产环境,需要配置安全信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/334284
推荐阅读
相关标签
  

闽ICP备14008679号