前文回顾
- 本文是《掌握SpringBoot-2.3的容器探针》系列的第二篇,前文《掌握SpringBoot-2.3的容器探针:基础篇》知道了kubernetes的存活和就绪探针,以及SpringBoot-2.3的actuator新增的两个endpoint,当我们把应用部署到kubernetes环境时,这些知识让我们能配置出官方推荐的探针方案,如下图:
- 尽管上述配置已经可以覆盖多数场景,依然有三个问题未解决:
- 首先,SpringBoot为kubernetes提供了两个actuator项,但是那些并未部署在kubernetes的SringBoot应用呢?用不上这两项也要对外暴露这两个服务地址吗?
- 其次,就绪探针什么时候开始返回200返回码的?应用启动阶段,业务服务可能需要一段时间才能正常工作,就绪探针要是提前返回了200,那k8s就认为容器可以正常工作了,这时候把外部请求调度过来是无法正常响应的,所以搞清楚就绪探针的状态变化逻辑很重要;
- 最后,也是最重要的一点:有的场景下,例如外部依赖服务异常、本地全局异常等情况下,业务不想对外提供服务,等到问题解决后业务又可以对外提供服务了,这就要求我们可以自己来控制就绪探针的返回码,而kubernetes可以根据这个返回码决定是否可以将外部请求调度到此容器上;
本文就是为了解决上述问题而作,这些问题解决后才能用好探针技术,让它在容器环境带来更大价值;
关键知识点
解决上述问题的关键集中在以下几个知识点:
- SpringBoot对容器环境的判断;
- SpringBoot对状态定义;
- 获取状态;
- 监听状态;
- 修改状态;
接下来挨个学习这些知识点;
SpringBoot对容器环境的判断
- 官方文档如下图所示,SpringBoot判断是否是kubernetes环境的逻辑很简单:是否有"*_SERVICE_HOST" 和"*_SERVICE_PORT"这两个环境变量: