说一说spring boot服务的健康检测

一、判断服务的健康状态

服务健康与否,对我们的重要性,主要是体现在应用部署与服务调用。具体可以是如下:

  • 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服务的健康检测_第1张图片

三、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、最终的正确写法是:

说一说spring boot服务的健康检测_第2张图片

四、总结

经过上文对程序的修正,重启后,consul和k8s对服务的健康检测均为OK
说一说spring boot服务的健康检测_第3张图片
点击进去,查看详情,可以看到其健康检测接口地址及检测结果。
说一说spring boot服务的健康检测_第4张图片
K8S容器里的只要也保持该健康检测地址即可,本文就不再赘述~

你可能感兴趣的:(spring,boot,后端,java)