在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务应用的相关指标以及实现一些常规操作控制,我们需要开发一套专门用于植入各个微服务的接口供监控系统采集信息,而这些接口往往有很大一部分指标都是类似的,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 监控与管理的更多相关文章

  1. 笔记:Spring Boot 监控与管理

    在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务 ...

  2. Spring Boot监控与管理的实现

    认识Actuator 在SpringBoot应用中引入spring-boot-starter-actuator依赖,它可以为开发团队提供系统运行的各项监控指标. 在项目中引入依赖配置如下: appli ...

  3. (33)Spring Boot 监控和管理生产环境【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http.jmx.ssh.telnet等拉管理和监控应用.审计 ...

  4. spring boot 监控与管理(actuator)

    Spring POMs 中提供了一个特殊的依赖模块,即spring-boot-starter-actuator,我们只需要在我们的POM中添加依赖即可 <!-- 监控 管理 --> < ...

  5. (39.3) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在学习此小节之前您可能还需要学习: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  6. (39.2). Spring Boot Shiro权限管理【从零开始学Spring Boot】

    (本节提供源代码,在最下面可以下载) (4). 集成Shiro 进行用户授权 在看此小节前,您可能需要先看: http://412887952-qq-com.iteye.com/blog/229973 ...

  7. (39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    (本节提供源代码,在最下面可以下载)距上一个章节过了二个星期了,最近时间也是比较紧,一直没有时间可以写博客,今天难得有点时间,就说说Spring Boot如何集成Shiro吧.这个章节会比较复杂,牵涉 ...

  8. (39.4) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在读此文章之前您还可能需要先了解: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  9. Spring Boot Shiro 权限管理

    Spring Boot Shiro 权限管理 标签: springshiro 2016-01-14 23:44 94587人阅读 评论(60) 收藏 举报 .embody{ padding:10px ...

随机推荐

  1. 2017MySQL中文索引解决办法 自然语言处理(N-gram parser)

    问题:长期以来MYSQL搜索对于中文来说不太理想,InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,但是用“初级”一词在“我是一名初级开发者”搜索时是无法出现结果的,原因在于 ...

  2. 某些浏览器没有canvas.toBlob 方法的解决方案

    var dataURLtoBlob = require('blueimp-canvas-to-blob'); // 80x60px GIF image (color black, base64 dat ...

  3. 16 多校8 Rikka with Parenthesis II

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  4. iOS原生和React-Native之间的交互2

    今天看下iOS原生->RN: 这里有个问题: * 我这里只能通过rn->ios->rn来是实现* 如果想直接ios-rn 那个iOS中的CalendarManager的self.br ...

  5. 【Python】数据库练习-1

    三十四 数据库 1.     查看数据库命令 2.     使用某个数据库 3.     查看当前在哪个库 4.     查看当前数据库中有哪些表 5.     查询表中数据 6.     建库:cr ...

  6. Java并发机制和底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行.Java中的并发机制依赖于JVM的实现和CPU的指令. Java语言规范第三版中 ...

  7. Linux文件和目录常用操作命令(40个)

    1.ls(list) [命令作用] 列出文件和目录 [命令语法] ls [选项] [参数] [常用选项] -l 以长格式显示(文件或目录的类型.权限.软硬链接的次数.属主.属组.大小.时间.文件名) ...

  8. Jaxb如何优雅的处理CData

    前言   Jaxb确实是xml和java对象映射互转的一大利器. 但是在处理CData内容块的时候, 还是有些小坑. 结合网上搜索的资料, 本文提供了一种解决的思路, 看看能否优雅地解决CData产出 ...

  9. 一种安装openslide的简易方法

    直接百度谷歌搜索可能需要手动编译安装,能不能用通过一两句命令行的方式安装openslide?网上给出的教程确实都是通过源安装python-openslide,实际上这样安装,即使安装很多依赖库之后仍然 ...

  10. File available()方法

    File类中的length()方法与IO中InputStream类中的available()方法功能重复? 只是返回值类型不同 前者返回long后者返回int   但本质上都一样表示文件的字节数  a ...