本案例使用的是springboot2.0.4
当把打包好的jar包发布到服务器,并通过java -jar运行,一般要把springboot项目关闭大多数都是先找到项目的pid,然后直接kill pid,不过这种方法在特殊需求场景下不太合适(不安全),同时也不优雅。下面通过actuator来让springboot项目关闭优雅化。
先导入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后切换到application.properties文件,添加
# 启用shutdown
management.endpoint.shutdown.enabled=true
# 公开所有的端点
management.endpoints.web.exposure.include=*
目前只要做到这样就可以实现springboot项目的优雅关闭了
只要模拟一个POST请求,请求url默认为
http://host:port/actuator/shutdown
返回
{"message":"Shutting down, bye..."}
1
说明优雅关闭成功
——————————————–手动分割线————————————————-
如果只是这样的话,还是存在很大的安全问题,当外人知道你的项目ip地址和端口号,谁都可以模拟该请求关闭你的服务器,这是必须避免的问题。
默认不支持get方法
同样切换到application.properties文件,添加如下
#启用shutdown
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=*
# 自定义管理端点的前缀(保证安全)
management.endpoints.web.base-path=/MyActuator
# 自定义端口
management.server.port=12581
# 不允许远程管理连接(不允许外部调用保证安全)
management.server.address=127.0.0.1
自定义management.endpoints.web.base-path这样别人就不知道你的关闭服务器的请求路径是什么了。换句话说关闭服务器的链接就变成了这个
http://host:port/MyActuator/shutdown
光自定义management.endpoints.web.base-path安全性还不够,我们还要避免在服务器外面关闭服务器,这样就算别人知道你的ip地址、端口号和请求路径也无法干扰服务器了。
设置management.server.address为本地ip这样就不能远程访问了。同时还需注意一点就是management.server.port这个对应的端口号,不能和你的tomcat服务器端口号一样。否则会导致management.server.address失效,随意一个空闲端口号即可。
这样关闭服务器的时候,首先要登录服务器,本地以POST方式请求该链接,
如果是linux系统,直接curl -X POST http://127.0.0.1:12581/MyActuator/shutdown即可关闭。
注意一点,这里的port就是你在application.properties配置的management.server.port。
好了目前就已经可以做到安全且优雅的关闭springboot项目了。
——————————————手动分割线————————————————-
虽然已经能安全且优雅的关闭springboot项目了,但是假如只是想重启下项目,想想还要输入这么多且长的指令curl、java -jar等。那有没有比较方便的方式呢,当然就是靠万能的shell脚本来解决了。(停止项目也是如此,新创建一个shell里面就一行代码curl -X POST http://127.0.0.1:12581/MyActuator/shutdown即可)
创建一个shell脚本,编写一下内容。(写的一般般,借鉴下即可)
#!/bin/bash
PORT=$(netstat -ntulp | grep 12580)
# 如果PORT不为空说明有程序占用该端口号
if [[ -n $PORT ]]; then
echo "The server is open, ready to close"
RESULT="000"
while [[ $RESULT == "000" ]]; do
echo "Closing down ..."
# 优雅关闭springboot项目
RESULT=$(curl -X POST 127.0.0.1:12581/MyActuator/shutdown)
sleep 2
done
echo "Close off success"
fi
echo "Being started ..."
# 开启项目
/usr/local/work/finalab/jdk-10.0.2/bin/java -jar /usr/local/work/finalab/finalab.jar > log.info 2>log.error &
大致说下运行的思路,假如该端口号已经被占用,说明该springboot项目正在运行,就把它关闭,关闭完成后在打开springboot项目,如果该端口号不被占用则直接开启项目。
接下来说下编写的细节
netstat -ntulp | grep 12580
1
执行该命令,如果12580端口号空闲,则会返回空。不为空就返回该端口号信息。
if [[ -n $PORT ]];
1
shell 中利用 -n 来判定字符串非空。
while [[ $RESULT == "000" ]]; do
echo "Closing down ..."
# 优雅关闭springboot项目
RESULT=$(curl -X PORT 127.0.0.1:12581/MyActuator/shutdown)
sleep 2
done
中间关闭springboot项目为什么用while呢同时也用到了sleep,这么做主要是尽可能避免重复请求,和请求失败后能够继续尝试请求。
/usr/local/work/finalab/jdk-10.0.2/bin/java -jar /usr/local/work/finalab/finalab.jar > log.info 2>log.error &
这里在finalab.jar文件后面 > log.info 2>log.error &
第一个>就是把项目运行控制台的内容输入到同级目录下的log.info(没有这个文件的话,会自动创建),2代表错误信息,就是把错误信息输出到log.error文件中,最后的&代表项目在后台运行,这样关闭控制台,项目就不会挂掉了。
&一般常和nohup一起使用 nohup xxx &
nohup不挂断的运行(换句话说就是退出或者注销当前账户后程序还能运行),但不能保证后台运行。控制台关闭后就挂了。
& 代表可以后台运行(控制台关闭后对它没影响)
有关更多的nohup和&之间的关系请看https://www.cnblogs.com/jinxiao-pu/p/9131057.html
——————————————手动分割线————————————————-
当你把新版本的,jar项目上传到服务器把原来的.jar替换,会发现并没有自动帮我们重启项目,换句话说你还需要先shutdown项目,再来java -jar运行,是不是感觉有些麻烦。我们能不能像tomcat的webapps那样子自动更新项目呢
请看下一篇文章《运用inotify实现springboot项目自动更新部署》
https://blog.csdn.net/XlxfyzsFdblj/article/details/82110034
如果觉得对你有帮助,请麻烦随手给个赞 逃:)
————————————————
版权声明:本文为CSDN博主「Twilight.c」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XlxfyzsFdblj/article/details/82054744
下面笔者要教给大家一种高级使用的方法,做了一个安全的认证,上面关闭服务的缺点大家显而易见,知道服务端口和ip的就能关闭,这种做法很不安全,接下来要在客户端服务配置一下安全认证。
首先在eureka客户端服务的application.properties文件追加配置
eureka.client.service-url.defaultZone=http://admin:admin@localhost:1111/eureka/
server.port=8762
spring.application.name=eureka-client
management.security.enabled=true
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=true
#验证用户名
security.user.name=admin
#验证密码
security.user.password=admin
#角色
management.security.role=SUPERUSER
#指定shutdown endpoint的路径
endpoints.shutdown.path=/custompath
#也可以统一指定所有endpoints的路径`management.context-path=/manage`
#指定管理端口和IP
management.port=8081
management.address=127.0.0.1
我们使用了security,就需要在pom添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
大功告成,是不是很简单,下面启动你的客户端服务,这里我就不贴一些多余的图片了,成功注册到eureka上面了,和上面的图一样。
接下来使用终端访问 curl -X POST -u admin:admin 127.0.0.1:8081/custompath
看见了你的服务又和你say byebye了吧!
这个命令 curl -X POST -u admin:admin 127.0.0.1:8081/custompath 每一个位置对应的参数值大家可以看application.properties文件分别对应了哪些配置就明白了。
路过的大佬,看到这里给个赞吧!
————————————————
版权声明:本文为CSDN博主「胖虎。。」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38003389/article/details/83241504