微服务的特点决定了功能模块的部署是分布式的, 大部分功能模块都是运行在不同的机器上, 彼此通过服务调用进行交互, 前后台的业务流会经过很多个微服务的处理和传递, 出现了异常如何快速定位是哪个环节出现了问题?
在这种框架下, 微服务的监控显得尤为重要. 本文主要结合 Spring Boot Actuator, 跟大家一起分享微服务 Spring Boot Actuator 的常见用法, 方便我们在日常中对我们的微服务进行监控治理.
Actuator 监控
Spring Boot 使用 "习惯优于配置的理念", 采用包扫描和自动化配置的机制来加载依赖 jar 中的 Spring bean, 不需要任何 xml 配置, 就可以实现 Spring 的所有配置. 虽然这样做能让我们的代码变得非常简洁, 但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上, 这使得我们分析整个应用中资源和实例的各种关系变得非常的困难.
Actuator 是 Spring Boot 提供的对应用系统的自省和监控的集成功能, 可以查看应用配置的详细信息, 例如自动化配置信息, 创建的 Spring beans 以及一些环境属性等.
Actuator 监控只需要添加以下依赖就可以完成
- <dependencies>
- <!-- 如果使用 http 调用的方式, 还需要这个依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!-- 必须的 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- 安全 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
- </dependencies>
为了保证 actuator 暴露的监控接口的安全性, 需要添加安全控制的依赖 spring-boot-start-security 依赖, 访问应用监控端点时, 都需要输入验证信息. Security 依赖, 可以选择不加, 不进行安全管理, 但不建议这么做.
Actuator 的 REST 接口
Actuator 监控分成两类: 原生端点和用户自定义端点; 自定义端点主要是指扩展性, 用户可以根据自己的实际应用, 定义一些比较关心的指标, 在运行期进行监控.
原生端点是在应用程序里提供众多 Web 接口, 通过它们了解应用程序运行时的内部状况. 原生端点又可以分成三类:
应用配置类: 可以查看应用在运行期的静态信息: 例如自动配置信息, 加载的 springbean 信息, YAML 文件配置信息, 环境信息, 请求映射信息;
度量指标类: 主要是运行期的动态信息, 例如堆栈, 请求连, 一些健康指标, metrics 信息等;
操作控制类: 主要是指 shutdown, 用户可以发送一个请求将应用的监控功能关闭.
Actuator 提供了 13 个接口, 具体如下表所示.
方法 | 路径 | 描述 |
---|---|---|
GET | /conditions | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
GET | /configprops | 描述配置属性 (包含默认值) 如何注入 Bean |
GET | /beans | 描述应用程序上下文里全部的 Bean,以及它们的关系 |
GET | /heapdump | 获取堆的快照 |
GET | /threaddump | 获取线程活动的快照 |
GET | /env | 获取全部环境属性 |
GET | /env/{name} | 根据名称获取特定的环境属性值 |
GET | /health | 报告应用程序的健康指标,这些值由 HealthIndicator 的实现类提供 |
GET | /info | 获取应用程序的定制信息,这些信息由 info 打头的属性提供 |
GET | /mappings | 描述全部的 URI 路径,以及它们和控制器 (包含 Actuator 端点) 的映射关系 |
GET | /metrics | 报告各种应用程序度量信息,比如内存用量和 HTTP 请求计数 |
GET | /metrics/{name} | 报告指定名称的应用程序度量值 |
POST | /shutdown | 关闭应用程序,要求 endpoints.shutdown.enabled 设置为 true |
GET | /trace | 提供基本的 HTTP 请求跟踪信息(时间戳、HTTP 头等) |
实际上, 你项目跑起来之后就会把这些接口都打印出来:
image.PNG
相关配置
项目依赖
- <dependencies>
- <!-- 如果使用 http 调用的方式, 还需要这个依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- Spring Boot 使用 Micrometer, 一个应用 metrics 组件, 将 actuator metrics 整合到外部监控系统中.-->
- <dependency>
- <groupId>io.micrometer</groupId>
- <artifactId>micrometer-registry-prometheus</artifactId>
- </dependency>
- </dependencies>
配置文件
定义访问的端口: 1001
- management:
- server:
- port: 1001
定义访问的路径及权限:
- management:
- # 默认 Actuator 只暴露了 health 和 info 端点, 在 SpringBoot 的 application.YAML 配置文件中加入这句话暴露所有端点
- endpoints:
- Web:
- exposure:
- include: "*"
- # 代表启用单独的 url 地址来监控 Spring Boot 应用, 为了安全一般都启用独立的端口来访问后端的监控信息
- server:
- servlet:
- context-path: /monitor
访问路径
最后就是访问测试下, 这个时候很多人会遇到 404, 有些是路径不对, 有些是接口不对.
如何一次性写对请求的 URL? 看下面的图.
image.PNG
最后得出的请求 URL:
http://localhost:1001/monitor/actuator/archaius
参考文章及更多内容见:
来源: http://www.jianshu.com/p/c6d172577c3d