K8S(Docker)如何优雅的关闭SpringBoot微服务

 更新时间:2025年01月26日 09:08:39   作者:Roc.Chang  
这篇文章主要介绍了K8S(Docker)如何优雅的关闭SpringBoot微服务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

K8S(Docker)优雅的关闭SpringBoot微服务

最近在折腾 K8S,当删掉一个 Pod 之后(一个 Pod 上部署了一个微服务实例),Eureka Server 竟然没有将该服务实例标记成 DOWN,正常来说,当一个 Eureka Client 关闭的时候会发送一个请求给 Eureka ServerEureka Server 会马上的将服务标记为 DOWN 状态,具体可以看本地开发日志。

o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
com.netflix.discovery.DiscoveryClient    : Shutting down DiscoveryClient ...
com.netflix.discovery.DiscoveryClient    : Unregistering ...
com.netflix.discovery.DiscoveryClient    : DiscoveryClient_ZUUL-SERVICE/192.168.8.14:zuul-service:5555 - deregister  status: 200
com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient

其实解决起来并没有很高大上,关键问题是就是 Docker 语法的区别,因为 Docker 容器在 stop 的时候,只有 pid 为 1 的进程才能接收到终止信号,而 DockerCMD 命令与 ENTRYPOINT 命令都有两种类型的执行方式:

  • 一种是 exec 也就是带中括号的
  • 另一种是 shell 方式,也就是不带中括号,在使用的过程中只要使用 exec 的就能保证 Java 命令是在 pid1 的进程上执行。

具体解决

  • CMD 方式:
CMD ["/bin/bash", "-c", "java -jar /webapp/zuul-admin.jar"]

# 如果需要添加参数,可以这样做
ENV COMMON="-Xms128m -Xmx128m"
CMD ["/bin/bash", "-c", "java $COMMOND -jar /webapp/zuul-admin.jar"]

# 反例,错误使用,如果是这样的的话,那么需要在 docker run 的时候通过 -e "COMMON=xxx" 进行传参
CMD ["/bin/bash", "-c", "java", "$COMMOND", "-jar /webapp/zuul-admin.jar"]

# shell 模式,这种模式启动的 pid 不为 1
CMD java -jar /webapp/zuul-admin.jar

# shell 模式带参数,这种模式启动的 pid 不为 1
ENV COMMON="-Xms128m -Xmx128m"
CMD java -jar $COMMON /webapp/zuul-admin.jar
  • 除了使用 CMD 命令外,还可以使用 ENTRYPOINT 命令,使用方法一样:
ENTRYPOINT ["/bin/bash", "-c", "java -jar /webapp/zuul-admin.jar"]

# 如果需要添加参数,可以这样做
ENV COMMON="-Xms128m -Xmx128m"
ENTRYPOINT ["/bin/bash", "-c", "java $COMMOND -jar /webapp/zuul-admin.jar"]

# 反例,错误使用,如果是这样的的话,那么需要在 docker run 的时候通过 -e "COMMON=xxx" 进行传参
ENTRYPOINT ["/bin/bash", "-c", "java", "$COMMOND", "-jar /webapp/zuul-admin.jar"]

# shell 模式,这种模式启动的 pid 不为 1
ENTRYPOINT java -jar /webapp/zuul-admin.jar

# shell 模式带参数,这种模式启动的 pid 不为 1
ENV COMMON="-Xms128m -Xmx128m"
ENTRYPOINT java -jar $COMMON /webapp/zuul-admin.jar

后续有问题,还是需要多看文档:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中如何判断JSONObject是否存在某个Key

    java中如何判断JSONObject是否存在某个Key

    这篇文章主要介绍了java中如何判断JSONObject是否存在某个Key,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 使用java实现LIS算法,出操队形的问题

    使用java实现LIS算法,出操队形的问题

    下面小编就为大家带来一篇使用java实现LIS算法,出操队形的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Spring-Web与Spring-WebFlux冲突问题解决

    Spring-Web与Spring-WebFlux冲突问题解决

    Spring WebFlux是一套全新的Reactive Web技术栈,实现完全非阻塞,支持Reactive Streams背压等特性,这篇文章主要给大家介绍了关于Spring-Web与Spring-WebFlux冲突问题解决的相关资料,需要的朋友可以参考下
    2024-04-04
  • Mybatis-Plus 自动填充失效问题解决

    Mybatis-Plus 自动填充失效问题解决

    在使用MyBatis-Plus时,自动填充功能可能会失效,这通常与版本和配置有关,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Java实现员工管理系统

    Java实现员工管理系统

    这篇文章主要为大家详细介绍了Java实现员工管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringBoot加密配置文件的SQL账号密码方式

    SpringBoot加密配置文件的SQL账号密码方式

    这篇文章主要介绍了SpringBoot加密配置文件的SQL账号密码方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBatch简单入门案例

    SpringBatch简单入门案例

    文章介绍了SpringBatch批处理框架的使用,包括其基本概念、优势、架构以及入门案例,通过简单的任务和数据库连接配置,展示了如何使用SpringBatch进行基本的批处理操作,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java实现Excel导出的全部流程(多Sheet、复杂格式)

    Java实现Excel导出的全部流程(多Sheet、复杂格式)

    这篇文章主要介绍了如何根据图片格式导出Excel文件,并根据项目号区分不同的sheet页,通过Maven依赖、实体类定义、导出工具和使用示例,详细描述了如何实现这一功能,包括Sheet分组逻辑、格式还原和动态数据处理,需要的朋友可以参考下
    2025-12-12
  • Spring Boot配置日志的实现步骤

    Spring Boot配置日志的实现步骤

    日志记录在软件开发中至关重要,能够帮助快速定位和解决问题,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 浅谈常用Java数据库连接池(小结)

    浅谈常用Java数据库连接池(小结)

    这篇文章主要介绍了浅谈常用Java数据库连接池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论