国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - spring boot的健康檢查HealthIndicators實戰

spring boot的健康檢查HealthIndicators實戰

2022-02-23 00:37南北雪樹 Java教程

這篇文章主要介紹了spring boot的健康檢查HealthIndicators實戰,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot 健康檢查HealthIndicators

想提供自定義健康信息,你可以注冊實現了HealthIndicator接口的Spring beans。

你需要提供一個health()方法的實現,并返回一個Health響應。

Health響應需要包含一個status和可選的用于展示的詳情。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealth implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
} r
eturn Health.up().build();
}
}

除了Spring Boot預定義的Status類型,Health也可以返回一個代表新的系統狀態的自定義Status。

在這種情況下,需要提供一個HealthAggregator接口的自定義實現,或使用management.health.status.order屬性配置默認的實現。

例如,假設一個新的,代碼為FATAL的Status被用于你的一個HealthIndicator實現中。 為了配置嚴重程度, 你需要將下面的配

置添加到application屬性文件中:

?
1
management.health.status.order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP

如果使用HTTP訪問health端點, 你可能想要注冊自定義的status, 并使用HealthMvcEndpoint進行映射。 例如, 你可以將

FATAL映射為HttpStatus.SERVICE_UNAVAILABLE。

springboot health indicator原理及其使用

作用

sping boot health 可以通過暴露的接口來提供系統及其系統組件是否可用。默認通過/health來訪問。返回結果如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "status": "UP",
  "discoveryComposite": {
    "description": "Spring Cloud Eureka Discovery Client",
    "status": "UP",
    "discoveryClient": {
      "description": "Spring Cloud Eureka Discovery Client",
      "status": "UP",
      "services": [
        "..."
      ]
    },
    "eureka": {
      "description": "Remote status from Eureka server",
      "status": "UP",
      "applications": {
        "AOMS-MOBILE": 1,
        "DATA-EXCHANGE": 1,
        "CLOUD-GATEWAY": 2,
        "AOMS": 1,
        "AOMS-AIIS": 0,
        "AOMS-EUREKA": 2
      }
    }
  },
  "diskSpace": {
    "status": "UP",
    "total": 313759301632,
    "free": 291947081728,
    "threshold": 10485760
  },
  "refreshScope": {
    "status": "UP"
  },
  "hystrix": {
    "status": "UP"
  }
}

狀態說明:

  • UNKNOWN:未知狀態,映射HTTP狀態碼為503
  • UP:正常,映射HTTP狀態碼為200
  • DOWN:失敗,映射HTTP狀態碼為503
  • OUT_OF_SERVICE:不能對外提供服務,但是服務正常。映射HTTP狀態碼為200

注意:UNKNOWN,DOWN,OUT_OF_SERVICE在為微服務環境下會導致注冊中心中的實例也為down狀態,請根據具體的業務來正確使用狀態值。

自動配置的Health Indicator

自動配置的HealthIndicator主要有以下內容:

Key Name Description
cassandra CassandraDriverHealthIndicator Checks that a Cassandra database is up.
couchbase CouchbaseHealthIndicator Checks that a Couchbase cluster is up.
datasource DataSourceHealthIndicator Checks that a connection to DataSource can be obtained.
diskspace DiskSpaceHealthIndicator Checks for low disk space.
elasticsearch ElasticsearchRestHealthIndicator Checks that an Elasticsearch cluster is up.
hazelcast HazelcastHealthIndicator Checks that a Hazelcast server is up.
influxdb InfluxDbHealthIndicator Checks that an InfluxDB server is up.
jms JmsHealthIndicator Checks that a JMS broker is up.
ldap LdapHealthIndicator Checks that an LDAP server is up.
mail MailHealthIndicator Checks that a mail server is up.
mongo MongoHealthIndicator Checks that a Mongo database is up.
neo4j Neo4jHealthIndicator Checks that a Neo4j database is up.
ping PingHealthIndicator Always responds with UP.
rabbit RabbitHealthIndicator Checks that a Rabbit server is up.
redis RedisHealthIndicator Checks that a Redis server is up.
solr SolrHealthIndicator Checks that a Solr server is up.

分組

可以通過一個別名來啟用一組指標的訪問。配置的格式如下:

?
1
2
3
4
management.endpoint.health.group.<name>
//demo:
management.endpoint.health.group.mysys.include=db,redis,mail
management.endpoint.health.group.custom.exclude=rabbit

如何管理Health Indicator

開啟

可以通過management.health.key.enabled來啟用key對應的indicator。例如:

?
1
management.health.db.enabled=true

關閉

?
1
management.health.db.enabled=false

RedisHealthIndicator源碼解析

下面,通過RedisHealthIndicator源碼來為什么可以這么寫。

代碼結構

自動配置的health indicator有HealthIndicator和HealthIndicatorAutoConfiguration兩部分組成。

HealthIndicator所在包在org.springframework.boot.actuate,

HealthIndicatorAutoConfiguration所在包在org.springframework.boot.actuate.autoconfigure下

spring boot的健康檢查HealthIndicators實戰

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//RedisHealthIndicator.java
public class RedisHealthIndicator extends AbstractHealthIndicator {
    static final String VERSION = "version";
    static final String REDIS_VERSION = "redis_version";
    private final RedisConnectionFactory redisConnectionFactory;
    public RedisHealthIndicator(RedisConnectionFactory connectionFactory) {
        super("Redis health check failed");
        Assert.notNull(connectionFactory, "ConnectionFactory must not be null");
        this.redisConnectionFactory = connectionFactory;
    }
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        RedisConnection connection = RedisConnectionUtils
                .getConnection(this.redisConnectionFactory);
        try {
            if (connection instanceof RedisClusterConnection) {
                ClusterInfo clusterInfo = ((RedisClusterConnection) connection)
                        .clusterGetClusterInfo();
                builder.up().withDetail("cluster_size", clusterInfo.getClusterSize())
                        .withDetail("slots_up", clusterInfo.getSlotsOk())
                        .withDetail("slots_fail", clusterInfo.getSlotsFail());
            }
            else {
                Properties info = connection.info();
                builder.up().withDetail(VERSION, info.getProperty(REDIS_VERSION));
            }
        }
        finally {
            RedisConnectionUtils.releaseConnection(connection,
                    this.redisConnectionFactory);
        }
    }
}

主要實現doHealthCheck方法來實現具體的判斷邏輯。注意,操作完成后在finally中釋放資源。

在父類AbstractHealthIndicator中,對doHealthCheck進行了try catch,如果出現異常,則返回Down狀態。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//AbstractHealthIndicator.java
@Override
public final Health health() {
 Health.Builder builder = new Health.Builder();
 try {
  doHealthCheck(builder);
 }
 catch (Exception ex) {
  if (this.logger.isWarnEnabled()) {
   String message = this.healthCheckFailedMessage.apply(ex);
   this.logger.warn(StringUtils.hasText(message) ? message : DEFAULT_MESSAGE,
     ex);
  }
  builder.down(ex);
 }
 return builder.build();
}

RedisHealthIndicatorAutoConfiguration完成RedisHealthIndicator的自動配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
@ConditionalOnClass(RedisConnectionFactory.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnEnabledHealthIndicator("redis")
@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)
@AutoConfigureAfter({ RedisAutoConfiguration.class,
  RedisReactiveHealthIndicatorAutoConfiguration.class })
public class RedisHealthIndicatorAutoConfiguration extends
  CompositeHealthIndicatorConfiguration<RedisHealthIndicator, RedisConnectionFactory> {
 private final Map<String, RedisConnectionFactory> redisConnectionFactories;
 public RedisHealthIndicatorAutoConfiguration(
   Map<String, RedisConnectionFactory> redisConnectionFactories) {
  this.redisConnectionFactories = redisConnectionFactories;
 }
 @Bean
 @ConditionalOnMissingBean(name = "redisHealthIndicator")
 public HealthIndicator redisHealthIndicator() {
  return createHealthIndicator(this.redisConnectionFactories);
 }
}

重點說明ConditionalOnEnabledHealthIndicator:如果management.health..enabled為true,則生效。

CompositeHealthIndicatorConfiguration 中會通過HealthIndicatorRegistry注冊創建的HealthIndicator

自定義Indicator

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
@ConditionalOnProperty(name="spring.dfs.http.send-url")
@Slf4j
public class DfsHealthIndicator implements HealthIndicator {
    @Value("${spring.dfs.http.send-url}")
    private String dsfSendUrl;
    @Override
    public Health health() {
        log.debug("正在檢查dfs配置項...");
        log.debug("dfs 請求地址:{}",dsfSendUrl);
        Health.Builder up = Health.up().withDetail("url", dsfSendUrl);
        try {
            HttpUtils.telnet(StringUtils.getIpFromUrl(dsfSendUrl),StringUtils.getPortFromUrl(dsfSendUrl));
            return up.build();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("DFS配置項錯誤或網絡超時");
            return up.withException(e).build();
        }
    }
}

返回值:

?
1
2
3
4
5
6
7
{
    "dfs": {
    "status": "UP",
    "url": "10.254.131.197:8088",
    "error": "java.net.ConnectException: Connection refused (Connection refused)"
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/u010963948/article/details/77573635

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩中文字幕在线 | 性做久久久 | 欧洲美女性开放视频 | 日韩午夜一级片 | 亚洲欧美国产另类 | 国产大片一区 | www久久久久 | 日韩和的一区二在线 | 国产在线精品视频 | 日韩精品一级毛片 | 亚洲免费观看视频 | 国产日产久久高清欧美一区 | 久久久精品一区二区 | 在线成人av| 国产精品69毛片高清亚洲 | 精品国产黄a∨片高清在线 黄色大片aaaa | 免费看国产片在线观看 | 夜夜av | 精品久久久久久久久久久久久久久久久久久 | 午夜黄色影院 | 午夜精品一区二区三区在线视频 | 亚洲精品一 | 亚洲美女网站 | 欧美电影一区 | 求av网址| 成人午夜精品一区二区三区 | 欧美一区二区三区的 | 九九只有精品 | 国产在线视频一区二区 | 狠狠操操| 一特黄a大片免费视频 视频 | 美女视频一区二区三区 | 日韩精品影院 | 精品国产一区二区三区性色av | 亚洲一区在线视频 | 一级片免费视频 | 久久精品成人一区二区三区蜜臀 | а天堂中文最新一区二区三区 | 亚洲经典一区 | 在线观看三区 | 国产欧美高清在线观看 |