第 III 部分Spring Boot 系统监控、测试与运维

Spring Boot 应用监控:Actuator与 Admin

《Spring Boot 实战开发》(陈光剑)
—— 基于 Gradle + Kotlin的企业级应用开发最佳实践

在企业级应用中,对系统进行运行状态监控通常是必不可少的。Spring Boot提供了 Actuator 模块实现应用的监控与管理,对应的起步依赖是spring-boot-starter-actuator。
spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。它提供了应用的审计(Auditing)、健康(health)状态信息、数据采集(metrics gathering)统计等监控运维的功能。同时,我们可以扩展 Actuator 端点(Endpoint) 自定义监控指标。这些指标都是以 JSON 接口数据的方式呈现。而使用 Spring Boot Admin 可以实现这些 JSON 接口数据的界面展现。
本章介绍 Spring Boot Actuator 和使用Spring Boot Admin实现对 Spring Boot应用的监控与管理。
1.1 Actuator简介
在实际的生产系统中,我们怎样知道我们的应用运行良好呢?我们往往需要对系统实际运行的情况(例如cpu、io、disk、db、业务功能等指标)进行监控运维。这需要耗费我们不少精力来搞这些工作。
在SpringBoot中,我们完全不需要面对这样的难题。Spring Boot Actuator 提供了众多 HTTP 接口端点(Endpoint),其中包含了丰富的 Spring Boot 应用程序运行时的内部状态信息。同时,我们还可以自定义监控端点实现灵活定制。
Actuator是spring boot提供的对应用系统的自省和监控功能,Actuator对应用系统本身的自省功能,可以让我们方便快捷的实现线上运维监控的工作。这个有点DevOps的味道。通过Actuator,我们可以使用数据化的指标去度量我们的应用的运行情况。比如查看服务器的磁盘、内存、CPU 等信息,系统运行了多少线程,gc的情况,运行状态等等。

spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。
随着devops的兴起,以及docker技术的普及,微服务在一定场合会越来越受欢迎。即使不说微服务,springboot这种可以直接内嵌web服务器打成一个jar包的方式,也更符合devops的趋势:打成个jar包,往服务器上一扔,十分方便,自带Actuator,把监控也给省了一大半,真正做到了可以把精力花在刀刃上。
1.2 启用 Actuator
在 Spring Boot项目中添加Actuator 起步依赖即可启用 Actuator 功能。在 Gradle项目配置文件build.gradle中添加如下:

dependencies {compile('org.springframework.boot:spring-boot-starter-actuator')...
}

为了看到 Spring Boot 中提供的全部的端点信息,在 Spring Boot 1.5.x 版本中默认启用所有 Endpoint,这些端点如下:

{"links" : [ {"rel" : "self","href" : "http://127.0.0.1:8010/actuator"}, {"rel" : "metrics","href" : "http://127.0.0.1:8010/metrics"}, {"rel" : "autoconfig","href" : "http://127.0.0.1:8010/autoconfig"}, {"rel" : "configprops","href" : "http://127.0.0.1:8010/configprops"}, {"rel" : "dump","href" : "http://127.0.0.1:8010/dump"}, {"rel" : "trace","href" : "http://127.0.0.1:8010/trace"}, {"rel" : "logfile","href" : "http://127.0.0.1:8010/logfile"}, {"rel" : "beans","href" : "http://127.0.0.1:8010/beans"}, {"rel" : "env","href" : "http://127.0.0.1:8010/env"}, {"rel" : "heapdump","href" : "http://127.0.0.1:8010/heapdump"}, {"rel" : "serverEndpoint","href" : "http://127.0.0.1:8010/serverEndpoint"}, {"rel" : "jolokia","href" : "http://127.0.0.1:8010/jolokia"}, {"rel" : "info","href" : "http://127.0.0.1:8010/info"}, {"rel" : "loggers","href" : "http://127.0.0.1:8010/loggers"}, {"rel" : "showEndpoints","href" : "http://127.0.0.1:8010/showEndpoints"}, {"rel" : "auditevents","href" : "http://127.0.0.1:8010/auditevents"}, {"rel" : "health","href" : "http://127.0.0.1:8010/health"}, {"rel" : "docs","href" : "http://127.0.0.1:8010/docs"}, {"rel" : "mappings","href" : "http://127.0.0.1:8010/mappings"} ]
}

在 Spring Boot 2.0中,Actuator 模块做了较大更新,默认启用的端点如下:

{
_links: {
self: {
href: "http://127.0.0.1:8008/actuator",
templated: false
},
health: {
href: "http://127.0.0.1:8008/actuator/health",
templated: false
},
info: {
href: "http://127.0.0.1:8008/actuator/info",
templated: false
}
}
}

如果想启用所有 Endpoint,在application.properties中配置如下:

#endpoints in Spring Boot 2.0
#http://127.0.0.1:8008/actuator
management.endpoints.enabled-by-default=true
management.endpoints.web.expose=*

重新启动应用,我们将看到一个信息更全的 Actuator 端点列表,这个列表我们将在下面小节中看到。

如果是默认启用所有 Actuator 端点,但是想要禁用某些端点信息,可以配置如下:

management.endpoint.beans.enabled=false
management.endpoint.info.enabled=false
management.endpoint.health.enabled=false

这样再访问 http://127.0.0.1:8008/actuator ,我们将不会看到/beans、 /info、/health的端点信息了。另外,我们可以通过 application.properties 中的属性定制 Actuator 的使用。完整的 Actuator 配置属性列表参考application.properties 中的:

# ----------------------------------------
# ACTUATOR PROPERTIES
# ----------------------------------------

部分。这些配置属性都在management.*命名空间下。

提示 :本节的实例工程代码在:https://github.com/KotlinSpringBoot/ksb_with_security/tree/front_back_end_2018.2.2 中。

更多关于 Spring Boot 2.0中的 Actuator 的介绍参考:https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/

1.4 自定义Actuator Endpoint

Spring Boot Actuator 模块提供了灵活的接口,方便我们自己定制监控端点。例如Endpoint、PublicMetrics、HealthIndicator、CounterService、GaugeService接口等。 为了跟下一小节中介绍 Spring Boot Admin (目前仅支持 Spring Boot >=1.5.9.RELEASE and <2.0.0.M1版本)衔接,本节基于Spring Boot 1.5.10中 Actuator模块。
1.4.1 Endpoint接口
SpringBoot的Endpoint主要是用来监控应用服务的运行状况,并在Mvc中集成以提供HTTP接口。内置的Endpoint比如HealthEndpoint会监控disk和db的状况:

图14-1 HealthEndpoint会监控disk和db的状况
MetricsEndpoint则会监控内存和gc等指标的状况:

{"mem": 1089990,"mem.free": 86536,"processors": 4,"instance.uptime": 796368,"uptime": 829333,"systemload.average": 5.74365234375,"heap.committed": 968704,"heap.init": 131072,"heap.used": 881143,"heap": 2097152,…
}

Endpoint的接口协议如下

    public interface Endpoint<T> {String getId();boolean isEnabled();boolean isSensitive();T invoke(); }

1.4.2 实现Endpoint接口
下面我们来自定义一个显示当前 Spring Boot 应用程序运行机器的信息。这个端点ID 是 /serverEndpoint,输出的数据结构是Map<String, Map<String, String>>, 示例数据如下:

// 20180207113759
// http://127.0.0.1:8010/serverEndpoint{"ServerInfo": {"hostAddress": "127.0.0.1","hostName": "jacks-MacBook-Air.local","OS": "Mac OS X"},"DiskInfo": {"freeSpace": "3143M","usableSpace": "2893M","totalSpace": "114544M"},"MemInfo": {"totalPhysicalMemorySize": "8192M","freePhysicalMemorySize": "84M","committedVirtualMemorySize": "6225M","freeSwapSpaceSize": "1314M","totalSwapSpaceSize": "7168M","processCpuLoad": "0.1716696728153335","systemCpuLoad": "0.8331151832460733","processCpuTime": "1401557475000","arch": "x86_64","availableProcessors": "4","systemLoadAverage": "5.63134765625","version": "10.12.1"}
}

完整的实现代码在ServerEndpoint.kt 中。可参考示例工程源代码。
启动应用,通过http://127.0.0.1:8010/actuator 我们可以看到 /serverEndpoint 端点的信息

{"links": [{"rel": "self","href": "http://127.0.0.1:8010/actuator"},{"rel": "metrics","href": "http://127.0.0.1:8010/metrics"},…{"rel": "serverEndpoint","href": "http://127.0.0.1:8010/serverEndpoint"},…]
}

访问其中的: http://127.0.0.1:8010/serverEndpoint ,可以看到输出数据如下:

1.4.3 继承AbstractEndpoint抽象类

Spring Boot Actuator 内置的/env 端点实现代码在EnvironmentEndpoint中。其中的关键代码如下:

@ConfigurationProperties(prefix = "endpoints.env")
public class EnvironmentEndpoint extends AbstractEndpoint<Map<String, Object>> {…@Overridepublic Map<String, Object> invoke() {Map<String, Object> result = new LinkedHashMap<String, Object>();…}...
}

可以看出,EnvironmentEndpoint是继承AbstractEndpoint抽象类,重写invoke() 方法来实现的。所以,我们也可以通过这种方法来自定义端点。
下面我们实现一个显示 Spring Boot应用中所有端点信息(类似 /actuator 功能)的 /showEndpoints。这个端点输出的数据结构如下

{"serverEndpoint": {"id": "serverEndpoint","enabled": true,"sensitive": false},"showEndpoints": {"id": "showEndpoints","enabled": true,"sensitive": false},..
}

首先,声明一个ShowEndpoints 类,它继承AbstractEndpoint抽象类并实现ApplicationContextAware接口:

@Component
class ShowEndpoints :AbstractEndpoint<MutableMap<String, MyEndpoint>?>("showEndpoints"),ApplicationContextAware {val log = LoggerFactory.getLogger(ShowEndpoints::class.java)private var applicationContext: ApplicationContext? = null@Throws(BeansException::class)override fun setApplicationContext(applicationContext: ApplicationContext) {this.applicationContext = applicationContext}...
}

Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,将容器对象本身作为applicationContext实例变量参数传给该方法。
接下来可以通过该applicationContext实例变量来访问容器本身。使用ApplicationContext对象调用getBeansOfType(Class<T> type) 获取当前 Spring Boot 应用程序中所有的 Endpoint 接口类型和MvcEndpoint接口类型的 Bean。相关代码是:

val endpoints = this.applicationContext?.getBeansOfType(Endpoint::class.java)
val mvcEndpoints = applicationContext?.getBeansOfType(MvcEndpoint::class.java)

完整的实现代码可以参看示例工程源代码.kt。在ShowEndpoints.kt 中,可以参考实例工程源代码。
1.4.4 实现健康指标接口HealthIndicator
下面我们在 /health端点中自定义健康信息myCustome,输出的数据如下:

我们只需要实现HealthIndicator接口即可。HealthIndicator接口协议如下

package org.springframework.boot.actuate.health;
public interface HealthIndicator {Health health();
}

具体的实现代码如下

@Component
class MyCustomHealthIndicator : HealthIndicator {override fun health(): Health {val errorCode = check() // 健康检查方法示例return if (errorCode != 0) {Health.down().withDetail("Error Code", errorCode).build()} else Health.up().withDetail("imageRepository.selectTest", errorCode).build() // 返回selectTest健康信息}@Autowired lateinit var imageRepository: ImageRepository// 健康检查方法逻辑private fun check(): Int {return imageRepository.selectTest()}
}

其中,imageRepository.selectTest()方法代码是

@Query(value = "select 0", nativeQuery = true)
fun selectTest():Int

1.4.5 实现度量指标接口PublicMetrics

Actuator 中提供的PublicMetrics接口实现类有

...

本节 Spring Boot客户端应用源代码:https://github.com/AK-47-D/cms-spider/tree/boot_admin_2018.2.4

Spring Boot Admin Server 工程源代码:
https://github.com/KotlinSpringBoot/demo_boot_admin

1.6 本章小结

Spring Boot Actuator 提供了强大的应用自省功能,提供了丰富的 Endpoints 的信息覆盖 Spring Boot 应用程序运行的方方面面。同时,结合可视化的 Spring Boot Admin 管理界面,一切显得如此“高大上”。而在此过程中,我们只需要极简的几步配置即可完成这些事情。这正是 Spring Boot 的“初心” 所在。
下章介绍 Spring Boot 应用的测试与部署。

Spring Boot 应用监控:Actuator与 Admin相关推荐

  1. 使用Actuator 实现Spring Boot应用监控

    我们知道Spring Boot 提供了Actuator组件,方便我们对应用程序进行监控和维护.接下来,就来介绍Actuator到底是什么?如何在Spring Boot项目中快速集成Actuator? ...

  2. Spring Boot应用监控实战

    概述 之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.同样利用SpringBoot作为微服务单元的实例化技术选型时,我们不 ...

  3. Spring Boot指标监控与健康检查

    Spring Boot指标监控与健康检查 Actuator Spring Boot Actuator 可以帮助你监控和管理 Spring Boot 应用,比如健康检查.审计.统计和HTTP追踪等.所有 ...

  4. 注册为Linux服务,docker部署,dockerfile,spring boot测试监控,actuator,项目远程访问,maven的scope标签

    1. 项目注册为 Linux服务 可以开启 关闭 开机启动 mvn package java -jar xxxx.jar pom加executable <build><plugins ...

  5. Spring Boot 应用监控

    当一个Spring Boot 应用运行的时候,开发者需要对Spring Boot应用进行实时监控,获得项目的报警需求,Spring Boot 提供了,actuator 来帮助开发者获取应用程序运行时的 ...

  6. 第8章Spring Boot整合监控

    8.1 使用actuator监控 8.1.1 actuator是什么 在Spring Boot的众多Starter POMs中有一个特殊的模块,不同于其他模块大多用于开发业务功能或连接一些其他外部资源 ...

  7. 面试官:聊一聊 Spring Boot 服务监控机制

    欢迎关注方志朋的博客,回复"666"获面试宝典 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服 ...

  8. 聊聊Spring Boot服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!...

    来自:https://juejin.im/post/5e2179def265da3e152d2561 前言 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要 ...

  9. Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...

    作者:Richard_Yi 来源:http://39sd.cn/B2A0B 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要将我们核心的微服务应用全部监控起 ...

最新文章

  1. XCode6报数组越界错误的问题
  2. LVS学习笔记--概念
  3. Redis集群技术及Codis实践
  4. nginx http proxy 正向代理
  5. Android横向ListView功能实现
  6. POJ3264Balanced Lineup(最基础的线段树)
  7. python程序的扩展名是perl程序的扩展名是_Python 程序扩展名(py, pyc, pyw, pyo, pyd)及发布程序时的选择...
  8. vue-seamless-scroll
  9. iOS Crash常规跟踪方法及Bugly集成运用
  10. Flash cs4 for mac 序列号。
  11. linux 使用秘钥认证,linux 密钥验证登录
  12. 合宙 Air 724UG模组(4G Cat.1通信模组)测试过程
  13. QQ群推广最大化营销效果分析
  14. mysql笔记--03DML
  15. 编写程序计算圆的面积和周长
  16. 怎么建立win7无线热点
  17. android 关机界面修改,修改Android关机界面
  18. 当网站关键词优化到搜索引擎首页后,是否还要继续优化呢?
  19. 专题:手把手学习硬件基础------12、滤波电路
  20. System Extract 步骤

热门文章

  1. MySQL获取数据库每个表的行数
  2. 虚拟化的发展历程和实现原理——图文详解
  3. java基础----Base64算法的使用
  4. Coursera课程Python for everyone:Quiz: eXtensible Markup Language
  5. 深度学习(二)theano学习笔记(1)环境搭建
  6. 《大话数据结构》第9章 排序 9.5 直接插入排序
  7. 懒到极致之怒撸一键打包发布系统
  8. WCF学习之旅—请求与答复模式和单向模式(十九)
  9. 第一次spring,第三天。
  10. 黑盒測试(一)-----边界值測试