spring boot 服务 正确关闭方式
引言
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 endpoin
t默认是关闭的,因此在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>开启安全验证
在application.properties
中变更配置,并#开启shutdown的安全验证
endpoints.shutdown.sensitive=true
#验证用户名
security.user.name=admin
#验证密码
security.user.password=secret
- 此时post的url 需附加密码和账号: http://admin:secret@localhost:8888
方式二:部署为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
中引入插件:
<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]
的结果反馈
(设置开机启动 chkconfig servicename on/off)
默认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
References:
本文转自(http://www.cnblogs.com/lobo/p/5657684.html),部分内容做了微调
spring boot 服务 正确关闭方式的更多相关文章
- 启动/关闭Spring boot服务脚本
启动Spring boot服务脚本 #!/bin/bash cd /test java -jar test.jar &> ./test.log & echo "成功&q ...
- 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】
要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...
- .net core + eureka + spring boot 服务注册与调用
.net core + eureka + spring boot 服务注册与简单的调用 假期小长假遇上疫情只能去家里蹲了,刚好有时间总结一下. 概述 微服务架构是当前比较火的分布式架构,本篇基于.ne ...
- windows环境下,spring boot服务使用docker打包成镜像并推送到云服务器私有仓库
最近在淘宝上学习springcloud教程,其中有几节课是讲解讲本地springboot服务打包成镜像并推送到云服务器私有仓库,但是教程里面用的事Mac环境,我的是Windows环境,而且课程里面没有 ...
- 【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动 ...
- Java框架Spring Boot & 服务治理框架Dubbo & 应用容器引擎Docker 实现微服务发布
微服务系统架构实践 开发语言Java 8 框架使用Spring boot 服务治理框架Dubbo 容器部署Docker 持续集成Gitlab CI 持续部署Piplin 注册中心Zookeeper 服 ...
- Spring Boot程序正确停止的姿势
Spring Boot提供了2种优雅关闭进程的方式: 基于管理端口关闭进程 基于系统服务方式关闭进程 基于管理端口关闭进程 基于管理端口方式实现进程关闭实际上是模块spring-boot-actuat ...
- Spring Boot 以 jar 包方式运行在后台
spring-boot jar 包方式启动: 首先,为了防止和常用的 Tomcat 8080 端口冲突,将 Spring-boot 项目的端口号设置为 9090. 具体方法:在 application ...
- 基于netty实现rpc框架-spring boot服务端
demo地址 https://gitee.com/syher/grave-netty RPC介绍 首先了解一下RPC:远程过程调用.简单点说就是本地应用可以调用远程服务器的接口.那么通过什么方式调用远 ...
随机推荐
- jquery实现相同事件名称,不同命名空间的调用方法
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...
- SQLServer 日期函数大全 SQLServer 时间函数大全
原文地址:https://www.cnblogs.com/zhangpengnike/p/6122588.html 一.统计语句 1.--统计当前[>当天00点以后的数据] SELECT * F ...
- HTTPS为什么更安全,先看这些 , 网络加密 , 加密解密
投递人 itwriter 发布于 2017-02-27 21:35 评论(10) 有1957人阅读 原文链接 [收藏] « » HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 H ...
- 洛谷 P1082 同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- 下载Sourceforge等国内无法下载站点文件的另一种方法
Sourceforge是一些开源软件经常用到的网站,然而国内的网站一直不稳定,如今是可以访问,但是一直无法下载,今天发现了一种新方法那就是http://www.mirrorservice.org 这个 ...
- Andriod源码搜集
1.一个左侧抽屉式导航NavigationDraw 教程:http://developer.android.com/training/implementing-navigation/nav-drawe ...
- jboss支持远程访问配置
jboss有个特点,在本机启动之后,只能在本机的网页访问 http://localhost:8080,在其他机器上访问不了jboss服务. 1.关闭jboss服务端的防火墙 解决方法如下: (dcm4 ...
- 学习笔记:Maven的ArcheType的学习笔记
摘要: Archetype是什么?它由哪些文件组成?如何创建和安装自己的archtype,如何使用自己创建的archetype? 一.Archetype是什么 Archetype其实就 ...
- oracle归档日志的操作
oracle利用重做日志文件记录对数据库的操作.可是重做日志文件组是循环使用的,当所有的日志文件都被填满时,系统自己主动切换到第一组日志文件,当然数据库管理员也能够使用命令手 ...
- c/c++ sizeof运算符详解以及对象大小
原文:http://krystism.is-programmer.com/posts/41468.html 学过c的都知道sizeof运算符.不过还是需要注意以下几点.先从c的sizeof说起: 1. ...