一、判断服务的健康状态
服务健康与否,对我们的重要性,主要是体现在应用部署与服务调用。具体可以是如下:
- consul/nacos 服务注册中心
- api网关
- docker/k8s 容器部署
- 发版结果
- 应用监控
服务注册中心要对外提供服务,仅限于健康的节点列表,而非所有的节点。
api网关,是一样的道理。
容器部署,比如k8s的pod,都是依据健康检测接口,判断是否Running。
二、k8s容器部署
因为我们配置了Pod的探针,由它来决定pod的状态机流转。
- http://localhost:9015/XHDataCenter/mgm/health 返回http status如果是2xx,则说明服务启动成功。否则deployment会每隔N秒再次启动pod,直至达到阈值限制。
readinessProbe:
failureThreshold: 3
httpGet:
path: /XHDataCenter/mgm/health
port: 9015
scheme: HTTP
initialDelaySeconds: 1
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
startupProbe:
failureThreshold: 22
httpGet:
path: /XHDataCenter/mgm/health
port: 9015
scheme: HTTP
initialDelaySeconds: 25
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
三、consul注册中心的服务健康
请先看我们遇到第一个问题,直接报错说404了。
但是,请留心它这里的健康检测接口地址是http://10.224.170.15:9015/XHDataCenter/mgm/health,这个地址是从哪里配置来的,很关键。
换句话说,java应用在注册到consul的时候,得告知你的服务健康地址是啥,并且把自身的健康检测endpoint暴露出去。
三、spring boot 程序
首先,我们程序期望的健康检测接口是http://localhost:9015/XHDataCenter/mgm/health。下面,我将把涉及到接口路径的几个地方罗列出来~
1、consul
本段配置,是告知consul, 我们的程序对外的健康检测接口是什么。 上文consul认为服务不健康的原因就是期望的地址在实际地址里不存在。
spring:
application:
name: data-center-service
cloud:
consul:
discovery:
enabled: true
prefer-ip-address: true
# consul 会依据请求该接口,判断服务是否健康
# 期望的接口地址是http://localhost:9015/XHDataCenter/mgm/health
health-check-path: /XHDataCenter/mgm/health
那么实际的健康检测地址是什么呢?
继续看下文。。。
2、全局的上下文路径:context-path
server:
port: 9015
servlet:
# 这行会要求访问该服务的路径都额外增加下面地址
# 期望的接口地址变成了:http://localhost:9015/XHDataCenter/${management.endpoints.web.base-path}/health
context-path: /XHDataCenter
management.endpoints.web.base-path 的默认路径是“actuator”,所以到目前为止,本服务的健康检测地址是http://localhost:9015/XHDataCenter/actuator/health,下文我们将会对其进行重写。
3、重写actuator的路径
- 错误的写法
management:
endpoints:
web:
# 结合上一步,此时服务的健康检测地址是http://localhost:9015/XHDataCenter/XHDataCenter/mgm/health
base-path: /XHDataCenter/mgm
exposure:
include: ["*"]
- 正确的写法(按我们最早约定的,健康检测地址是http://localhost:9015/XHDataCenter/mgm/health,所以base-path重写如下)
management:
endpoints:
web:
base-path: /mgm
exposure:
include: ["*"]
4、最终的正确写法是:
四、总结
经过上文对程序的修正,重启后,consul和k8s对服务的健康检测均为OK
点击进去,查看详情,可以看到其健康检测接口地址及检测结果。
K8S容器里的只要也保持该健康检测地址即可,本文就不再赘述~