2019独角兽企业重金招聘Python工程师标准>>>

引言

Spring Boot,作为Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物,它能帮助我们很快捷的创建出独立运行、产品级别的基于Spring框架的应用,大部分Spring Boot应用只需要非常少的配置就可以快速运行起来,是一个与微服务(MicroServices)相当契合的微框架。

网络上关于Spring Boot的QuickStart式中文内容已经相当丰富,但是对于部署后怎样便捷、安全地停止服务(shutdown),还比较缺乏,最近发现Spring Boot的官方指南更新了相关内容,因此结合该部分更新,对如何基于官方提供的特性正确地停止Spring Boot应用进行简单说明。

主要有两种方式:通过HTTP发送shutdown信号,或者通过service stop的方式

方式一:通过HTTP发送shutdown信号

该方式主要依赖Spring Boot Actuator的endpoint特性,具体步骤如下:

1. 在pom.xml中引入actuator依赖

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

2. 开启shutdown endpoint

Spring Boot Actuator的shutdown endpoint默认是关闭的,因此在application.properties中开启shutdown endpoint:

#启用shutdown

endpoints.shutdown.enabled=true

#禁用密码验证

endpoints.shutdown.sensitive=false

3. 发送shutdown信号

shutdown的默认url为host:port/shutdown,当需要停止服务时,向服务器post该请求即可,如:

curl -X POST host:port/shutdown

将得到形如{"message":"Shutting down, bye..."}的响应

4. 安全设置

可以看出,使用该方法可以非常方便的进行远程操作,但是需要注意的是,正式使用时,必须对该请求进行必要的安全设置,比如借助spring-boot-starter-security进行身份认证:

pom.xml添加security依赖

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-security</artifactId>

</dependency>

springframework.security package not found with starter-security dependency..why...?

开启安全验证

在application.properties中变更配置,并

#开启shutdown的安全验证

endpoints.shutdown.sensitive=true

#验证用户名

security.user.name=admin

#验证密码

security.user.password=secret

#角色

management.security.role=SUPERUSER

指定路径、IP、端口

#指定shutdown endpoint的路径

endpoints.shutdown.path=/custompath

#也可以统一指定所有endpoints的路径`management.context-path=/manage`

#指定管理端口和IP

management.port=8081

management.address=127.0.0.1

方式二:部署为Unix/Linux Service

该方式主要借助官方的spring-boot-maven-plugin创建"Fully executable" jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:

1. 在pom.xml中引入插件:

xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>

2. 设置为系统服务

将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:

sudo ln -s /var/app/app.jar /etc/init.d/app

3. 赋予可执行权限:

chmod u+x app.jar

4. 以系统服务的方式管理

接下来,就可以使用我们熟悉的service foo start|stop|restart来对应用进行启停等管理了

sudo service app start|stop

命令将得到形如Started|Stopped [PID]的结果反馈

默认PID文件路径:/var/run/appname/appname.pid

默认日志文件路径:/var/log/appname.log

这可能是我们更熟悉也更常用的管理方式。

自定义参数

在这种方式下,我们还可以使用自定义的.conf文件来变更默认配置,方法如下:

在jar包相同路径下创建一个.conf文件,名称应该与.jar的名称相同,如appname.conf

在其中配置相关变量,如:

JAVA_HOME=/usr/local/jdk

JAVA_OPTS=-Xmx1024M

LOG_FOLDER=/custom/log

安全设置

作为应用服务,安全性是一个不能忽略的问题,如下一些操作可以作为部分基础设置参考:

为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin

赋予最小范围权限:chmod 500 app.jar

阻止修改:sudo chattr +i app.jar

对.conf文件做类似的工作:chmod 400 app.conf,sudo chown root:root app.conf

转载于:https://my.oschina.net/javahongxi/blog/1523786

正确、安全地停止springboot应用相关推荐

  1. java 中如何正确的停止线程

    如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...

  2. linux停止jar程序,Linux 启动停止SpringBoot jar 程序部署Shell 脚本的方法

    废话不多说了,先给大家上代码,具体代码如下所示: #!/bin/bash cd `dirname $0` CUR_SHELL_DIR=`pwd` CUR_SHELL_NAME=`basename ${ ...

  3. python 程序停止打印日志_优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止!

    在使用 SpringBoot 的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接 ...

  4. Golang如何正确的停止Ticker

    Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码 ...

  5. linux启动脚本springboot,Linux 启动停止SpringBoot jar 程序部署Shell 脚本的方法

    废话不多说了,先给大家上代码,具体代码如下所示: #!/bin/bash cd `dirname $0` cur_shell_dir=`pwd` cur_shell_name=`basename ${ ...

  6. 如果优雅停止 SpringBoot 服务,应该拒绝 kill -9 暴力停止

    搞IT 在使用 SpringBoot 的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序 ...

  7. php队列会停止执行吗,php – Laravel Artisan CLI安全地停止守护程序队列工作者

    为了处理大量的工作,我运行可变数量的队列工作者,具体取决于完成的工作量.我不想在完成我们认为合适的时间段内完成需要完成的工作之外运行更多的工人. 目前,我启动了5个守护程序队列工作程序用于测试目的,但 ...

  8. Java——安全地停止线程

    错误用例 下面用例中,一个正在sleep的线程,在调用interrupt后,wait方法检查到isInterrupted()为true,抛出异常, 而catch到异常后没有处理.一个抛出了Interr ...

  9. SpringBoot 1.X 优雅停机 ( shutdown gracefully )

    1:常规的关闭方式 该方式主要依赖Spring Boot Actuator的endpoint特性,具体步骤如下: 1) 在pom.xml中引入actuator依赖 <dependency> ...

最新文章

  1. 太白---落燕纷飞第一重 Android单元測试Instrumentation和irobotium
  2. 阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
  3. springboot listener_Springboot 全套面试提升宝典,为金三银四冲刺
  4. HTML+CSS+JS实现美女canvas仿ps橡皮擦刮刮卡
  5. [JavaScript] Cookie,localStorage,sessionStorage概述
  6. FFmpeg wav转pcm(十一)
  7. java线程下载文件_使用多线程在Java下载文件
  8. 元胞自动机-附代码注释
  9. 存在隐患 : 此角色的 日志目录 所在的文件系统的可用空间小于 10.0 吉字节。 /var/log/hive(可用:9.9 吉字节 (28.12%),容量:35.1 吉字节)
  10. Windows蓝屏了,如何处理?
  11. PostgreSQL 13新特性:fetch first with ties
  12. 关于提取千位百位十位个位数字
  13. sql 数据存在包含关系的查询
  14. 浮点数为什么不精确?
  15. Gvim计数器模板经典练习
  16. Telephony之PhoneInterfaceManager(原)
  17. 用一组方程表示一个平面
  18. 运营笔记:SEO快排那些事儿!
  19. python基础 -23- 模块(random,chardet,os,sys,copy,time,datetime,pytz,pickle,json,MD5,SHA-1,shutil,re等)
  20. python123《python语言程序设计》程序设计题第一周第二周第三周第四周第五周

热门文章

  1. ansible的模块使用
  2. 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?...
  3. 【转】PowerDesigner表结构和字段大小写转换
  4. Oracle可以处理LOB字段的常用字符函数
  5. win2008r2下安装sql2008r2初版
  6. python常用的字串格式化选项
  7. SCVMM2008的P2V后 MAC地址冲突
  8. 突破屏蔽限制,自己的网站使劲弹新IE窗口
  9. 使用git命令导出项目_【git学习】SVN项目迁移到Git操作指南
  10. 5G NGC — LMF 定位管理功能