关键词:
在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务应用的相关指标以及实现一些常规操作控制,我们需要开发一套专门用于植入各个微服务的接口供监控系统采集信息,而这些接口往往有很大一部分指标都是类似的,Spring Boot 作为微服务框架时,除了强大的快速开发能力之外,还提供了一个特殊的模块 spring-boot-starter-actuator ,该模块能够自动为 Spring Boot 构建的应用提供一系列用于监控的端点。
引入Actuator
在现有的 Spring Boot 应用中引入该模块非常简单,只需要在 pom.xml 中增加 spring-boot-starter-actuator 依赖即可,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加该依赖之后,重新启动应用,此时,我们可以在控制台中看到如下图所示的输出:
上图显示了一批端点定义,这些端点是由 spring-boot-starter-actuator 模块根据应用依赖和配置自动创建出来的监控和管理端点,通过这些端点我们可以实时获取应用的各项监控指标
原生端点
根据端点的作用,可以将原生端点分为以下三大类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与 Spring Boot应用密切相关的配置类信息
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等
- 操作控制类:提供了对应用的关闭等操作类功能
应用配置类
由于Spring Boot 为了改善传统Spring应用繁杂的配置,采用了包扫描和自动化配置的机制来加载原本集中与XML文件中的各项内容,应用配置类可以帮助我们轻松获取一系列关于Spring应用配置内容的详细报告,比如自动化配置的报告、Bean 创建报告、环境属性报告等。
-
/autoconfig:该端点用来获取应用的自动化配置报告,其中包含所以自动化配置的候选项,同时还列出了每个候选项是否满足自动化配置的各个先觉条件,所以,该端点可以帮助我们方便的找到一些自动化配置为什么没有生效的具体原因,该报告内容分为以下两个部分:
- postitiveMatches 中返回的时条件匹配成功的自动化配置
- negativeMatches中返回的时条件匹配不成功的自动化配置
-
/beans:该端点用来获取应用上下文中创建的所有Bean,其中每个bean都包含以下节点:
- bean :标识Bean的名称;
- scope :标识Bean的作用域;
- type :标识 Bean 的 Java类型;
- resource:class 文件的具体路径
- dependencies:依赖的Bean名称
-
/configprops:该端点用来获取应用中配置的属性报告,返回部分JSON如下:
"environmentMvcEndpoint": {
"prefix": "endpoints.env",
"properties": {
"path": "/env"
}
}
可以看到 /env 端点的属性配置为 endpoints.env.path 可以设置端点访问路径等。
-
/env:该端点与configprops 不同,用来获取应用所有可用的环境属性报告,包含环境变量、JVM属性、应用的配置属性、命令行参数,如果返回信息的属性名称中,包含 password、secret、key 这些关键字,在返回时,会以*来替代实际的属性值,返回部分JSON如下:
"profiles": [ ],
"server.ports": {
"local.server.port": 8080
},
"servletContextInitParams": { },
-
/mappings:该端点用来返回所有 Spring MVC 的控制器映射关系报告,示例片段如下:
"{[/hello/get]}": {
"bean": "requestMappingHandlerMapping",
"method": "public java.lang.String com.example.actuator.HelloController.get()"
},
"{[/error]}": {
"bean": "requestMappingHandlerMapping",
"method": "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)"
},
-
/info:该端点用来返回一些应用自定义的信息,默认情况下,该端点只会返回一个空的JSON内容,我们可以在 application.properties 配置文件中通过 info前缀来设置一些属性,在访问该端点时,就会将设置的属性返回,示例如下:
-
application.properties中增加以下内容:
info.app.name=spring-boot-hello
info.app.version=1.0
-
示例返回如下:
{
"app": {
"name": "spring-boot-hello",
"version": "1.0"
}
}
-
度量指标类
度量指标类端点提供的报告内容是动态变化的,这些端点提供了一弄程序在运行过程中的一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。
- /mertrics:该端点用来返回当前应用的各类重要度量指标,比如内容信息、线程信息、垃圾回收信息等,返回结果如下:
{
"mem": 230900,
"mem.free": 139265,
"processors": 4,
"instance.uptime": 88119,
"uptime": 102055,
"systemload.average": -1,
"heap.committed": 191488,
"heap.init": 129024,
"heap.used": 52222,
"heap": 1829888,
"nonheap.committed": 40192,
"nonheap.init": 2496,
"nonheap.used": 39414,
"nonheap": 0,
"threads.peak": 25,
"threads.daemon": 21,
"threads.totalStarted": 28,
"threads": 23,
"classes": 5728,
"classes.loaded": 5728,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 9,
"gc.ps_scavenge.time": 145,
"gc.ps_marksweep.count": 1,
"gc.ps_marksweep.time": 81,
"httpsessions.max": -1,
"httpsessions.active": 0,
"gauge.response.hello.get": 17,
"gauge.response.star-star": 116,
"counter.status.200.hello.get": 1
"counter.status.404.star-star": 1
}
- 系统信息,包括处理其数量 processors、运行时间 uptime 和 instance.uptime、系统平均负载 systemload.average。
- 内存信息,内存概要信息包括分配给应用的总内存数量 mem 以及当前空闲的内容数量 mem.free
- 堆内存信息,堆内存使用情况 heap.* ,这些信息来自 java.lang.management.MemoryMXBean 接口中 getHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage
- 非堆内存信息,非堆内存使用情况,nonheap.*,这些信息来自 java.lang.management.MemoryMXBean 接口中 getNonHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage
- 线程使用情况,包括线程数 threads、守护线程数量 thread.daemon、线程峰值 threads.peak 这些数据来自 java.lang.management.ThreadMXBean
- 应用加载和卸载类统计,类统计数量 classes、类加载数量 classes.loaded 和 类卸载数量 classes.unloaded
- 垃圾收集器信息,垃圾回收次数 gc.ps_scavenge.count、垃圾回收消耗时间 gc.ps_scavenge.time、标记清除算法的次数 gc.ps_marksweep.count、标记清除算法的消耗时间 gc.ps_marksweep.time
- Tomcat容器会话使用情况,最大会话数量 httpsession.max 和活跃会话数量 httpsessions.active,该度量指标必须在引入嵌入式 Tomcat 作为容器的时候才会提供
- HTTP请求性能指标,gauge.* 表示上一次请求返回的延迟时间(单位:毫秒),比如示例中的 gauge.response.hello.get:17 表示上一次 hello请求的延迟为 17 毫秒;counter.* 主要做为计数器来使用,记录了增加量和减少量,上述示例中的 counter.status.200.hello.get:1 表示 hello 请求返回 200 状态的次数为 1 次
对于 gauge.* 和 counter.*的统计,这里有一个特殊的内容请求 star-star,他代表了对静态资源的访问,这两类度量指标非常有用,我们不仅可以使用默认的统计指标,还可以在程序中增加自定义统计值,只需要通过注入 org.springframework.boot.actuate.metrics.CounterService 和 org.springframework.boot.actuate.mertics.GaugeService 来实现自定义的统计指标信息,示例代码如下:
@RestController
@RequestMapping ("/hello")
public class HelloController {
@Autowired
private CounterService counterService;
@RequestMapping ("getCount")
public String getCount() {
counterService.increment("hello.get.count");
return "ok";
}
}
metrics 可以提供应用运行状态的完整度量指标报告,这项功能非常实用,但是对于监控系统中的各项监控功能,其监控内容、数据收集频率都有所不同,如果每次都通过全量获取报告的方式来收集,颗粒度有些粗,我们还可以通过 /metrics/{name} 的接口来更细粒度获取度量信息,其中 {name} 中可以使用 * 作为通配符来获取匹配的度量信息,示例如下:
请求:
http://localhost:8080/metrics/counter.*
返回:
{
"counter.hello.get.count": 3,
"counter.status.200.metrics": 2,
"counter.status.200.hello.getCount": 3
}
- /health:该端点用来获取应用的各类健康指标信息,在 spring-boot-starter-actuator 模块中值带实现了一些常用资源的健康指标检测器,这些检测器都通过 HealthIndicator 接口实现,并且会根据依赖关系的引入实现自动化装配
检测器 |
功能 |
DiskSpaceHealthIndicator |
低磁盘空间检测 |
DataSourceHealthIndicator |
检测 DataSource 的连接是否可用 |
MongoHealthIndicator |
检测 Mongo 数据库是否可用 |
RabbitHealthIndicator |
检测 Rabbit 服务器是否可用 |
RedisHealthIndicator |
检测 Redis 服务器是否可用 |
如果需要实现自定义的检测器,需要实现 org.springframework.boot.actuate.health.HealthIndicator接口,示例代码如下:
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if (errorCode != 0) {
return Health.down().withDetail("error code", errorCode).build();
}
return Health.up().build();
}
private int check() {
// 对监控对象的检测操作
return -9;
}
}
请求返回(HTTP 503):
{
"status": "DOWN",
"custom": {
"status": "DOWN",
"error code": -9
},
"diskSpace": {
"status": "UP",
"total": 570705309696,
"free": 533198258176,
"threshold": 10485760
}
}
- /dump:该端点用来暴露程序运行中的线程信息,使用 java.lang.management.ThreadMXBean 的 dumpAllThreads 方法来返回所有含有同步信息的活动线程详情
- /trace:该端点用来返回基本的HTTP跟踪信息,默认情况下,跟踪信息的存储采用 org.springframework.boot.actuate.trace.InMemoryTraceRepository 实现的内存方式,始终保留最近的100条请求记录
操作控制类
操作控制类端点拥有更强大的控制能力,如果需要使用他们的话,需要通过属性来配置开启操作,在原生端点中,只提供了一个用来关闭应用的端点:
- /shutdown:关闭应用,需要在配置中开启 endpoints.shutdown.enabled=true,需要使用POST请求访问
Spring Boot 微服务监控与管理
】SpringBoot微服务监控与管理【英文标题】:SpringBootMicroservicesMonitoring&Management【发布时间】:2019-08-0214:09:48【问题描述】:我们正计划为我们的应用程序构建一个基于微服务的分布式架构。我们也对几个概念进行了PoC。但是... 查看详情
重学springboot系列应用程序监控管理(代码片段)
重学SpringBoot系列应用程序监控管理Actuator应用监控快速入门SpringBootActuator简介Actuator开启与配置开启监控默认开放访问的监控端点开放端点配置(exposure)开启端点配置(enabled)常用监控端点说明Actuator服务保护缓... 查看详情
springboot-监控管理
监控管理通过引入spring-boot-starter-actuator,可以使用SpringBoot提供的准生产环境下的应用监控和管理功能。我们可以通过HTTP,JMX,SSH协议来进行操作,自动得到审计、健康等指标信息SpringBoot整合监控管理步骤引入spring-boot-starter-act... 查看详情
springboot监控之监控管理
1、新建一个springboot项目,选中web、DevTools、Actuator2、在application.properties里面配置#actuator端口management.server.port=9001#修改访问路径2.0之前默认是/2.0默认是/actuator可以通过这个属性值修改management.endpoints.web.base-path=/monitor#开放所有页 查看详情
springboot2---指标监控(代码片段)
指标监控1、SpringBootActuator1、简介2、1.x与2.x的不同3、如何使用2、ActuatorEndpoint1、最常使用的端点最常用的Endpoint2、HealthEndpoint3、MetricsEndpoint4、管理Endpoints1、开启与禁用Endpoints2、暴露Endpoints(监控端点)定制Endpoint1、定制一个组件... 查看详情
springboot(21)——监控和管理接口(代码片段)
SpringBoot提供的监控和管理接口SpringBoot提供了收集一些系统信息和对系统进行管理的功能,并会把它们以JMX或Http的方式发布出来,用户可以把它们集成到自己的监控系统。需要使用这些功能时需要添加如下依赖。<dependency><... 查看详情
springboot2.0之监控管理
Springboot监控中心: 针对微服务的服务状态,服务器的内存变化(内存、线程、日志管理等)检测服务配置连接地址是否有用(有些懒加载的情况下,用的时候发现卧槽不能用)模拟访问,懒加载。统计有多少个bean(Spring容器... 查看详情
springboot监控管理之admin监管使用
SpringBootAdmin用于监控基于SpringBoot的应用,它是在SpringBootActuator的基础上提供简洁的可视化WEBUI。SpringBootAdmin是一个社区项目,用于管理和监视SpringBoot®应用程序。其实说作用大也大,说不大也不大。感兴趣的同学可以了解一下... 查看详情
springboot集成监控管理
(1)、添加starter依赖1<dependency>2<groupId>org.springframework.boot</groupId>3<artifactId>spring-boot-starter-actuator</artifactId>4</dependency>(2)、配置相关信息1info.app.id=u 查看详情
springboot整合actuator实现监控管理(代码片段)
SpringBoot使用actuator监控管理 1.在pom文件中导入相关的依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 查看详情
基于springboot+security+redis权限管理系统,权限控制采用rbac
参考技术A用户管理提供用户的相关配置角色管理角色菜单进行权限的分配权限管理权限细化到接口菜单管理已实现菜单动态路由,后端可配置化,支持多级菜单定时任务整合Quartz做定时任务,加入任务日志,任务运行情况一目... 查看详情
springboot揭秘与实战应用监控篇-自定义监控端点
...dpoint抽象类2. 创建端点配置类3. 运行4. 源代码SpringBoot提供的端点不能满足我们的业务需求时,我们可以自定义一个端点。本文,我将演示一个简单的自定义端点,用来查看服务器的当前时间,它将返回两个参数,一... 查看详情
springboot学习笔记——web开发探究(代码片段)
前置知识:SpringBoot学习笔记——SpringBoot简介与HelloWordSpringBoot学习笔记——源码初步解析SpringBoot学习笔记——配置文件yaml学习SpringBoot学习笔记——JSR303数据校验与多环境切换SpringBoot学习笔记——自动配置原理Web开发探究简介... 查看详情
springboot度量指标监控与健康检查和可视化监控应用springbootadmin
... 使用可视化监控应用SpringBootAdmin 使用步骤: SpringBootAdmin的使用是需要建立服务端和客户端的 服务端:独立的项目,会将收集到的数据在自己的图形界面中展示 查看详情
springboot部署测试与监控
这部分的内容实际就是devops的主要工作内容,当然一名合格的程序要也需要掌握这部分的知识。 热部署简单来说,在开发时,修改了任何的代码,IDE将自动编译运行及发布;在发布时,当前发布不影响线上服务的正常进行。... 查看详情
springboot学习笔记——thymeleaf(代码片段)
前置知识:SpringBoot学习笔记——SpringBoot简介与HelloWordSpringBoot学习笔记——源码初步解析SpringBoot学习笔记——配置文件yaml学习SpringBoot学习笔记——JSR303数据校验与多环境切换SpringBoot学习笔记——自动配置原理SpringBoot学习笔记... 查看详情
[读书笔记]springboot项目搭建与配置文件
读书笔记:[JavaEE开发的颠覆者SpringBoot实战]作者:汪云飞从今天开始坚持读书,并记录下此读书笔记。一,初接触Springboot项目Helloworld搭建1.pom.xml配置如下:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst 查看详情
springboot学习笔记5(代码片段)
03、了解自动配置原理1、SpringBoot特点1.1、依赖管理父项目做依赖管理依赖管理<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RE 查看详情