如何做实时监控?—— 参考 Spring Boot 实现
随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向于把大型应用程序切分成多个微服务,服务之间通过
RPC 调用。微服务架构的好处非常多,例如稳定的服务变化较少,不会被非稳定服务所影响;不同的服务更方便交给不同的人管理;发布、扩容等操作也更加有针对性。不过这也不是没有代价的,额外的成本最主要的可能就是运维成本。
我们维护的一个产品,由 7 个微服务构成,它们各司其职,承担上行、下行、同步等各类职责,我非常喜欢这种架构,但也面临一个小小的烦恼。每次我们发布其中一个或者多个服务,就需要去验证服务的健康度,极限情况下,7 个服务 x (国内环境 + 国外环境)x (预发布环境 + 生产环境),总共需要验证 28 次!我希望有简单、标准、自动的方式去验证这些服务是否健康。当然,验证健康也不是跑一个完整的回归测试,那是在测试环境就需要完成的事情,健康检查基本只是关注环境是否 OK,最核心的一两个用例是否 OK。由于部署到预发布或者线上的代码,和线下测试的代码是一致的,因此就不需要重复验证各种功能了,关注点应该在环境上,这一点线上和线下是有明显区别的。至于环境区别,通常就是磁盘、数据库、其他分布式服务等等。
此外,我还希望所有服务的健康检查接口是完全一致的,没有人希望检查服务 A 的时候用 url /ok,检查服务 B 的时候用 url /good。
我曾尝试定义一个健康检查协议,让所有服务都暴露一个HTTP接口http://172.20.10.2/health.json ,返回的内容就包含这个这个服务的基本状态。
这几天看 Spring Boot ,发现它已经很好地集成了我想要的功能,而且看起来更简单,因此我就直接扔掉了自己定义的协议,改而使用 Spring Boot 的方式,Spring Boot 有一个称之为 endpoint 的概念,每个 endpoint 是一个非常简单的 HTTP 接口,用户可以通过 endpoint 监控 Spring Boot 应用,甚至与之交互。这其中,最简单的 endpoint 就是 health,只要加入必要的 Spring Boot 依赖,用户就能通过 health 查看 Spring
Boot 应用的基本状态。
$ curl http://localhost:8080/health
{
"status":"UP"
}
这里我们看到服务的状态是 UP,不过也许这个检查太简单了,例如我的服务依赖其他外部服务,其中一个 Tair,一个是 TFS,这两个都是强依赖,如果它们有问题,我的服务就应该是 DOWN 的状态,在 Spring Boot 中,可以这么扩展:
@Component
public class MyHealth implements HealthIndicator {
@Override
public Health health() {
return new Health.Builder()
.withDetail("tair", "timeout") // some logic check tair
.withDetail("tfs", "ok") // some logic check tfs
.status("500")
.down()
.build();
}
}
只要加入一个 bean 实现 HealthIndicator 就能实现更加全面的检查,现在访问 health endpoint 是这样的:
$ curl http://localhost:8080/health
{
"status": "DOWN",
"tair": "timeout",
"tfs": "ok"
}
只要在每个服务稍微实现一些基本的环境检查,那我就可以用几行脚本快速地完成 7 个服务 x (国内环境 + 国外环境)x (预发布环境 + 生产环境)的健康检查,如果有哪个服务出问题了,定位环境问题也是非常方便的。
这种监控是实时的,这一点非常重要。在实际工作中我们其实有非常完善的系统监控平台,平台能提供 CPU、内存、磁盘、网络IO、JVM 等等各种各样非常全面的信息,这种平台的优势有历史趋势记录,有汇总,有比较,劣势就是不够实时,通常只能看到 5 分钟前的数据。因此,在发布服务,扩容的时候,等待这样的系统监控平台反馈就不够了。
除了 health endpoint 之外,Spring Boot 还提供了 其它10多个
endpoint ,它们都是针对运维设计的,例如可以用 shutdown endpoint 来关闭服务、用 beans endpoint 来查看所有的 Spring Bean,下面我想详细讲一下 metrics 这个 endpoint。
默认访问 metrics 我们能得到很多信息,包括 JVM 的线程数、内存、GC 数据等等……,这些都是系统级别的数据,但其实我们可以通过 metrics 收集实时的业务数据,例如每分钟用户登陆数量、每分钟文件同步数量、实时的缓存命中率……等等。
实现是这样的:
@Component
public class MyMetric {
private final CounterService counterService;
private final GaugeService gaugeService;
@Autowired
public MyMetric(CounterService counterService, GaugeService gaugeService) {
this.counterService = counterService;
this.gaugeService = gaugeService;
}
public void exampleCounterMethod() {
this.counterService.increment("login.count");
// reset each minute
}
public void exampleGaugeMethod() {
this.gaugeService.submit("cache.hit", 80.0);
}
}
Spring Boot 内置了两个 Service,CounterService 可以用来做简单的累加累减,GaugeService 可以用来存放简单的 double 值,数据都存放在内存中。
现在访问 metrics endpoint 的效果是这样的:
$ curl http://localhost:8080/metrics
{
"counter.login.count": 42,
"counter.status.200.beans": 1,
"counter.status.200.metrics": 9,
"counter.status.200.root": 4,
"gauge.cache.hit": 80.0,
"gauge.response.beans": 55,
"gauge.response.health": 12,
"gauge.response.metrics": 4,
...
}
Spring Boot 的 metrics endpoint 带了很多的信息,这里我们只关注自定义的数据。
如果所有服务的核心业务数据都通过 metrics 暴露,我们接下来要做的无非就是通过一些数据可视化的 JavaScript 组件访问这些数据,做成一个 Dashboard,那我们就能通过这样一个 Dashboard 查看系统的实时状态。
Spring Boot 的 Endpoints 带着强烈的 DevOps 色彩, “you
build it, you run it” ,开发不仅要关心如何实现功能,还需要关心服务在线上运行的状态,如果缺乏实时监控,维护线上服务必然是一场噩梦。如果基于 Spring Boot 开发服务,那只需要稍作扩展,实时监控就足够用了,就算不使用 Spring Boot,类似的思路自己实现也并不复杂。
参考链接 http://docs.spring.io/spring-boot/docs/1.1.x/reference/htmlsingle/#production-ready-endpoints
如何做实时监控?—— 参考 Spring Boot 实现的更多相关文章
- 如何做实时监控?—— 参考 Spring Boot 实现(转)
转自:http://blog.csdn.net/xiaoyu411502/article/details/48129057 随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向 ...
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置
Actuator 简介 Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能.通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘.内存.C ...
- Spring Boot 2.X(十七):应用监控之 Spring Boot Admin 使用及配置
Admin 简介 Spring Boot Admin 是 Spring Boot 应用程序运行状态监控和管理的后台界面.最新UI使用vue.js重写里. Spring Boot Admin 为已注册的 ...
- 服务监控之 Spring Boot Admin.
一.概述 开始阅读这篇文章之前,建议先阅读下<SpringBoot 之Actuator>,该篇文章提到 Spring Boot Actuator 提供了对单个Spring Boot的监控 ...
- 如何做自己的服务监控?spring boot 1.x服务监控揭秘
1.准备 下载可运行程序:http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/ 2.添加服务监控依赖 <d ...
- 在Eclipse中使用建立使用Gradle做依赖管理的Spring Boot工程
前述: Gradle存在很长时间了,以前只知道Maven和ivy ,最近才知道有这个存在,因为以后要用这个了; 所以,要先学会怎么用这个工具,就从建立一个简单工程开始! 实际上以前是见过Gradle的 ...
- Home Assistant系列 -- 接入手机摄像头做实时监控和人脸识别
准备一部废旧(土豪忽略,主要是穷)的.摄像头还是好的手机做监控设备,(Android 和iPhone都行)当Home Assistant 获得实时的视频流后,可以接入各种图像处理组件完成人脸识别,动作 ...
- spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)
一,actuator有哪些环节要做安全配置? actuator是应用广泛的监控工具, 但在生产环境中使用时,需要做严格的安全保障, 避免造成信息泄露等严重的安全问题 actuator可以采取的安全措施 ...
随机推荐
- 进入MFC讲坛的前言(一)
在这里,我想谈谈自己学习MFC的一些体会.我是从1997年才开始在Window下编写程序的.在这之前,我编写过一些DOS程序,包括一个简单的全屏幕编辑器和一个带函数的表达式解释器,都是一些小的程序.W ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- swift 关于 toolbar 学习笔记
import UIKit class ViewController: UIViewController { @IBOutlet weak var toolBar: UIToolbar! @IBOutl ...
- C++sort函数使用总结
头文件:algorithm 对于(整数/字符)数组进行比較时,可直接通过sort(a,a+n)或sort(a.begin(),a.end())进行排序,默认升序排列,须要高速实现降序时,有三种方案 1 ...
- Column store index 列数据如何匹配成行数据?
SQL Server 2012引入了列存储索引,对每列的数据进行分组和存储,然后联接所有列以完成整个索引.这不同于传统索引,传统索引对每行的数据进行分组和存储,然后联接所有行以完成整个索引. 在访问基 ...
- MySQL优化必须调整的10项配置
当我们被人雇来监测MySQL性能时,人们希望我们能够检视一下MySQL配置然后给出一些提高建议.许多人在事后都非常惊讶,因为我们建议他们仅仅改动几个设置,即使是这里有好几百个配置项.这篇文章的目的在于 ...
- HDOJ 2680 Dijkstra
题目大意: 给你一个有向图,一个起点集合,一个终点,求最短路.... 解题思路: 1.自己多加一个超级源点,把起点集合连接到超级源点上,然后将起点与超级源点的集合的路径长度设为0,这样就称为一个n+1 ...
- 01-OC介绍
目录 一.OC语言介绍 二.ios系统 三.在OC语言开发中使用C语言语法 四.面向对象 回到顶部 一.OC语言介绍 1 早在20世纪80年代早期,BardCox发明了Objective-C,扩充了C ...
- docker学习笔记5:利用commit命令创建镜像 和 删除本地镜像
一.概述 创建镜像有两种方法,一是用commit命令,二是用dockerfile方法(这个更常用,在下面文章介绍).本章介绍commit方法. 在介绍commit命令前,我们先回顾下对代码的版本控制, ...
- splinter python浏览器自动化操作,模拟浏览器的行为
Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...