系统健康检查利器-Spring Boot-Actuator

匿名 (未验证) 提交于 2019-12-03 00:34:01

前言

实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们当前无法为客户或子系统提供服务。

应用实例健康状况可以通过外部观察来确定。您可以通过重复调用GET /health端点或通过自我报告来实现。现在主流的服务发现解决方案,会持续从实例中收集健康信息,并配置负载均衡器,将流量仅路由到健康的组件上。

Spring Boot-Actuator 就是帮助我们监控我们的Spring Boot 项目的。

使用

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

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

常用Endpoint

Spring Boot-actuator,提供了许多有用的EndPoint,对Spring Boot应用提供各种监控,下面说一下我常用的EndPoint:

/health 应用的健康状态
/configprops 获取应用的配置信息,因为Spring Boot 可能发布时是单独的Jar包,配置文件可能包含其中, 当我们需要检查配置文件时可以使用 ConfigpropsEndPoint 进行查看一些配置是否正确。
/trace 最近几次的http请求信息

HealthEndPoint

http://localhost:8088/health

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

其实看 Spring Boot-actuator 源码,你会发现 HealthEndPoint 提供的信息不仅限于此,org.springframework.boot.actuate.health 包下 你会发现 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等
也就是 HealthEndPoint 也提供 ES, Redis 等组件的健康信息。

自定义Indicator 扩展 HealthEndPoint

看源码 其实 磁盘和数据库健康信息就是 DiskSpaceHealthIndicator、DataSourceHealthIndicator 来实现的,当我们对一些我们自定义的组件进行监控时, 我们也可以实现个Indicator :

@Component public class User implements HealthIndicator {     /**      * user监控 访问: http://localhost:8088/health      *      * @return 自定义Health监控      */     @Override     public Health health() {          return new Health.Builder().withDetail("usercount", 10) //自定义监控内容                 .withDetail("userstatus", "up").up().build();     } }

http://localhost:8088/health

{     "status": "UP",     "user": {         "status": "UP",         "usercount": 10,         "userstatus": "up"     },     "diskSpace": {         "status": "UP",         "total": 398458875904,         "free": 315097989120,         "threshold": 10485760     },     "db": {         "status": "UP",         "database": "MySQL",         "hello": 1     } }

自定义EndPoint

其实除了扩展 HealthEndPoint 来添加一些健康检查, 我们也可以自定定义一些EndPoint 来提供程序运行时一些信息的展示:

@Configuration public class EndPointAutoConfig {     @Bean     public Endpoint<Map<String, Object>> customEndPoint() {         return new SystemEndPoint();     } }   @ConfigurationProperties(prefix="endpoints.customsystem") public class SystemEndPoint extends AbstractEndpoint<Map<String, Object>> {      public SystemEndPoint(){         super("customsystem");     }     @Override     public Map<String, Object> invoke() {         Map<String,Object> result= new HashMap<>();         Map<String, String> map = System.getenv();         result.put("username",map.get("USERNAME"));         result.put("computername",map.get("COMPUTERNAME"));         result.put("userdomain",map.get("USERDOMAIN"));         return result;     } }

http://localhost:8088/customsystem

 {     "username": "xxx",     "userdomain": "DESKTOP-6EAN1H4",     "computername": "DESKTOP-6EAN1H4" }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!