springboot2.0优雅关闭

 

本案例使用的是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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值