掌握SpringBoot-2.3的容器探针:基础篇

简介: SpringBoot-2.3.0.RELEASE发布了最新的容器探针技术,请随本文一起来了解一下吧

关于《SpringBoot-2.3容器化技术》系列

  • 《SpringBoot-2.3容器化技术》系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更加适应容器化环境,在云计算时代依旧紧跟主流,保持竞争力;
  • 全系列文章分为主题和辅助两部分,主题部分如下:
  1. 《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》
  2. 《详解SpringBoot(2.3)应用制作Docker镜像(官方方案)》
  3. 《掌握SpringBoot-2.3的容器探针:基础篇》
  4. 《掌握SpringBoot-2.3的容器探针:深入篇》
  5. 《掌握SpringBoot-2.3的容器探针:实战篇》
  • 辅助部分是一些参考资料和备忘总结,如下:
  1. 《SpringBoot-2.3镜像方案为什么要做多个layer》
  2. 《设置非root账号不用sudo直接执行docker命令》
  3. 《开发阶段,将SpringBoot应用快速部署到K8S》

    SpringBoot容器探针系列文章简介

    为了让应用更适应容器化环境,SpringBoot2.3版本推出了新的探针技术,《掌握SpringBoot-2.3的容器探针》系列旨在与您一起学习和实践这些新技术,分为三个阶段:
  4. 基础篇:即本文,对容器探针的相关知识点进行梳理和学习;
  5. 深入篇:继续深入学习探针相关的知识点;
  6. 实战篇:将springboot应用部署在kubernetes环境,并使用最新的探针技术;

    探针特性的官方信息

  • 如下图红框所示,2.3版本的容器探针特性早在预览版(v2.3.0.M4)就已经发布:
    在这里插入图片描述
  • 如今v2.3.0.RELEASE已发布,可以放心的学习和使用该特性了,首先把基础知识点列出来,确保准备工作OK;

    知识点整理

    下面是掌握探针技术所需的基础知识,也是本文的主要内容:
  1. kubernetes的存活探针livenessProbe
  2. kubernetes的就绪探针readinessProbe
  3. SpringBoot的actuator

接下来逐个学习,有了这些知识积累,我们才能更好的阅读官方资料,开发适合自己业务场景的探针;

kubernetes的存活探针livenessProbe

  1. kubernetes的探针涉及的内容是很多的,这里只提和SpringBoot相关的部分;
  2. kubelet 使用存活探针livenessProbe来知道什么时候要重启容器;
  3. 下图是kubernetes官网的存活探针示例,几个关键参数已经做了详细说明:
    在这里插入图片描述
  4. 可见如果我们的SpringBoot应用发布到kubernetes环境,只要应用还健康,livenessProbe对应的地址就要能响应200-400的返回码;

    kubernetes的就绪探针readinessProbe

  5. 有时候,应用程序会暂时性的不能提供通信服务。例如,应用程序在启动时可能需要加载很大的数据或配置文件,或是启动后要依赖等待外部服务。在这种情况下,既不想杀死应用程序,也不想给它发送请求。Kubernetes 提供了就绪探测器来发现并缓解这些情况。容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。
  6. 就绪探测器的配置和存活探测器的配置相似,唯一区别就是要使用 readinessProbe字段,而不是 livenessProbe 字段;
  7. 简单的说,就绪探针正常的容器,k8s就认为是可以对外提供服务的,相应的请求也会被调度到该容器上来;

    SpringBoot的actuator

  8. 简单来说,actuator是用来帮助用户监控和操作SprinBoot应用的,这些监控和操作都可以通过http请求实现,如下图,http://localhost:8080/actuator/health地址返回的是应用的健康状态:
    在这里插入图片描述
  9. 下面是常用的actuator地址,访问不同的地址可以得到不同的信息:
    在这里插入图片描述
  10. 在SpringBoot-2.3版本中,actuator新增了两个地址:/actuator/health/liveness/actuator/health/readiness,前者用作kubernetes的存活探针,后者用作kubernetes的就绪探针

    画外音:SpringBoot的探针技术就这点东西?

  11. 文章看到这里,您可能觉得索然无味:所谓的容器探针特性如此简单,新增两个actuator地址留给kubernetes的存活和就绪探针用,只要这两个地址响应正常,kubernetes就判定该容器正常;
  12. 大多数时候,上述结论并无不妥,SpringBoot官方给出的推荐配置如下图,我们只要照搬即可:
    在这里插入图片描述
  13. 冷静下来仔细思考,有三个问题似乎没有解决:
  • 首先,SpringBoot为kubernetes提供了两个actuator项,但是那些并未部署在kubernetes的SringBoot应用呢?用不上这两项也要对外暴露这两个服务地址吗?

  • 其次,就绪探针是什么时候开始返回200返回码的?应用启动阶段,业务服务可能需要一段时间才能正常工作,就绪探针要是提前返回了200,那k8s就认为容器可以正常工作了,这时候把外部请求调度过来是无法正常响应的,所以搞清楚就绪探针的状态变化逻辑很重要;

  • 最后,也是最重要的一点:有的场景下,例如外部依赖服务异常、本地全局异常等情况下,业务不想对外提供服务,等到问题解决后业务又可以对外提供服务了,如果此时我们能自己写代码控制就绪探针的返回码,那就做到了控制kubernetes是否将外部请求调度到此容器上,这可是个很实用的功能!

    还需要继续深入

    面对上述三个问题您是否会感慨:看似简单的容器探针技术,想要用好还需掌握更多知识,接下来的文章中咱们一起努力吧,从知识覆盖到实战操练,终究会掌握这门实用技术;

    欢迎访问我的GitHub

  • 地址:https://github.com/zq2599/blog_demos
  • 内容:原创文章分类汇总,及配套源码,涉及Java、Docker、K8S、DevOPS等

欢迎关注阿里云开发者社区:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
47 0
|
5月前
|
前端开发 Java 应用服务中间件
Spring Boot 2.x 嵌入式 Servlet 容器
Spring Boot使用内嵌Tomcat,默认端口8080,可通过`application.properties`配置端口、上下文路径等。配置方式有两种:1) 直接在配置文件中添加`server.port`和`server.servlet.context-path`;2) 创建`WebServerFactoryCustomizer` Bean来自定义配置,如设置端口`factory.setPort(8083)`,这种方式优先级更高。
|
5月前
|
Java Spring 容器
深入理解Spring Boot中的容器与依赖注入
深入理解Spring Boot中的容器与依赖注入
|
6月前
|
Java API Docker
使用Spring Boot和Docker进行容器化部署
使用Spring Boot和Docker进行容器化部署
|
6月前
|
Java 应用服务中间件 Maven
SpringBoot(六)之内嵌容器
需要用哪个容器,就把其他两个容器注释掉。(
55 0
|
6月前
|
Java 应用服务中间件 容器
手写SpringBoot(二)之动态切换Servlet容器
我们在切换serlvet容器的时候,会将SpringBoot默认的tomcat jar包给排除掉,换上我们需要的jar包,比如jetty。
51 0
|
6月前
|
Java Docker 容器
springboot项目容器化
springboot项目容器化
|
7月前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
479 0
|
7月前
|
Java Maven Docker
【SpringBoot系列】SpringBoot应用程序容器化及容器优化
【4月更文挑战第4天】SpringBoot应用程序容器化及容器大小优化
104 0