本文首发于我的网站: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>
复制代码
而后在节点里面增长对应的插件:面试
<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中配置*.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面试题、我的成长和自我管理等主题,为读者提供一线开发者的工做和成长经验,期待你能在这里有所收获。