热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

本篇文章主要介绍了SpringBoot实战之优雅终止服务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

由于 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}"

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

management:
 security:
  enabled: false
endpoints:
 shutdown:
  enabled: true

操作命令如下:

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

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

endpoints:
 shutdown:
  enabled: true
  path: /xxx

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

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

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

management:
 security:
  enabled: false
 port: 9001
 address: 127.0.0.1
 context-path: /admin

变更后的停服命令为:

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

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

增加 Security 依赖:

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

修改配置文件如下:

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

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

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

2. 注册为系统服务

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

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


  org.springframework.boot
  spring-boot-maven-plugin
  1.5.2.RELEASE
  
    true
  

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

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

springBoot {
  executable = true
}

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

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

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

检查链接是否建立成功

ls -l /etc/init.d/funda

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

service funda start

其它常用命令

# 查看应用运行状态
service funda status
# 停止应用
service funda stop

问题汇总:

在链接成功后,应用启动时,无法成功启动,提示Unable to find Java,使用如下命令将Jdk的java命令链接到/sbin/java即可。

ln -s /usr/local/jdk1.8.0_131/bin/java /sbin/java

参考链接:

Endpoints
Monitoring and management over HTTP
Unix/Linux services
Unable to find Java #5690

项目链接:

Github : https://github.com/qchery/funda

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 标题: ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
author-avatar
手机用户2502881927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有