简介
Spring Boot提供了运行时的应用监控和管理的功能。我们可以通过http、JMX、SSH协议来进行操作。审计、健康及指标信息将会自动得到。
Endpoints
列举一些主要的endpoints :
敏感信息访问限制
根据上面表格,鉴权为false的,表示不敏感,可以随意访问,否则就是做了一些保护,不能随意访问。
endpoints.mappings.sensitive=false
这样需要对每一个都设置,比较麻烦。敏感方法默认是需要用户拥有ACTUATOR角色,因此,也可以设置关闭安全限制:
management.security.enabled=false
http
我们可以通过http实现对应用的监控和管理,在pom.xml中增加下面依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
测试端点:
其他的端点大家自己测试吧!!
shutdown
shutdown端点默认是关闭的,我们可以在application.properties中开启:
endpoints.shutdown.enabled=true
shutdown端点不支持GET提交,用POST方式访问http://localhost:8080/shutdown;
控制台效果:
定制端点
定制端点一般通过endpoints+端点名+属性名来设置,每段之间用.隔开。
1:修改端点
endpoints.beans.id=mybeans
此时访问地址变为http://localhost:8080/mybeans;
2:开启端点
endpoints.shutdown.enabled=true
3:关闭端点
endpoints.beans.enabled=false
关闭端点后访问404:
4:只开启所需端点
若只开启所需端点的话,我们可以通过关闭所有的端点,然后再开启所需端点来实现:
endpoints.enabled=false
endpoints.beans.enabled=true //只开启beans端点,访问其它端点皆为404
5:定制端点访问路径
management.context-path=/manage
此时访问路径就为:http://localhost:8080/manage/env;
6:定制端点访问端口
当我们基于安全的考虑,不暴露端点的端口到外部时,就需要应用本身的业务端口和端点所用的端口使用不同的端口:
management.port=8081
此时访问路径就为:http://localhost:8081/env;
7:关闭http端点
management.port=-1
此时访问所有端点皆为404;
自定义端点
当Spring Boot提供的端点不能满足我们特殊的需求,而我们又需要对特殊的应用状态进行监控的时候,就需要自定义一个端点:
StatusService.java
@Service
public class StatusService { //此类无任何特别,仅为改变status的值private String status;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}
}
StatusEndPoint.java
//通过@ConfigurationProperties的设置,我们可以在application.properties中通过endpoints.status配置我们的端点
@ConfigurationProperties(prefix = "endpoints.status", ignoreUnknownFields = false)
//继承AbstractEndpoint类,它是Endpoint接口的抽象实现,当前类一定要重写invoke方法
public class StatusEndPoint extends AbstractEndpoint<String> implements ApplicationContextAware{//实现ApplicationContextAware接口可以让当前类对Spring容器的资源有意识,即可访问容器的资源ApplicationContext context;public StatusEndPoint() {super("status");}@Overridepublic String invoke() { //重写invoke方法,返回我们要监控的内容StatusService statusService = context.getBean(StatusService.class);return "The Current Status is :"+statusService.getStatus();}@Overridepublic void setApplicationContext(ApplicationContext arg0) throws BeansException {this.context = arg0;}
}
DemoApplication.java
@SpringBootApplication
@RestController
public class DemoApplication {@AutowiredStatusService statusService;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}//注册端点的Bean@Beanpublic Endpoint<String> status() {Endpoint<String> status = new StatusEndPoint();return status;}//改变status的状态@RequestMapping("/change")public String changeStatus(String status){statusService.setStatus(status);return "OK";}
}
访问:http://localhost:8080/status
访问:http://localhost:8080/change?status=running,改变status的值:
再次访问:http://localhost:8080/status
自定义HealthIndicator
Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring Boot 内置了一些 HealthIndicator。
定制自己的HealthIndicator只需要一个实现HealthIndicator接口的类,并注册为Bean即可:
StatusHealth.java
@Component
public class StatusHealth implements HealthIndicator {//实现HealthIndicator接口,并重写health方法@AutowiredStatusService statusService;@Overridepublic Health health() {String status = statusService.getStatus();if(status == null||!status.equals("running")){return Health.down().withDetail("Error", "Not Running").build(); //当status的值为非running时构造失败}return Health.up().build(); //其余情况运行成功}}
运行测试:
访问:http://localhost:8080/health
修改status的值为running,访问:http://localhost:8080/change?status=running
再次访问:http://localhost:8080/health
JMX
我们也可以通过JMX对应用进行监控和管理;
在控制台调用java内置的jconsole来实现JMX监控:
打开jconsole页面,选择当前程序的进程:
监控内存、线程、CPU占用率等:
在MBean标签的org.springframework.boot域下可对我们的程序进行监控和管理:
参考书籍:Spring Boot实战
以上只是学习所做的笔记,以供日后参考!!!