Spring boot Actuator监控的使用
一、引入springboot依赖包
项目用maven构建,依赖包:
<!-- actuator监控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.3.RELEASE</version> </dependency>二、使用Actuator原生的EndPoints
在引入这两个依赖包时,重启项目可以在启动日志里看到如下信息:
这边就可以看到Actuator已经帮我建立了这些映射,我们可以直接通过http的方式去访问这些端点,比如:
这个/health端点就是Actuator原生提供的,具体有哪些端点,可以参见官方文档:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready
具体说一下这个环节:
1、Actuator可以有自己专属的端口,可以和项目服务端口区分开来,如果不指定,默认的就是我们的服务端口。
management.port=80812、一般来说安全权限要放开,否则所有需要鉴权的端点就无法访问
management.security.enabled=false
3、访问地址
这里可以指定Actuator端点的统一前缀,比如/security/health:
management.context-path=/security
三、自定义Health端点
这里我们需要自定义一个实现类去实现Health端点的HealthIndicator接口,实现其中的health方法,如下:
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class CustomHealth implements HealthIndicator { @Override public Health health() { return Health.up() .withDetail("client", "100") .withDetail("HttpCode","200") .withDetail("service","503") .build(); } }解释一下:
这里的自定义实现类首先要加上@Component注解,这样就可以让spring自动扫描到,也可以通过其它方式。health方法中,最终返回的是一个Health对象,每一个Health对象中都有一个status属性,文中就是用up()方法去指定它的status是up状态,查看了一下源码,如下:
一共有四种状态可以使用,unknown、up、down、out_of_service。指定完status后,就可以使用withDetail方法去添加一些想要的信息,是以一种key-value的形式呈现,它返回的是Health类里的内部类Builder对象,最终通过build方法返回一个属性为当前Builder对象的Health对象。最终效果:
这个“customHealth”就是刚刚我们自定义的health节点,原生的信息可以继续保留。
四、使用自定义的endpoint
首先自定义一个实现类去实现Endpoint接口,如下:
public class CustomEndpoint implements Endpoint<TestEndpointModel>{ /** * id是自定义endpoint唯一标识,也是映射名称 * @return */ @Override public String getId() { return "test"; } /** * 设置此endpoint能否使用 * @return */ @Override public boolean isEnabled() { return true; } /** * 设置此endpoint是否需要安全保证,一般为false * @return */ @Override public boolean isSensitive() { return false; } /** * 处理方法, * 最终返回的信息, * Endpoint接口支持范型,范型的类型就是invoke返回的类型,不指定就是Object类型 * @return */ @Override public TestEndpointModel invoke() { TestEndpointModel m = new TestEndpointModel(); m.setName("ye"); m.setTime(new Date()); return m; } }
自定义实现类所用到的实体类:
public class TestEndpointModel { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date time; private String name; public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "TestEndpointModel{" + "time=" + time + ", name='" + name + '\'' + '}'; } }
各个实现方法的作用参见文中注释。还需要一个配置类,在配置类中指定自定义的端点,如下:
/** * 自定义endpoint配置类 */ @Configuration public class EndPointAutoConfig { @Bean public CustomEndpoint customEndpoint() { return new CustomEndpoint(); } }首先配置类EndPointAutoConfig要加上@Configuration注解,@Configuration注解相当于传统的xml配置文件,可以替代xml的配置。然后再定义一个customEndpoint方法,方法的返回就是我们上面定义的自定义端点,这个方法需要加上@Bean注解,用@Bean注解等价于xml中配置的bean,最终效果如下:
访问的地址就是上面自定义端点类的id属性,返回了自定义的model。