本文首发于我的网站:Spring Boot应用的健康监控html
在以前的系列文章中咱们学习了如何进行Spring Boot应用的功能开发,以及如何写单元测试、集成测试等,然而,在实际的软件开发中须要作的不只如此:还包括对应用程序的监控和管理。java
正如飞行员不喜欢盲目飞行,程序员也须要实时看到本身的应用目前的运行状况。若是给定一个具体的时间,咱们但愿知道此时CPU的利用率、内存的利用率、数据库链接是否正常以及在给定时间段内有多少客户请求等指标;不只如此,咱们但愿经过图表、控制面板来展现上述信息。最重要的是:老板和业务人员但愿看到的是图表,这些比较直观易懂。程序员
首先,这篇文章讲介绍如何定制本身的health indicator。web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
info.build.artifact=@project.artifactId@ info.build.name=@project.name@ info.build.description=@project.description@ info.build.version=@project.version@
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
而后在<plugins>节点里面增长对应的插件:面试
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <delimiters> <delimiter>@</delimiter> </delimiters> <useDefaultDelimiters>false</useDefaultDelimiters> </configuration> </plugin>
public class DbCountHealthIndicator implements HealthIndicator { private CrudRepository crudRepository; public DbCountHealthIndicator(CrudRepository crudRepository) { this.crudRepository = crudRepository; } @Override public Health health() { try { long count = crudRepository.count(); if (count >= 0) { return Health.up().withDetail("count", count).build(); } else { return Health.unknown().withDetail("count", count).build(); } } catch (Exception e) { return Health.down(e).build(); } } }
@Autowired private HealthAggregator healthAggregator; @Bean public HealthIndicator dbCountHealthIndicator(Collection<CrudRepository> repositories) { CompositeHealthIndicator compositeHealthIndicator = new CompositeHealthIndicator(healthAggregator); for (CrudRepository repository: repositories) { String name = DbCountRunner.getRepositoryName(repository.getClass()); compositeHealthIndicator.addHealthIndicator(name, new DbCountHealthIndicator(repository)); } return compositeHealthIndicator; }
Spring Boot Autuator这个库包括不少自动配置,对外开放了不少endpoints,经过这些endpoints能够访问应用的运行时状态:spring
上述各个endpoint是Spring Boot Actuator提供的接口和方法,接下来看看咱们本身定制的HealthIndicator,咱们只须要实现HealthIndicator接口,Spring Boot会收集该接口的实现,并加入到*/health*这个endpoint中。数据库
在咱们的例子中,咱们为每一个CrudRepository实例都建立了一个HealthIndicator实例,为此咱们建立了一个CompositeHealthIndicator实例,由这个实例管理全部的DbHealthIndicator实例。做为一个composite,它会提供一个内部的层次关系,从而能够返回JSON格式的数据。apache
代码中的HealthAggregator实例的做用是:它维护一个map,告诉CompositeHealthIndicator如何决定全部HealthIndicator表明的总体的状态。例如,除了一个repository返回DOWN其余的都返回UP,这时候这个composite indicator做为一个总体应该返回UP仍是DOWN,HealthAggregator实例的做用就在这里。后端
Spring Boot使用的默认的HealthAggregator实现是OrderedHealthAggregator,它的策略是手机全部的内部状态,而后选出在DOWN、OUT_OF_SERVICE、UP和UNKNOWN中间具备最低优先级的那个状态。这里使用策略设计模式,所以具体的状态断定策略能够改变和定制,例如咱们能够建立定制的HealthAggregator:设计模式
最后须要考虑下安全问题,经过这些endpoints暴露出不少应用的信息,固然,Spring Boot也提供了配置项,能够关闭指定的endpoint——在application.properties中配置*<name>.enable=false*;
还能够经过设置management.port=-1关闭endpoint的HTTP访问接口,或者是设置其余的端口,供内部的admin服务访问;除了控制端口,还能够设置仅仅让本地访问,只须要设置management.address=127.0.0.1;经过设置management.context-path=/admin,能够设置指定的根路径。综合下,通过上述设置,在本地访问http://127.0.0.1/admin/health来访问健康状态。
能够在防火墙上屏蔽掉不是/admin/*的endpoints访问请求,更进一步,利用Spring Security能够配置验证信息,这样要访问当前应用的endpoints必须使用用户名和密码登录。
本号专一于后端技术、JVM问题排查和优化、Java面试题、我的成长和自我管理等主题,为读者提供一线开发者的工做和成长经验,期待你能在这里有所收获。