• Spirng boot 启动的时候进行监控检查不通过停止服务与自定义健康监控节点


    基于 spring-boot-starter-actuator health节点检查

     

    • 前提条件:

     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>

    • 健康节点http请求地址:

    • 健康状态响应数据:

    {
         "description": "Composite Discovery Client",
         "status": "UP",
         "discoveryComposite": {
             "description": "Composite Discovery Client",
             "status": "UP",
             "discoveryClient": {
                 "description": "Composite Discovery Client",
                 "status": "UP",
                 "services": [
                     "fileservice",
                     "dj-atliwen-edi-mqconsumption"
                 ]
             },
             "eureka": {
                 "description": "Eureka discovery client has not yet successfully connected to a Eureka server",
                 "status": "UP",
                 "applications": {
                     "SPRING-CLOUD-ZIPKIN": 1,
                     "DJ-WANGRUI-EDI-GLOBAL": 1
                 }
             }
         },
         "diskSpace": {
             "status": "UP",
             "total": 285775753216,
             "free": 173917204480,
             "threshold": 10485760
         },
         "rabbit": {
             "status": "UP",
             "version": "3.7.7"
         },
         "db": {
             "status": "UP",
             "database": "MySQL",
             "hello": 1
         },
         "binders": {
             "status": "UP",
             "rabbit": {
                 "status": "UP",
                 "binderHealthIndicator": {
                     "status": "UP",
                     "version": "3.7.7"
                 }
             }
         },
         "configServer": {
             "status": "UP",
             "propertySources": [
                 "configClient",
                 "http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
             ]
         },
         "hystrix": {
             "status": "UP"
         }
     }

     • 异常状态响应数据:

     {
         "status": "DOWN",
         "discoveryComposite": {
             "description": "Composite Discovery Client",
             "status": "UP",
             "discoveryClient": {
                 "description": "Composite Discovery Client",
                 "status": "UP",
                 "services": [
                     "fileservice",
                     "security-wo-remote"
                 ]
             },
             "eureka": {
                 "description": "Eureka discovery client has not yet successfully connected to a Eureka server",
                 "status": "UP",
                 "applications": {
                     "SPRING-CLOUD-ZIPKIN": 1,
                     "DJ-WANGRUI-EDI-GLOBAL": 1
                 }
             }
         },
         "diskSpace": {
             "status": "UP",
             "total": 285775753216,
             "free": 173917204480,
             "threshold": 10485760
         },
         "rabbit": {
             "status": "UP",
             "version": "3.7.7"
         },
         "db": {
             "status": "DOWN",
             "error": "org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up."
         },
         "binders": {
             "status": "UP",
             "rabbit": {
                 "status": "UP",
                 "binderHealthIndicator": {
                     "status": "UP",
                     "version": "3.7.7"
                 }
             }
         },
         "configServer": {
             "status": "UP",
             "propertySources": [
                 "configClient",
                 "http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
             ]
         },
         "hystrix": {
             "status": "UP"
         }
     }

     • 异常恢复之后响应数据:

     {
         "description": "Composite Discovery Client",
         "status": "UP",
         "discoveryComposite": {
             "description": "Composite Discovery Client",
             "status": "UP",
             "discoveryClient": {
                 "description": "Composite Discovery Client",
                 "status": "UP",
                 "services": [
                     "fileservice",
                     "security-wo-remote"
                 ]
             },
             "eureka": {
                 "description": "Eureka discovery client has not yet successfully connected to a Eureka server",
                 "status": "UP",
                 "applications": {
                     "SPRING-CLOUD-ZIPKIN": 1,
                     "DJ-WANGRUI-EDI-GLOBAL": 1
                 }
             }
         },
         "diskSpace": {
             "status": "UP",
             "total": 285775753216,
             "free": 173917155328,
             "threshold": 10485760
         },
         "rabbit": {
             "status": "UP",
             "version": "3.7.7"
         },
         "db": {
             "status": "UP",
             "database": "MySQL",
             "hello": 1
         },
         "binders": {
             "status": "UP",
             "rabbit": {
                 "status": "UP",
                 "binderHealthIndicator": {
                     "status": "UP",
                     "version": "3.7.7"
                 }
             }
         },
         "configServer": {
             "status": "UP",
             "propertySources": [
                 "configClient",
                 "http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
             ]
         },
         "hystrix": {
             "status": "UP"
         }
     }

     • 自定义健康节点:异常状态

     {
         "status": "DOWN",
         "test": {
             "status": "DOWN",
             "Error Code": 1
         },
         "discoveryComposite": {
             "description": "Composite Discovery Client",
             "status": "UP",
             "discoveryClient": {
                 "description": "Composite Discovery Client",
                 "status": "UP",
                 "services": [
                     "fileservice",
                     "dj-atliwen-edi-mqconsumption"
                 ]
             },
             "eureka": {
                 "description": "Eureka discovery client has not yet successfully connected to a Eureka server",
                 "status": "UP",
                 "applications": {
                     "SPRING-CLOUD-ZIPKIN": 1,
                     "SPRING-CLOUD-DASHBOARD": 1
                 }
             }
         },
         "diskSpace": {
             "status": "UP",
             "total": 285775753216,
             "free": 173916606464,
             "threshold": 10485760
         },
         "rabbit": {
             "status": "UP",
             "version": "3.7.7"
         },
         "db": {
             "status": "UP",
             "database": "MySQL",
             "hello": 1
         },
         "binders": {
             "status": "UP",
             "rabbit": {
                 "status": "UP",
                 "binderHealthIndicator": {
                     "status": "UP",
                     "version": "3.7.7"
                 }
             }
         },
         "configServer": {
             "status": "UP",
             "propertySources": [
                 "configClient",
                 "http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
             ]
         },
         "hystrix": {
             "status": "UP"
         }
     }

     • 自定义健康监控节点  :正常状态

     {
         "status": "UP",
         "test": {
             "status": "UP"
         },
         "discoveryComposite": {
             "description": "Composite Discovery Client",
             "status": "UP",
             "discoveryClient": {
                 "description": "Composite Discovery Client",
                 "status": "UP",
                 "services": [
                     "fileservice",
                     "dj-atliwen-edi-mqconsumption"
                 ]
             },
             "eureka": {
                 "description": "Eureka discovery client has not yet successfully connected to a Eureka server",
                 "status": "UP",
                 "applications": {
                     "SPRING-CLOUD-ZIPKIN": 1,
                     "DJ-WANGRUI-EDI-GLOBAL": 1
                 }
             }
         },
         "diskSpace": {
             "status": "UP",
             "total": 285775753216,
             "free": 173916557312,
             "threshold": 10485760
         },
         "rabbit": {
             "status": "UP",
             "version": "3.7.7"
         },
         "db": {
             "status": "UP",
             "database": "MySQL",
             "hello": 1
         },
         "binders": {
             "status": "UP",
             "rabbit": {
                 "status": "UP",
                 "binderHealthIndicator": {
                     "status": "UP",
                     "version": "3.7.7"
                 }
             }
         },
         "configServer": {
             "status": "UP",
             "propertySources": [
                 "configClient",
                 "http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
             ]
         },
         "hystrix": {
             "status": "UP"
         }
     }

     

    • Spring boot 启动后执行健康检查节点

     /**
      * @author 李文
      * @create 2019-03-14 16:22
      **/
     @Slf4j
     @Component
     public class HealthApplication implements ApplicationRunner
     {
         @Autowired
         ConfigurableApplicationContext applicationContext;
         @Override
         public void run(ApplicationArguments applicationArguments) {

             Map<String, HealthIndicator> handcars = applicationContext.getBeansOfType(HealthIndicator.class);
             boolean b = true;
             for (Map.Entry<String, HealthIndicator> entry : handcars.entrySet()) {
                 log.error("  entry.getValue()  " + entry.getValue().getClass());
                 Health health = entry.getValue().health();
                 if (!health.getStatus().equals(Status.UP)) {
                     log.error(" 启动健康检查异常 {} ", health.toString());
                     b = false;
                 }
             }
             if (!b) {
                 applicationContext.close();
             }
         }
     }

     • 自定义健康监控节点

     /**
      * 自定义健康监控节点
      *
      * @author 李文
      * @create 2019-03-14 14:14
      **/
     @Component
     public class TestHealthIndicator implements HealthIndicator
     {
         @Override
         public Health health() {

             int errorCode = check();
             if (errorCode != 0) {
                 return Health.down().withDetail("Error Code", errorCode).build();
             }
             return Health.up().build();
         }

         private int check() {
             return 0;
         }
     }

     补充信息:

    默认状态节点名称为类名称 如 TestHealthIndicator 为 test 节点

    非spring boot 项目也可以集成。

    HealthIndicator组件只带的检查项

    CassandraHealthIndicator   检查Cassandra数据库状况   (介于关系数据库和非关系数据库之间的开源产品,是最像关系数据库的NOSQL数据库)

     

    DiskSpaceHealthIndicator  低磁盘空间检查  (10 * 1024 * 1024  单位是bytes)

     

    DataSourceHealthIndicator 检查是否能从DataSource获取连接 (检查数据库情况 只支持spring-boot-data-jpa)

     

    关键代码:
            private JdbcTemplate jdbcTemplate;
            private static final String DEFAULT_QUERY = "SELECT 1";
            this.jdbcTemplate.query()
            builder.withDetail("hello", result);

    ElasticsearchHealthIndicator 检查Elasticsearch集群状况

     

    JmsHealthIndicator  检查JMS消息代理状况

     

    MailHealthIndicator 检查邮件服务器状况

     

    MongoHealthIndicator  检查Mongo数据库状况

     

    RabbitHealthIndicator  检查Rabbit服务器状况

     

    RedisHealthIndicator  检查Redis服务器状况

     

    SolrHealthIndicator   检查Solr服务器状况

     

    ConfigServerHealthIndicator  检查是否能够读取配置文件(在应用配置中心Maven 后才生效)

     关键日志信息:

     Registering application zjs-crypto with eureka with status UP
      //通知注册中心当前状态修改为UP
     Saw local status change event StatusChangeEvent [timestamp=1552551178514, current=UP, previous=STARTING]
     DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001: registering service…
     // 通知请求执行成功
     DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001 - registration status: 204

     //健康检查异常
     启动健康检查异常 UNKNOWN {error=no property sources located}

     Unregistering application zjs-crypto with eureka with status DOWN
     //通知注册中心修改当前状态为DOWN
     Saw local status change event StatusChangeEvent [timestamp=1552551180100, current=DOWN, previous=UP]

     DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001: registering service…
     // 通知请求执行成功
     DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001 - registration status: 204

     实际触发的验证类:

     自定义健康监控节点类
      com.zjs.password.healthIndicator.CustomHealthIndicator
      com.zjs.password.healthIndicator.TestHealthIndicator

     Spirng boot 相关包自带的健康监控节点类
      org.springframework.cloud.client.discovery.health.DiscoveryCompositeHealthIndicator
      org.springframework.boot.actuate.health.DiskSpaceHealthIndicator
      org.springframework.boot.actuate.health.RabbitHealthIndicator
      org.springframework.boot.actuate.health.DataSourceHealthIndicator
      org.springframework.boot.actuate.health.CompositeHealthIndicator
      org.springframework.cloud.config.client.ConfigServerHealthIndicator

    注意!
             请使用spring boot 支持的组件。尤其是数据库,只针对 spring-boot-data-jpa !! 如使用其他数据库 请自定义健康节点方法自行实现。 

     注意! 不读取配置文件已算是健康检查失败!

     PS : 根据引入的maven包不通,所以触发的健康验证类也不一样。可想而知,是不同的包自己实现自己的健康验证方法。

  • 相关阅读:
    js 获取图片url的Blob值并预览
    Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”
    iOS-原生纯代码约束总结(二)之 AutoLayout
    iOS-原生纯代码约束总结(一)之 AutoresizingMask
    iOS 动画学习之视图控制器转场动画
    ios开发之 NSObject详解
    mac终端下svn常用命令
    CALayer的子类之CAShapeLayer
    Runloop的再学习之浅析(一)
    Xcode 编辑器之Workspace,Project,Scheme,Target
  • 原文地址:https://www.cnblogs.com/atliwen/p/10550180.html
Copyright © 2020-2023  润新知