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使用代码模拟高并发操作的示例

    Java使用代码模拟高并发操作的示例

    本篇文章主要介绍了Java使用代码模拟高并发操作的示例,Java通过代码模拟高并发可以以最快的方式发现我们系统中潜在的线程安全性问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 基于SpringBoot实现IP黑白名单的详细步骤

    基于SpringBoot实现IP黑白名单的详细步骤

    IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制,所以本文给大家介绍了基于SpringBoot实现IP黑白名单的详细步骤,需要的朋友可以参考下
    2024-01-01
  • Java多线程中线程池常见7个参数的详解以及执行流程

    Java多线程中线程池常见7个参数的详解以及执行流程

    本文主要介绍了Java多线程中线程池常见7个参数的详解以及执行流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • RestTemplate get请求携带headers自动拼接参数方式

    RestTemplate get请求携带headers自动拼接参数方式

    这篇文章主要介绍了RestTemplate get请求携带headers自动拼接参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 浅谈Java编程中的单例设计模式

    浅谈Java编程中的单例设计模式

    这篇文章主要介绍了Java编程中的单例设计模式,在许多语言的编程过程当中单例模式都被开发者们广泛采用,需要的朋友可以参考下
    2015-07-07
  • java 导入Excel思路及代码示例

    java 导入Excel思路及代码示例

    这篇文章主要介绍了java 导入Excel思路及代码示例,简要分析了设计思路,然后分享了实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • spring boot 使用 @Scheduled 注解和 TaskScheduler 接口实现定时任务

    spring boot 使用 @Scheduled 注解和 TaskScheduler 接口实现定时任务

    这篇文章主要介绍了spring boot 使用 @Scheduled 注解和 TaskScheduler 接口实现定时任务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Spring Cloud Admin健康检查 邮件、钉钉群通知的实现

    Spring Cloud Admin健康检查 邮件、钉钉群通知的实现

    这篇文章主要介绍了Spring Cloud Admin健康检查 邮件、钉钉群通知的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 关于JavaEE匿名内部类和Lambda表达式的注意事项

    关于JavaEE匿名内部类和Lambda表达式的注意事项

    这篇文章主要介绍了关于JavaEE匿名内部类和Lambda表达式的注意事项,匿名内部类顾名思义是没有修饰符甚至没有名称的内部类,使用匿名内部类需要注意哪些地方,我们一起来看看吧
    2023-03-03
  • 浅谈Strut2如何对请求参数的封装

    浅谈Strut2如何对请求参数的封装

    这篇文章主要介绍了浅谈Strut2如何对请求参数的封装,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论