Spring Boot提供的监控和管理接口
Spring Boot提供了收集一些系统信息和对系统进行管理的功能,并会把它们以JMX或Http的方式发布出来,用户可以把它们集成到自己的监控系统。需要使用这些功能时需要添加如下依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Endpoint
Spring Boot把一类监控和管理称为一个Endpoint。打开jconsole可以看到发布在org.springframework.boot.Endpoint
下的Endpoint。也可以通过浏览器访问/actuator
看到通过Http发布的Endpoint。默认情况下绝大部分的Endpoint都会通过JMX发布(shutdown默认不发布),但只有少部分会通过Http发布,所以你通过JMX可以看到发布了很多Endpoint,而通过Http默认将只能看到info
和health。每一个Endpoint都对应有一个唯一的id,常见的Endpoint有如下这些:
- beans :列出应用中所有的Spring bean
- conditions :列出所有的
@ConditionalXXX
匹配或不匹配的原因 - configprops :列出所有的
@ConfigurationProperties
信息 - env :列出Spring Environment中的属性信息(application.properties中指定的属性都将加入Environment中)
- health :列出应用的健康状况
- httptrace :列出最近100笔Http请求跟踪信息,包括请求信息和响应信息
- info :列出应用的一些信息
- loggers :可以查看和配置logger信息
- metrics :可以查看metrics信息
- mappings :可以查看路径映射信息
- scheduledtasks :查看Spring定时任务信息
- shutdown :可以用来停止应用
- threaddump :进行Thread dump
- heapdump :进行heap dump
能够发布哪些将依赖于你的Classpath下拥有哪些Endpoint。关于上面这些Endpoint的介绍请参考https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/production-ready-endpoints.html。可以通过management.endpoint.endpointId.enabled
指定某个Endpoint是否可用,比如如果需要禁用info
Endpoint,则可以指定management.endpoint.info.enabled=false
。
前面提到几乎所有的Endpoint都会发布到JMX,少数会发布到HTTP,这是由Spring Boot的Endpoint的默认发布策略决定的,可以通过management.endpoints.enabled-by-default
来改变默认发布策略,比如默认发布的都改为不发布,可以指定management.endpoints.enabled-by-default=false
。但是如果你想把默认不发布的Endpoint通过management.endpoints.enabled-by-default=true
指定为发布则是不可行的。基于这种需求得使用更细粒度的控制。Spring Boot分别为JMX和Http发布方式提供了management.endpoints.jmx.exposure
和management.endpoints.web.exposure
,分别包含了include和exclude属性,用于控制需要发布和不发布的Endpoint。假如不想通过JMX方式发布beans和mappings这两个Endpoint,则可以配置management.endpoints.jmx.exposure.exclude=beans,mappings
,而如果希望通过Web方式发布beans和mappings这两个Endpoint,则可以配置management.endpoints.web.exposure.include=beans,mappings
。如果需要发布所有或者禁用所有,则可以使用*
表示。比如需要通过Web方式发布所有的Endpoint,则可以配置management.endpoints.web.exposure.include=*
。management.endpoints.jmx.exposure.include
属性的默认值是*
,而management.endpoints.web.exposure.include
的默认值是info, health
,而exclude默认都是空。所以当你指定了management.endpoints.jmx.exposure.exclude=beans,mappings
时发布的Endpoint将只剩下beans和mappings。exclude和include是可以一起使用的,比如需要通过Web方式发布除beans和mappings以外的所有Endpoint时可以如下配置。
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=beans,mappings
当同时指定了include和exclude时,exclude将拥有更高的优先级,即exclude中包含的内容一定会被排除。
Endpoint无参读缓存
Spring Boot会对所有Endpoint的无参数的读操作的结果进行缓存,可以通过cache.time-to-live
指定某个Endpoint的无参读操作的缓存时间,比如下面的配置指定了beans这个Endpoint的无参读操作的缓存时间是10秒。
management.endpoint.beans.cache.time-to-live=10s
Web方式发布的Endpoint的路径
Web方式发布的Endpoint的默认的根路径是/actuator
,每一个是Endpoint会以Endpoint对应的id发布为二级路径,比如beans这个Endpoint的映射路径是/actuator/beans
。可以通过management.endpoints.web.base-path
调整根路径,通过management.endpoints.web.path-mapping.xxx
调整具体某个Endpoint的路径。比如下面的代码就指定了Endpoint的根路径是/actuator1
,loggers Endpoint的路径是loggers1
,所以访问loggers Endpoint的最终路径是/actuator1/loggers1
。
management.endpoints.web.base-path=/actuator1
management.endpoints.web.path-mapping.loggers=loggers1
跨域访问Endpoint Http接口
前面提到了,Spring Boot提供的用于监控的Endpoint会以JMX或Http的方式发布,Http方式发布的都是Rest接口,响应都是JSON,没有界面。如果你提供自己的监控平台,在自己的监控平台需要访问这些监控信息,可能就会遇到浏览器的跨域问题。可以通过management.endpoints.web.cors.allowed-origins
指定允许哪个域进行跨域访问。比如如果我们的Spring Boot应用部署在http://localhost:8081
,监控平台部署在http://localhost:8080
,则以下配置则允许监控平台访问我们Spring Boot应用上发布的Endpoint。
management.endpoints.web.cors.allowed-origins=http://localhost:8080
如果想更精细的控制跨域时只允许某些请求方式,则可以通过management.endpoints.web.cors.allowed-methods
进行指定。
management.endpoints.web.cors.allowed-methods=GET,POST
定义自己的Endpoint
如果你需要定义自己的Endpoint,可以定义一个标注了@org.springframework.boot.actuate.endpoint.annotation.Endpoint
的Class,然后把它定义为Spring容器中的一个bean。需要通过@Endpoint
的id属性指定一个唯一的id,可以通过@ReadOperation
、@WriteOperation
和@DeleteOperation
标注方法,分别对应GET、POST和DELETE请求。Endpoint的请求路径还是Endpoint的根路径加上具体Endpoint的id,如果如下的Endpoint的默认请求路径将是/actuator/hello
。
@Component
@Endpoint(id="hello")
public class HelloEndpoint {
@ReadOperation
public String hello() {
return "Hello World";
}
}
使用@Endpoint
标注的Endpoint是可以通过JMX和Http方式发布的,如果只期望通过Http发布,可以使用@org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint
,如果只期望通过JMX发布,可以使用@org.springframework.boot.actuate.endpoint.jmx.annotation.JmxEndpoint
。
指定Endpoint发布的端口和绑定地址
可能为了安全需要,你不希望Endpoint随着你的应用一起发布,并可对外访问。可以为Endpoint发布指定一个另外的端口,或者绑定另外一个内网ip。比如下面指定了绑定的端口号是8089,地址是127.0.0.1,即对应的Endpoint只能在本机通过localhost或127.0.0.1访问。
management.server.port=8089
management.server.address=127.0.0.1
如果想禁用通过Http方式发布Endpoint,可以设置management.server.port=-1
。
HealthEndpoint
HealthEndpoint是用来监控应用的健康状态的。其监控是基于org.springframework.boot.actuate.health.HealthIndicator
接口的,由其health()
返回的org.springframework.boot.actuate.health.Health
来反应某个组件的健康状况,Spring Boot已经提供了一些HealthIndicator实现。如果需要实现自己的HealthIndicator,只需要把它定义为一个bean。
@Component
public class HelloHealthIndicator implements HealthIndicator {
@Override
public Health health() {
if (System.currentTimeMillis()%2==0) {
return Health.down().withDetail("error", "详细信息,可以是一个对象").build();
}
return Health.up().build();
}
}
在通过/actuator/health
查看应用的健康状况时默认只会返回一个总的状态,不会展示详细的每个组件的健康状况。可以通过配置management.endpoint.health.show-details=always
返回每个组件的健康状况。
InfoEndpoint
InfoEndpoint用来展示应用的一些信息,它会把容器中所有org.springframework.boot.actuate.info.InfoContributor
类型的bean发布的信息收集起来。Spring Boot提供了一个org.springframework.boot.actuate.info.EnvironmentInfoContributor
实现,它允许我们把需要展示的应用信息以info.*
的形式定义在application.properties文件中。下面的代码中就定义了info信息,包含属性name和app,其中app又是一个对象,包含一个description。访问InfoEndpoint时你会得到这样的信息:{"name":"Spring Boot","app":{"description":"Hello World"}}
。
info.name=Spring Boot
info.app.description=Hello World
如果有需要也可以实现自己的InfoContributor,并把它定义为bean。下面是一个简单的示例,
@Component
public class HelloInfoContributor implements InfoContributor {
@Override
public void contribute(Builder builder) {
Map<String, Object> detailMap = new HashMap<>();
detailMap.put("map.key1", "value1");
detailMap.put("map.key2", "value2");
detailMap.put("map.key1.key1.1", "value");
Map<String, Object> otherMap = new HashMap<>(detailMap);
detailMap.put("map.key1.key1.2", otherMap);
builder
.withDetail("key1", "value1")
.withDetail("key1.key1.1", "value2")
.withDetails(detailMap);
}
}
实现InfoContributor时,如果你需要展示的信息有多层结构,应当把它们包装为一个Map。上面的代码对应的获取info的结果如下:
{
name: "Spring Boot",
app: {
description: "Hello World"
},
key1: "value1",
key1.key1.1: "value2",
map.key2: "value2",
map.key1: "value1",
map.key1.key1.2: {
map.key2: "value2",
map.key1: "value1",
map.key1.key1.1: "value"
},
map.key1.key1.1: "value"
}
参考文档
https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/production-ready-endpoints.htmlhttps://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/production-ready-monitoring.html
(注:本文是基于Spring Boot 2.0.3所写)
相关推荐
总的来说,Spring Boot的日志配置具有很高的灵活性,开发者可以根据实际需求进行调整,确保日志系统既满足监控需要,又能高效地管理和存储日志数据。正确配置日志系统对于保障服务的高可用性和问题的及时解决至关...
首先,我们要理解Spring Boot的核心理念——约定优于配置。在Spring Boot项目中,我们不再需要手动编写大量的XML配置文件,而是通过自动配置类和starter模块来简化配置。对于Mybatis的整合,我们可以引入`spring-...
这个工具专门用于监控和管理Spring Boot应用,提供了一种可视化的方式来查看应用程序的状态、日志、健康检查等信息,极大地便利了开发人员对微服务架构的运维。 Spring Boot Admin Server是Spring Boot Admin的核心...
在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...
《Spring Boot实战——基于mickjoust-boot-demo-master的深度解析》 Spring Boot以其简洁、快速的特性在Java开发领域中备受青睐,它通过“约定优于配置”的原则,极大地简化了Spring应用的初始搭建以及开发过程。本...
本书首先介绍了Spring Boot的基础知识,包括如何快速入门,理解Spring Boot的核心理念——约定优于配置,以及它如何通过起步依赖和自动配置简化项目构建。书中详细讲述了如何使用Spring Initializr创建一个新的...
进一步探索,我们还可以研究Spring Boot的健康检查、Actuator监控、Spring Data JPA的懒加载机制、AOP面向切面编程的实现,以及Spring Cloud Config的远程配置加载等。 总之,通过深入学习Spring Boot的源码,...
七、Actuator——监控与健康检查 Spring Boot Actuator提供了一组端点,用于监控应用的健康状态、性能指标、环境信息等。通过启用actuator相关依赖,并配置相应的安全设置,我们可以实时查看应用的运行状况。 八、...
- **依赖管理**:阐述Spring Boot如何管理和简化依赖关系。 - **Maven**:具体介绍如何使用Maven构建工具进行项目构建。 - **继承starter parent**:通过继承starter parent POM来简化依赖管理。 - **在不使用...
5. 监控与日志:Spring Boot集成了Actuator,可以对应用性能进行监控,同时Spring Boot的日志管理方便了问题排查和系统优化。 四、LIMS系统核心模块 1. 样本管理:系统的核心功能,包括样本的登记、分类、编码、...
在本篇内容中,我们将探讨如何将Apache Dubbo与Spring Boot进行整合,创建一个服务提供者(Provider)和一个服务消费者(Consumer)。首先,我们来理解一下这两个关键组件的定义:服务提供者是指实现了特定接口并...
- **健康检查**:通过Spring Boot Actuator提供应用的监控和管理接口。 - **异常处理**:统一异常处理机制,提高应用的健壮性和用户体验。 通过以上内容的学习,开发者可以更好地理解如何使用Spring Boot快速搭建...
4. **命令行接口(CLI)**:Spring Boot提供了一个命令行工具,可以用来快速启动新的项目,并进行测试和运行。 5. **健康检查和Actuator**:Actuator提供了许多端点,用于监控和管理应用,如查看应用健康状态、内存...
5. **Actuator**:Spring Boot的监控和健康检查组件,用于生产环境中的应用管理和维护。 6. **测试**:涵盖单元测试、集成测试以及端到端测试的策略和工具。 7. **云部署**:如何将Spring Boot应用部署到Docker、...
Spring Boot Admin用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul,Zookeeper)发现。
2. **起步依赖**:Spring Boot 引入了一种新的依赖管理方式——“起步依赖”(Starter Dependencies)。这种方式允许开发者仅需声明项目需要的功能模块,如 web、security 等,Spring Boot 就会自动添加所有必要的...
Spring Boot和Shiro是Java开发领域中的两个重要框架,它们分别专注于简化应用程序的启动和管理以及提供安全控制。本文将深入探讨这两个框架的核心概念、功能和如何协同工作,旨在帮助初学者快速上手。 首先,Spring...
此外,Spring Boot还支持健康检查、日志管理、Actuator监控等一系列工具,帮助开发者更好地管理和维护应用。Actuator提供的各种端点可以实时查看应用状态,监控性能指标。 学习Spring Boot,你需要理解其核心理念,...
你可以从中探索Spring Boot的自动配置机制,理解starter的工作方式,学习如何创建自定义starter,深入研究Spring Data与数据库的交互,以及如何利用Actuator进行监控和管理应用。通过阅读和分析源码,你将能够更深入...
4. **Actuator**:Spring Boot Actuator提供了多种监控和管理应用的工具,包括健康检查、审计、指标收集等,有助于在生产环境中进行故障排查和性能优化。 5. **安全**:Spring Security集成,为Spring Boot应用提供...