集成actuator实现优雅关闭应用

优雅停机主要应用在版本更新的时候,为了等待正在工作的线程全部执行完毕,然后再停止。我们可以使用SpringBoot提供的Actuator

1、pom.xml中引入actuator依赖

  1. // gradle
  2. compile "org.springframework.boot:spring-boot-starter-actuator:$rootProject.ext.springBoot"
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>

2、配置文件中endpoint开启shutdown

  1. # 优雅关闭服务
  2. management.endpoint.shutdown.enabled=true
  3. management.endpoints.web.exposure.include=shutdown
  4. management.endpoints.web.base-path=/monitor
  5. # 自定义管理端端口
  6. management.server.port=12581
  7. # 指定本机地址作为管理端地址,不允许远程连接,保证安全
  8. management.server.address=127.0.0.1
  1. management:
  2. server:
  3. port: 12581
  4. address: 127.0.0.1
  5. endpoint:
  6. shutdown:
  7. enabled: true
  8. endpoints:
  9. web:
  10. exposure:
  11. include: "shutdown"
  12. base-path: /monitor

3、Post请求测试验证优雅停机 curl -X POST http://localhost:8080/monitor/shutdown

Spring Boot 之 actuator 配置不当的漏洞利用

https://www.freebuf.com/news/193509.html

实现 Spring Boot 应用的优雅关机

https://www.cnblogs.com/yiyitong/p/11613268.html

限制运行内存

  1. nohup java -Xmx256m -Xms256m -jar emergency_management.jar > log.out 2>&1 &

“2>&1” 表示 错误和输出都传到 log.out 文件中

启动和关闭脚本

sed -i ‘s/\r//g’ start.sh

启动脚本, 创建 start.sh

  1. #!/bin/sh
  2. nohup java -jar 文件.jar >> log.out 2>&1 &
  3. cur_dir=$(pwd)
  4. echo $!> $cur_dir/obj.pid

关闭脚本,创建 shutdown.sh

  1. #!/bin/sh
  2. cur_dir=$(pwd)
  3. PID=$(cat $cur_dir/obj.pid)
  4. kill -9 $PID

actuator 实现优雅关闭应用脚本

  1. #!/bin/sh
  2. curl -X POST http://127.0.0.1:12081/monitor/shutdown

自定义 maven 插件

做一个 idea一键部署到服务器的maven插件

https://blog.csdn.net/qq_20907623/article/details/89373540

Maven 自定义插件

https://juejin.cn/post/6844903735496278024

指定外部jar位置

gradle 配置

  1. bootJar {
  2. archiveClassifier = 'boot'
  3. excludes = ["*.jar"]
  4. // 指定依赖包的路径,运行时不再需要指定 java.ext.dir 或 loader.path 参数。
  5. manifest {
  6. attributes "Manifest-Version": 1.0,
  7. 'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
  8. }
  9. }

自动生成 lib 目录 , 需要将 dependencies 里面的 都改成 compile

  1. dependencies {
  2. compile "org.springframework.boot:spring-boot-starter-quartz:$rootProject.ext.springBoot"
  3. compile "org.springframework.boot:spring-boot-starter-web:$rootProject.ext.springBoot"
  4. compile "org.springframework.boot:spring-boot-starter-validation:$rootProject.ext.springBoot"
  5. compile "org.springframework.boot:spring-boot-starter-aop:$rootProject.ext.springBoot"
  6. compile "org.springframework.boot:spring-boot-starter-data-redis:$rootProject.ext.springBoot"
  7. }
  1. // 清除lib
  2. task myClearLib(type: Delete) {
  3. delete "$buildDir/libs/lib"
  4. }
  5. // 拷贝lib
  6. task myCopyLib(type: Copy) {
  7. into "$buildDir/libs/lib"
  8. from configurations.runtime
  9. }
  10. bootJar {
  11. //mainClassName = 'com.hn.Application'
  12. archiveBaseName = 'youli-shop-api'
  13. archiveVersion = '1.0.0'
  14. archiveClassifier = 'boot'
  15. excludes = ["*.jar"]
  16. // lib目录的清除和复制任务
  17. dependsOn myClearLib
  18. dependsOn myCopyLib
  19. // 指定依赖包的路径,运行时不再需要指定 java.ext.dir 或 loader.path 参数。
  20. manifest {
  21. attributes "Manifest-Version": 1.0,
  22. 'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
  23. }
  24. }

-Djava.ext.dirs=./lib

  1. java -Djava.ext.dirs=./lib -jar youli-shop-api-1.0.jar

jar包部署 - 图1

jar包部署 - 图2

jar包部署 - 图3

tomcat配置内存大小

在文件/bin/catalina.sh的前面,增加如下设置:

  1. JAVA_OPTS='-Xmx256m -Xms256m'