【问题标题】:Spring Boot Actuator Health IndicatorSpring Boot 执行器健康指标
【发布时间】:2015-07-04 03:31:42
【问题描述】:

我们现在已经在几个项目中使用 Spring Boot,我们使用的是最新版本 1.2.3。我们正在合并执行器。到目前为止,一切都运行良好,除了我们发现 /health 指示器 [default] 显示服务已关闭。这不是真的。这些服务是用数据源实现的。它可能会调用其他 SOAP 或 Rest 服务。健康服务通过什么来衡量服务是否已关闭?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    DataSourceHealthIndicator 用于检查可用性。默认查询是SELECT 1,但也有一些特定于产品的查询。
    你可以写你自己的HealthIndicator。要么实现接口,要么扩展AbstractHealthIndicator
    要禁用默认的 db-health-check,请将此行放入您的应用程序属性 management.health.db.enabled=false。 希望有帮助

    【讨论】:

      【解决方案2】:

      正如#derFuerst 所说,DataSourceHealthIndicator 有默认查询来检查数据库是否启动。

      如果您想使用正确的供应商特定查询,您应该在配置类中编写自己的健康指标,例如 Oracle 数据源:

      @Autowired(required = false)
      private DataSource dataSource;
      
      @Bean
      @Primary
      public DataSourceHealthIndicator dataSourceHealthIndicator() {
          return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
      }
      

      【讨论】:

        【解决方案3】:

        以上评论帮助我开始了我的研究,但对我来说这还不够:

        @Bean
        @Primary
        public DataSourceHealthIndicator dataSourceHealthIndicator() {
            return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
        }
        

        这里是帮助我让它运行的配置:定义 HealthIndicator @Bean 如下所示并提供所需的查询:

        @Bean
        @Primary
        public HealthIndicator dbHealthIndicator() {
          return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUMMY");
        }
        

        如果没有提供查询,将使用 SELECT 1。正如#derFuerst所说,将使用,这是DataSourceHealthIndicator的默认实现:

        public DataSourceHealthIndicator(DataSource dataSource, String query) {
            super("DataSource health check failed");
            this.dataSource = dataSource;
            this.query = query;
            this.jdbcTemplate = dataSource != null ? new JdbcTemplate(dataSource) : null;
        }
        ...
        protected String getValidationQuery(String product) {
                String query = this.query;
                if (!StringUtils.hasText(query)) {
                    DatabaseDriver specific = DatabaseDriver.fromProductName(product);
                    query = specific.getValidationQuery();
                }
        
                if (!StringUtils.hasText(query)) {
                    query = "SELECT 1";
                }
        
                return query;
            }
        

        【讨论】:

          【解决方案4】:

          大家好,我是使用执行器进行健康检查的初学者。我使用了下面的解决方案,它奏效了,

          @Autowired(required = false)
          private DataSource dataSource;
          
          @Bean
          @Primary
          public DataSourceHealthIndicator dataSourceHealthIndicator() {
              return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
          }
          

          但是任何人都可以告诉我验证查询是如何工作的,即使没有名为 Dual 的表。同样根据我的理解,当我们请求“/actuator/health”时,会自动调用 HealthIndicator 的所有实现并执行健康检查方法。如果我错了,请纠正我

          【讨论】:

          • 您发布了一个新问题作为另一个问题的答案。为了帮助您解决问题,请打开一个新问题/问题(事先使用搜索功能查找类似问题)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-24
          • 1970-01-01
          • 2018-03-03
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          相关资源
          最近更新 更多