springBoot+actuator 实现优雅的停止服务器

springBoot+actuator 实现优雅的停止服务器

  • 前言
    • 正文

前言

最新使用了springboot框架作为web应用开发,目前已经上生产环境,但是对了每周的代码更新是痛苦的,更加可怕的是之前没有处理好停止服务器的方式,导致更新代码之后偶尔会有一些用户反馈有问题,上去排查大多数结果都是数据丢失造成的,这就迎来了领导的一句话“以后停止服务器的方式做得优雅一点”。
注:

springboot - version: 2.1.0.RELEASE

正文

1.依赖
maven 项目 在 pom.xml 文件中加入 actuator 的依赖:


        
            org.springframework.boot
            spring-boot-starter-actuator
        

2.配置
springboot配置文件 application.yml 添加如下配置:

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"

management.endpoint.shutdown.enabled 这是说是否启动/shutdown端点,默认是false,
management.endpoints.web.exposure.include 这是公开所有端点
我做的时候在网上找了很多,有的说只要设置了 management.endpoint.shutdown.enabled 就是可以使用了,也有的说只要配置了 management.endpoints.web.exposure.include = '*' 也是可以用了,不知道是不是我的版本比较新,我单独配置其中的一个都是无法生效的,都是报 ‘404’ 错误,本人代码只有在配置文件同时配置了才能生效。

3.访问
按以上配置完成后,启动服务器,执行 http://localhost:8071/actuator/shutdown 返回成功标识,如下图:
springBoot+actuator 实现优雅的停止服务器_第1张图片
4.测试
首先我写了一个控制器和一个方法,方法里面休眠了 1分钟 ,代码如下:

@RestController
@RequestMapping("/test")
public class TestController extends BasePortalController {
    
    @PostMapping("/shutdown-server")
    public String shutdownServer() {
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        logger.info("终于可以了,哈哈哈哈哈哈哈");
        return "success";
    }
}

访问的路径 http://localhost:8080/test/shutdown-server 请求成功并且等待休眠过后返回 ‘success’。
首先执行 http://localhost:8080/test/shutdown-server 测试接口,紧接着执行 http://localhost:8071/actuator/shutdown 停止服务器,然后发现服务器是可以停止的,查看日记可以打印出 “终于可以了,哈哈哈哈哈哈哈”,这就表示springboot已经可以优雅的关闭了,至少服务器程序已经执行完了。

5.问题
当调用 http://localhost:8080/test/shutdown-server 后未调用 http://localhost:8071/actuator/shutdown ,等待休眠后返回 ‘success’,
当调用 http://localhost:8080/test/shutdown-server 后调用 http://localhost:8071/actuator/shutdown 你就会发现,你需要的 ‘success’ 是不会返回了,效果如图:
springBoot+actuator 实现优雅的停止服务器_第2张图片
虽然说上面的截图报错是可以理解的,但是本人总觉得老是缺了点那么意思,如果调用shutdown后能应该有的结果给到用户,那么才是最完整的,毕竟有一些项目是做API开发的,如果优雅的停掉之后没有结果返回,虽然线程是执行完了,但是用户拿不到相对应的结果,那么用户的数据就不会得到更新,最终可能就会造成用户数据和我方数据对不上的问题。
如果还有那么大神有更好的处理方式,欢迎告知,谢谢。

你可能感兴趣的:(springBoot+actuator 实现优雅的停止服务器)