`
bugyun
  • 浏览: 559101 次
社区版块
存档分类
最新评论

SpringBoot 实战 之 优雅终止服务(转)

 
阅读更多

转:

https://blog.csdn.net/chinrui/article/details/78685032

https://blog.csdn.net/qq_14844399/article/details/79038008

 

Q/A:数据库链接暴增,导致超过最大连接数,druid连接池在程序关闭后连接不释放问题。

 

 

由于 SpringBoot 是一个微服务框架,其生产部署的方式也需要尽可能的简单,与常规的 Web 应用有着一个巨大的不同之处,它可以内嵌一个 Web 容器,如:Tomcat、Jetty等,不再需要将应用打包成容器规定的特定形式。

对于 SpringBoot 来说,打包成一个简单的 Jar 包直接使用 java -jar即可启动,这是一种非常优雅的方式,但同时也带来了一定的问题,如:应用如何停止?在过去,应用程序是部署在特定的容器中的,使用容器提供的脚本可以优雅停服,但现在容器被内嵌了,脚本没有了,怎么办?直接 kill 是一种方式,但未免显得太过粗鲁,而且可能带来许多意想不到的问题。

既然我们能想到问题,框架的制定者也会想到,那么他们有没有为我们准备好解决方案呢?答案是有的,下面我介绍下我了解到的几种方案。

1. 使用 Endpoints

在 SpringBoot 官方文档的第4部分中介绍了为应用发布生产准备的各种特性,其中,通过 Actuator 的 HTTP Endpoint,开发人员可以方便地对应用的监控与管理。

引入指定的 starter 包:

"org.springframework.boot:spring-boot-starter-actuator:${springbootVersion}"
  • 1

在 application.yml 中打开如下两个配置,即可实现通过 Http 请求停止应用

management:
  security:
    enabled: false
endpoints:
  shutdown:
    enabled: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

操作命令如下:

curl -X POST http://host:port/shutdown
  • 1

但这种方式有一个非常严重的问题,那就是任意人都可以控制应用的停止,这对于一个生产应用无疑是不可接受的。有些人可能会想,现在的链接地址太简单了,非维护人员也可以轻易地猜出来,如果使用一个非常复杂的地址是否可以避免这个问题。很好,这个提议不错,那我们再看看 SpringBoot 为我们提供的相关配置。

endpoints:
  shutdown:
    enabled: true
    path: /xxx
  • 1
  • 2
  • 3
  • 4

配置完成后,上面的命令就不可用了,需更新命令为:

curl -X POST http://host:port/xxx
  • 1

其中的/xxx当然只是我随手设置的一个,你可以设置任意的地址。虽然安全性高了那么一点,但这样的安全级别仍然是无法应用到生产环境的。那是否还有其它的防护手段呢?有,除了修改shutdown的路径外,我们还可以给所有的管理操作加上一个统一的上下文,配置独立的端口,并限制指定IP访问(一般限定为本机),配置如下:

management:
  security:
    enabled: false
  port: 9001
  address: 127.0.0.1
  context-path: /admin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

变更后的停服命令为:

curl -X POST http://127.0.0.1:9001/admin/xxx
  • 1

这样其实已经足够安全了,为了进一步的保证系统的安全,再给其加上一层 HTTP Basic Auth。

增加 Security 依赖:

"org.springframework.boot:spring-boot-starter-security:${springbootVersion}"
  • 1

修改配置文件如下:

endpoints:
  shutdown:
    enabled: true
    path: /xxx
management:
  security:
    enabled: true
  port: 9001
  address: 127.0.0.1
  context-path: /admin
security:
  basic:
    enabled: true
    path: /admin
  user:
    name: root
    password: 123456
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

配置完成后,最终的停服命令为:

curl -X POST -u root:123456 http://127.0.0.1:9001/admin/xxx
  • 1

2. 注册为系统服务

除了使用 java -jar 运行 SpringBoot 应用程序外,还可以轻松地用 init.d 或 systemd 注册成 Linux/Unix 系统服务,这使得在生产环境中,安装和管理 SpringBoot 应用程序变得非常简单。

在Maven工程里面,为了创建一个“完全可执行”的 jar,需要引入如下插件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.2.RELEASE</version>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在 Gradle 工程里面,等效配置如下:

plugins {
    id 'org.springframework.boot' version '1.5.2.RELEASE'
}

springBoot {
    executable = true
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置完成后,即可以通过 ./application-name.jar 运行构建好的应用程序。

最后,我们需要将打包好的应用程序安装成一个init.d 服务,这样就可以很方便地使用 Unix/Linux 进行管理了。操作方式很简单,只需要将应用程序简单的链接到 init.d 即可(其中funda为我自己的应用名,自己实验时需要视情况替换)。

ln -s /app/funda/funda.jar /etc/init.d/funda
  • 1

检查链接是否建立成功

ls -l /etc/init.d/funda
  • 1

启动服务,应用日志可查看文件 /var/log/funda.log

service funda start
  • 1

其它常用命令

# 查看应用运行状态
service funda status
# 停止应用
service funda stop
  • 1
  • 2
  • 3
  • 4

问题汇总:

  1. 在链接成功后,应用启动时,无法成功启动,提示Unable to find Java,使用如下命令将Jdk的java命令链接到/sbin/java即可。
ln -s /usr/local/jdk1.8.0_131/bin/java /sbin/java

 

分享到:
评论

相关推荐

    SpringBoot 实战 之 优雅终止服务的方法

    SpringBoot 实战 之 优雅终止服务的方法 在 SpringBoot 中,优雅终止服务是一种非常重要的技术,尤其是在生产环境中。由于 SpringBoot 是一个微服务框架,它的生产部署方式需要尽可能简单,与常规的 Web 应用有着一...

    SpringBoot实战_springboot实战_

    11. **微服务实战**:如果标签"springboot实战"指的是微服务实战,那么这部分可能涉及如何使用SpringBoot构建微服务架构,包括服务发现(Eureka或Consul)、服务间通信(Ribbon或Feign)、熔断器(Hystrix)和配置...

    SpringBoot实战

    《SpringBoot实战》一书是Java开发者深入了解和掌握Spring Boot技术的重要参考资料。Spring Boot是由Pivotal团队开发的,旨在简化Spring应用的初始搭建以及开发过程。它通过提供默认配置来减少Spring应用的启动时间...

    开发的颠覆者springboot实战

    开发的颠覆者springboot实战,没有缺失,eclipse、idea的教程都有

    SpringBoot实战.pdf

    SpringBoot实战.pdf 225MB大小,高清,足够学习。SpringBoot在当前技术势头很猛,作为一个Java程序员,应当牢牢紧跟潮流,连多年未更的dubbo都已经支持SpringBoot了,你还在等什么?

    《SpringBoot实战(第4版)》PDF

    《SpringBoot实战(第4版)》是一本深入讲解Spring Boot技术的实战指南,适合对Java开发有一定基础的读者,尤其是那些希望快速掌握Spring Boot并应用于实际项目中的开发者。本书全面覆盖了Spring Boot的核心概念、关键...

    SpringBoot实战(自带目录)第四版PDF下载

    《SpringBoot实战(自带目录)第四版》是针对Java开发者的一本深度技术指南,主要聚焦于Spring Boot框架的使用和实践。Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它...

    《SpringBoot实战》PDF

    《SpringBoot实战》PDF这本书是Java开发者的一本实用指南,主要涵盖了Spring Boot的核心功能和特性,旨在帮助读者高效地进行Java开发,快速构建微服务架构。Spring Boot是Spring框架的一个重要扩展,它简化了初始化...

    完整实用的springboot实战教程

    完整实用的springboot实战教程,从基础配置到实战应用

    springboot实战 PDF.zip

    《SpringBoot实战》这本书是为Java开发者提供的一份详尽且实用的SpringBoot技术指南。SpringBoot是由Pivotal团队开发的一个框架,旨在简化Spring应用的初始搭建以及开发过程,它集成了大量的常用第三方库配置,如...

    JavaEE开发的颠覆者SpringBoot实战

    《JavaEE开发的颠覆者SpringBoot实战》这本书深入探讨了Spring Boot这一革命性的Java开发框架,它是JavaEE开发模式的重要革新。Spring Boot以其简洁、快速和开箱即用的特性,极大地简化了Java应用程序的搭建和配置...

    JavaEE开发的颠覆者SpringBoot实战完整版pdf和源码第五部分(5-5)

    JavaEE开发的颠覆者SpringBoot实战完整版pdf和源码第五部分

    SpringBoot实战,丁雪丰 译

    《SpringBoot实战》是由丁雪丰翻译的一本深入浅出的SpringBoot技术指南。SpringBoot是Java领域中广泛使用的框架,它简化了Spring应用程序的创建和管理,使得开发者能够更快速地开发出高质量的Web应用。这本书详细...

    springboot实战,javaee巅覆者

    《SpringBoot实战:JavaEE颠覆者》是一本深入探讨SpringBoot技术的书籍,它揭示了如何利用SpringBoot简化Java企业级应用的开发流程,从而颠覆传统的JavaEE开发模式。本书的前三章源码提供了基础而关键的学习材料,...

    SpringBoot实战(第4版)清晰版

    第 1 章入门 l 1 . 1 SPring 风云再起 l 1 . 1 . 1 重新认识 SPring 2 1 . 1 . 2 SPring Boot 精要 3 1 . 1 . 3 SPring Boot 不是什么 6 1 . 2 SpringB0ot 人门 6 1 . 2 ....安装 SPring BootCU 7 1 ....

    SpringBoot实战第四版.pdf

    书中探讨了SpringBoot在部署、监控、度量等方面的功能,以及如何利用SpringBoot与SpringCloud结合实现服务发现和服务降级等微服务架构下的高级特性。 书中还特别强调了SpringBoot对于Java开发人员的重要性,无论是...

    SpringBoot实战(第4版 高清带书签)

    《SpringBoot实战》是学习和应用SpringBoot的书籍,建议学习使用。

    SpringBoot实战-汪云飞教程源码

    SpringBoot实战-汪云飞教程源码,初学springboot可以参照源码学习

    springboot实战

    《SpringBoot实战》第四版是一本深度探讨SpringBoot框架的实战型书籍,旨在帮助开发者高效地利用SpringBoot进行开发。SpringBoot是Spring框架的一个模块,它简化了Java应用的初始搭建以及开发过程,通过“约定优于...

Global site tag (gtag.js) - Google Analytics