关于Spring Cloud健康检查的陷阱

SpringCloud健康检查的陷阱

健康检查

基于Spring Boot Actuator的健康检查是Spring Cloud微服务的必备组件,用来确保我们的服务是否可用。

引入 Spring Boot Actuator后,通过http://ip:port/health ,可以看到 HealthEndPoint 给我们提供默认的监控结果,包含磁盘检测和数据库检测。如下

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "total": 398458875904,
        "free": 315106918400,
        "threshold": 10485760
    },
    "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}

排除不必要的健康检查项

有一天调用方突然反馈调不通我们的服务。查看Eureka控制台,发现服务状态是UP。查看服务进程一切正常。束手无策之际,忽然想到会不会是健康检查在作怪,因为Eureka Client判断服务可用与否的依据就是健康检查。而Spring Boot Actuator所有的监控项中的任何一个健康状态是DOWN,那个整体应用的健康状态也是DOWN,这时候调用方就把服务当作不可用。

再次查看http://ip:port/health,果然发现有一项邮件健康检查挂了。

最近项目引入了spring-boot-starter-mail,实现发送邮件的功能。

邮箱服务器挂了,造成整个服务的监控检查状态是DOWN。

{
  "status": "DOWN",
  "mail": {
    "status": "DOWN",
    "location": "email-smtp.test.com:-1",
    "error": "javax.mail.AuthenticationFailedException: 535 Authentication Credentials Invalid\n"
  },
  "diskSpace": {
    "status": "UP",
    "total": 266299998208,
    "free": 146394308608,
    "threshold": 10485760
  },
  "hystrix": {
    "status": "UP"
  }
}

由于邮件发送不是核心功能,可以把非核心组件从健康检查中排除,避免造成整个服务不可用。

通过如下配置关闭邮箱健康检查。

management.health.mail.enabled=false

springcloud-health检查超时引发的大坑

0. 前提约定

service:只一个微服务

server:只提供一个微服务的app,一般一个service有多个server。

1. 问题介绍

线上springcloud遇到这样的问题:某些时候会移除某个service的所有server。

2. 原因分析

springcloud中默认使用springboot-actauctor的health-url作为健康检测,默认检查的超时时间为10s,如果生产环境遇到网络、db、redis慢或者挂了等问题,会导致health检查请求超时,springcloud注册中心会认为该server异常,从而将server状态变更为critial,服务调用方(feign)会将该异常server从负载中移除(HealthServiceServerListFilter)。

如果遇到某网段或更大规模的网络、db等问题,会导致某个service所有server都被注册中心移除,导致该service不可用。

但是实际上该server只是存在部分问题例如:仅仅是db或redis慢,不算不可用,但还是被注册中心强制摘除了。

3. 解决办法

3.1 通用解决办法

关闭health检查,永远返回up状态,只要程序正常启动就认为可以提供正常服务。

如下是项目模板输出默认的health检查结果:

{
 "description": "",
 "status": "UP",
 "diskSpace": {
  "description": "",
  "status": "UP",
  "total": 50715856896,
  "free": 7065239552,
  "threshold": 10485760
 },
 "solr": {
  "description": "",
  "status": "UP",
  "solrStatus": "OK"
 },
 "redis": {
  "description": "",
  "status": "UP",
  "version": "2.8.21"
 },
 "db": {
  "description": "",
  "status": "UP",
  "authDataSource": {
   "description": "",
   "status": "UP",
   "database": "MySQL",
   "hello": "x"
  },
  "autodealerDataSource": {
   "description": "",
   "status": "UP",
   "database": "Microsoft SQL Server",
   "hello": "x"
  }
 }
}

关闭health检查的方法:

# application*.yml中
management:
  health:
    defaults:
      enabled: false

关闭后health检查结果:

{
 "description": "",
 "status": "UP",
 "application": {
  "description": "",
  "status": "UP"
 }
}

4. 如果有特定health检查的需求

关闭health检查后,如果需要某类health检查需求,则需要单独配置,配置方法如下:

management:
  health:
    defaults:
      enabled: false
    # 如下配置则打开db-health检查
    db:
      enabled: true

health检查结果如下:

{
 "description": "",
 "status": "UP",
 "db": {
  "description": "",
  "status": "UP",
  "authDataSource": {
   "description": "",
   "status": "UP",
   "database": "MySQL",
   "hello": "x"
  },
  "autodealerDataSource": {
   "description": "",
   "status": "UP",
   "database": "Microsoft SQL Server",
   "hello": "x"
  }
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringBoot健康检查的实现原理

    SpringBoot自动装配的套路,直接看 spring.factories 文件,当我们使用的时候只需要引入如下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 然后在 org.springframework.boot.sprin

  • Spring Boot Actuator自定义健康检查教程

    健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态.本文在前文的基础上介绍如何自定义健康检查. 1. 概述 本节我们简单说明下依赖及启用配置,展示缺省健康信息.首先需要引入依赖: compile("org.springframework.boot:spring-boot-starter-actuator") 现在通过http://localhost:8080/actuator/health端点进行验证: {"status"

  • SpringBoot实现项目健康检查与监控

    Spring Boot 最主要的特性就是AutoConfig(自动配置),而对于我们这些使用者来说也就是各种starter, Spring Boot-Actuator 也提供了starter,为我们自动配置,在使用上我们只需要添加starter到我们的依赖中,然后启动项目即可. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ac

  • SpringBoot Admin健康检查功能的实现

    目录 admin 实现admin功能 创建客户端 主动上报的服务端 实现效果 异常通知 邮件通知 其他通知 代码地址 admin 监控检查,检查的是什么了.检查的是应用实例状态,说白了就是被查服务提供信息给检查服务端.在spring cloud 中可以有两种方式进行健康检查,一种是应用主动上报到admin服务端,第二种就是的admin项目eureka服务端拉取信息. admin主要就是告诉运维人员,服务出现异常,然后进行通知(微信.邮件.短信.钉钉等)可以非常快速通知到运维人员,相当报警功能.应

  • springboot 如何禁用某项健康检查

    springboot 禁用某项健康检查 management.health.mail.enabled management.health.mongo.enabled management.health.redis.enabled management.health.solr.enabled management.health.elasticsearch.enabled http://docs.spring.io/spring-boot/docs/current/reference/htmlsin

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

    本文主要介绍了Spring Cloud Admin的使用,分享给大家,具体如下: 源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin Admin 简介 官方文档:What is Spring Boot Admin? SpringBootAdmin是一个用于管理和监控SpringBoot微服务的社区项目,可以使用客户端注册或者Eureka服务发现向服务端提供监控信息. 注意,服务端相当于提供UI界面,实际的监

  • 关于Spring Cloud健康检查的陷阱

    SpringCloud健康检查的陷阱 健康检查 基于Spring Boot Actuator的健康检查是Spring Cloud微服务的必备组件,用来确保我们的服务是否可用. 引入 Spring Boot Actuator后,通过http://ip:port/health ,可以看到 HealthEndPoint 给我们提供默认的监控结果,包含磁盘检测和数据库检测.如下 { "status": "UP", "diskSpace": { "

  • SpringBoot actuator 健康检查不通过的解决方案

    SpringBoot actuator 健康检查不通过 今天遇到有个服务能够注册成功,但是健康检查不通过,通过浏览器访问健康检查的url,chrome的network一直显示pending,说明这个请求提交了,但是得不到返回,卡住了. 原来以为健康检查就是检查服务端口下的/health这个请求本身是否能正常返回,其实不是. 所谓健康检查是有很多检查项的,springboot中继承AbstractHealthIndicator的类,比如DataSourceHealthIndicator Redis

  • spring boot的健康检查HealthIndicators实战

    目录 springboot 健康检查HealthIndicators springboot health indicator原理及其使用 作用 自动配置的Health Indicator 分组 如何管理Health Indicator RedisHealthIndicator源码解析 自定义Indicator springboot 健康检查HealthIndicators 想提供自定义健康信息,你可以注册实现了HealthIndicator接口的Spring beans. 你需要提供一个heal

  • Spring Cloud Alibaba Nacos两种检查机制

    目录 两种健康检查机制 如何设置健康检查机制? 客户端主动上报机制 服务端反向探测机制 TCP 探测 HTTP 探测 集群下的健康检查机制 总结 前言: Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制.有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行. 两种健康检查机制 Nacos 中提供了两种健康检查机制: 客户端主动上报机制. 服务器端反

  • Spring Cloud Ribbon实现客户端负载均衡的方法

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负担.客户端负载均衡是运行在客户端程序中的,如我们的web项目,然后通过获取集群的IP地址列表,随机选择一个server发送请求.相对于服务端负载均衡来说,它不需要消耗服务器的资源. 基础环境 JDK 1.8 Maven 3.3.9 IntelliJ 2018.1 Git:项目源码 更新配置 我们这次

  • spring cloud consul注册的服务报错critical的解决

    测试spring cloud 使用consul注册服务的时候,出现critical,如下: 怎么解决这个问题,现在只能看到health check检查失败了. 受限调用这个请求Get http://consulIp:8500/v1/agent/checks,调完请求,就会拿到返回数据: { ...... "service:test-service-xx-xx-xx-xx": { "Node": "zookeeper-server1", "

  • idea快速搭建spring cloud注册中心与注册的方法

    spring cloud快速搭建 Spring Cloud是一个微服务框架,它基于spring boot, Spring Cloud提供的全套的分布式系统解决方案 . 首先我们使用gradle来创建: 选择JDK以及勾选Java,然后下一步 起包名已经项目名,下一步: 选择我们本地的gradle包,一直下一步,点击build.gradle并添加我们的依赖: group 'com.gaofei' version '1.0-SNAPSHOT' //gradle使用的插件 apply plugin:

  • Spring Cloud Hystrix入门和Hystrix命令原理分析

    断路由器模式 在分布式架构中,当某个服务单元发生故障之后,通过断路由器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延. Spring Cloud Hystrix针对上述问题实现了断路由器.线程隔离等一系列服务保护功能.它是基于Netflix Hystrix实现,该框架的目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力. Hystrix具备服务

随机推荐