赞
踩
对于前面的hello项目,我们是在IDE中直接运行的,实际上Spring boot项目(主要讨论web项目)的运行方式有很多种,包括:
下面我们简单看一下每一种运行方式
只需要找到入口类,然后直接右键运行就可以了。
切换到项目的根目录下,执行 mvn spring-boot:run命令。
mvn spring-boot:run
首先把项目打包成Jar文件,切换到项目根目录,然后执行打包命令:
mvn package
如果在打包时想跳过测试可以直接执行下面的命令:
mvn -Dmaven.test.skip=true package
maven会在target目录中生成一个hello-1.0.jar,执行下面的命令便可以运行hello项目:
java -jar target\hello-1.0.jar
除了通过java -jar的方式运行外,在linux系统中,我们还可以直接把spring boot项目打包成可执行文件的形式,只需要添加如下配置,(为了方便,这儿把打包后的Jar包名称改成了hello):
打包结束后,把jar包拷贝到linux系统中,然后通过chmod u+x hello.jar赋予执行权限,便可以直接执行。
./hello.jar
这种方式虽然非常方便,但在实际的环境中我们可能想要配置一些JVM参数之类的信息,这时应该怎么办呢?可以使用如下的方式:
在hello.jar所在的目录下创建一个hello.conf文件,然后在其中添加参数信息:
JAVA_OPTS=-Xmx1024M
需要注意的是除了后缀不同,配置文件的名称必须和项目的jar包同名,也就是hello.jar对应的配置为hello.conf。具体的可配置项可以参考如下文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment Customizing a Script When It Runs 部分。
Spring boot项目默认的打包方式是jar,如果我们需要以传统war包的方式放到外部容器中运行,可以修改打包方式为war,在pom.xml中加入下面的代码:
<packaging>war</packaging>
然后执行mvn package命令便可以在target目录下找到打包好的war文件,把war文件放到容器的应用目录下即可。
在实际的生产环境中我们可能会以java -jar的方式运行spring boot项目,但是默认的方式却是以前台的形式运行,一旦我们关闭了命令行窗口,项目便会自动退出,这显然不符合我们的需求,我们想要的是让项目在后台默默无闻的永远运行着,除非我们主动关闭掉。可以使用nohup命令让spring boot项目在后台运行,并且关闭命令行窗口时依然存在。
nohup java -jar hello-1.0.jar &
这时,控制台的输出会被重定向到当前目录下的nohup.out文件中,如果需要重定向到其他文件,可以使用类似下面的命令:
nohup java -jar hello-1.0.jar &>> console.out &
这儿的&>>表示把标准输出和错误输出全部重定向到console.out文件中,并且是以追加的方式写入。如果不想以追加的方式,而是直接覆盖,可以使用如下命令:
nohup java -jar hello-1.0.jar &> console.out &
前提条件
在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
注:这儿是以root账户运行hello项目的,如果想要用其他用户运行,修改User和Group配置。
然后我们就可以通过如下命令启动和停止项目:
systemctl start hello
systemctl stop hello
其他命令:
systemctl status hello # 查看服务状态
systemctl enable hello # 开机启动
sytemctl disable hello # 禁止开机启动
在Linux系统中,我们可以使用kill命令关闭进程,因此我们只需要找到spring boot项目对应的进程号,就可以使用kill命令关闭它。我们尽量使用sigterm信号关闭进程,如果实在关闭不了,也可以使用sigkill信号强制关闭,这种手段比较暴力,要慎用,因为可能出现数据不一致的情况,因为它没有给项目做一些必要的清理工作的机会。
ps -ef | grep hello # 找到进程号
kill -15 $APP_PID # 发送sigterm信号终止进程
如果我们已经把spring boot项目部署成了systemd服务,就可以使用systemctl stop命令关闭服务:
systemctl stop hello
我们可能想要的结果是,当我们发出关闭命令时,已经接收的请求继续处理完成,而新的请求不再接收,等待这些正在处理的请求完成后,再关闭项目。这样便可以使应用程序处于一致的状态,这就是优雅关闭。spring boot在2.3版本后提供了优雅关闭的功能,要想优雅的关闭应用程序,需要在application.properties文件中配置如下两个属性:
server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=60s
第一个属性指定了我们想要启用优雅关闭的功能。优雅关闭的本意就是让程序体面的退出历史舞台,但是有可能某些原因导致程序始终赖着不走,这时我们也只好不留情面,强制干预了,因此第二个属性则指定了等待请求处理完成的时间,如果超过了这个时间,将会强制关闭。
我们怎么实验这种情况呢,一种方法是在我们的HelloController处理方法中让线程睡眠40s,在浏览器发出请求的同时使用kill 关闭程序,然后便可以检查它有没有遵守自己的承诺。
若想通过Actuator发送Http post请求的方式关闭项目,需要先做如下的配置:
引入对Actuator的依赖
在application.yml中启用shutdown端点
配置完成后重启项目,然后通过浏览器发送 http://localhost:8888/actuator/shutdown请求关闭项目。
注:如果用于生产环境,需要配置安全信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。