今天在阅读 《SpringCloud微服务实战》一书时看到了SpringBoot actuator相关知识,而且本身也本地调试实践。以为SpringBoot这一套监控仍是挺有意思的,这里记录下学习过程。java
注:本文基于 springBootVersion = '1.5.10.RELEASE'
算法
actuator是SpringBoot的一个组件,组件名称为:spring-boot-starter-actuator, 引入方式以下:
application配置文件:spring
#actuator management.security.enabled= false endpoints.health.sensitive= false
maven引入:sql
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
或者gradle:数据库
compile('org.springframework.boot:spring-boot-starter-actuator')
配置完成以后,启动项目,能够看到:
启动的时候会加载actuator的全部原生端点,后面会对一些经常使用的节点作解释。apache
spring-bbot-starter-actuator模块中已经实现了一些原生端点,根据端点的做用,能够将原生端点分为三大类:安全
下面就来详细测试这几种原生端点,以及看下他们的有用信息和强大的功能。
2.1 应用配置类服务器
因为Spring Boot为了改善传统Spring引用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载本来集中于XML文件中的各项内容。虽然这样的作法让咱们的代码变得很是简洁,可是整个应用的实例建立和依赖关系等信息都离散到了各个配置类的注解上,这使咱们分析整个应用中资源的实例的各类关系变得很是困难。而这类端点能够帮助咱们轻松获取一系列关于Spring 应用配置内容的详细报告,好比自动化配置的报告、Bean建立的报告、环境属性的报告等。session
{ "positiveMatches": { "PageHelperAutoConfiguration": [ { "condition": "OnBeanCondition", "message": "@ConditionalOnBean (types: org.apache.ibatis.session.SqlSessionFactory; SearchStrategy: all) found bean 'sqlSessionFactory'" } ] }, "negativeMatches": { "EncryptionBootstrapConfiguration.RsaEncryptionConfiguration": { "notMatched": [ { "condition": "EncryptionBootstrapConfiguration.KeyCondition", "message": "Keystore nor key found in Environment" } ], "matched": [ { "condition": "OnClassCondition", "message": "@ConditionalOnClass found required class 'org.springframework.security.rsa.crypto.RsaSecretEncryptor'; @ConditionalOnMissingClass did not find unwanted class" } ] } } }
当咱们发现有一些指望的配置没有生效时,咱们能够经过该端点来查看没有生效的具体缘由。架构
如上图所示,咱们能够看到每一个Bean中都包含了下面的这些信息:
bean:Bean的名称
scope:Bean的做用域
type:Bean的Java类型
resource:class文件的具体路径
dependencies:以来的Bean名称
2.2 度量指标类
上面咱们所介绍的应用配置端点类所提供的信息报告在应用启动的是否就已经基本肯定了其返回内容,能够说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,这些端点提供了应用程序在运行过程当中一些快照信息,好比内存使用状况、HTTP请求统计、外部资源指标等。这些端点对于咱们构建微服务架构中的监控系统很是有帮助,因为Spring Boot 应用自身实现了这些端点,因此咱们能够很方便地利用它们来收集咱们想要的信息,以定制出各类自动化策略。下面,咱们就来看看这些强大的端点功能。
从上面的示例中,咱们看到有以下这些重要的度量值:
系统信息:包括处理器数量processors、运行时间uptime和instance.uptime、系统平均负载systemload.average。
mem.*: 内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
heap.*: 堆内存使用状况。这些信息来自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法获取的java.lang.management.MemoryUsage。
nonheap.*: 非堆中内存使用状况。这些信息来自java.lang.management.MemoryMXBean接口中getNonHeamMemoryUsage方法获取的java.lang.management.MemoryUsage。
thrads.*: 线程使用状况,包括线程数、首付线程数(daemon)、线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
classes.*: 应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
gc.*: 垃圾收集器的相信信息。包括垃圾回收次数:gc.ps_scavenge.count,垃圾回收消耗时间:gc.ps_scavenge.time,标记-清除算法的次数:gc.ps_marksweep.count,标记清除算法耗时gc.ps_markweep.time
httpsessions.*: Tomecat容器的会话使用状况。包括最大会话数:httpsession.max和获取会话数:httpsessions.active。该度量指标信息仅在引用嵌入式Tomcat做为容器时才提供。
gauge.*: HTTP请求的性能指标之一,它主要用来反映一个绝对数值。
counter.*: HTTP请求的性能指标之一,它主要用来计数器来使用,记录了增长量和减小量。
/metrics端口能够提供应用运行状态的完整度量报告,这项功能很是实用,可是对于监控系统中各项监控功能,它们的监控内容、数据收集频率都有所不一样,若是每次都经过整年获取报告的方式来收集,略显粗暴。因此咱们能够经过?metrics/{name}接口来更细粒度地获取度量信息。好比咱们能够经过/metrics/mem.free来获取当前可用内存数量。
检测器 | 功能 |
DiskSpaceHealthIndicatior | 低磁盘空间检测 |
DataSOurceHealthIndicator | 检测DataSource的链接是否可用 |
MongoHealthIndicator | 检测Mongo数据库是否可用 |
RabbitHealthIndicator | 检测Rabbit服务器是否可用 |
RedisHealthIndicator | 检测Redis服务器是否可用 |
SolrHealthIndicator | 检测Solr服务器是否可用 |
trace: 该端点用来返回基本的HTTP跟踪信息。默认状况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。
在原生端点中,只提供了一个用来关闭应用的端点:/shutdown ,能够经过以下配置开启它:
endpoints.shutdown.enabled=true
在配置了上述属性以后,只须要访问该应用的/shutdown 端点就能实现关闭该应用的远程操做。因为开放关闭应用的操做自己是一件很是危险的事,因此真正在线上使用的时候,须要对其加入必定的保护机制。好比定制actuator的端点路径、整合Spring Security进行安全校验等。
恰好本身维护的项目在往spring cloud迁移,如今恰好能够利用业余时间来学习微服务相关的知识。spring-boot-actuator确实能够带来不少咱们想不到的收获,并且对于运维也是很是有好多。在这里感谢 《Spring Cloud 微服务实战》这本书,文章中不少内容是经过读书来学习到的,这里只是作个总结。若有纰漏还请你们多多指教。