任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的。

就目前而言,大部分微服务应用都是基于 Spring Boot来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用。

本文基于 SpringBoot 2.3.1.RELEASE 版本演示。

SpringBoot 中的监控可以分为 HTTP 端点和 JMX 两种方式来监控当前应用的运行状况和指标收集

HTTP Endpoints 监控

执行器端点允许您监视应用程序并与之交互。SpringBoot 包括许多内置的端点,并允许我们添加自己的端点。可以通过 HTTP 或 JMX 启用或禁用每个端点,并公开(使其可以远程访问)。每个端点都有一个唯一的 id,访问时可以通过如下地址进行访问:http:ip:port/{id}(SpringBoot 1.x ),而在 SpringBoot 2.x 版本中,默认新增了一个 /actuator 作为基本路,访问地址则对应为 :http:ip:port/actuator/{id}

使用 HTTP 监控非常简单,在 SpringBoot 项目中,引入如下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>

默认就可以通过地址 http:localhost:8080/actuator/health,访问之后得到如下结果:

Spring Boot 中提供了非常多的默认端点监控,但是出于安全考虑,默认情况下有些端点并不是开启状态,如 shutdown 端点就是默认关闭的。

内置端点

Spring Boot 中默认提供的常用内置端点如下:

虽然说这里的大部分端点都是默认开启的,但是默认暴露(允许对外访问)的只有 health 和 info 端点,所以如果需要允许端点对外暴露,可以通过如下配置(如果想要暴露所有的端点,则可以直接配置 "*" ):

management:endpoints:web:exposure:include: [health,info,mappings] //或者直接配置 "*"

另外,开启或禁用某一个端点,也可以通过通过如下配置进行动态控制:

management.endpoint.<id>.enabled=true

接下来我们挑选几个重点的端点来介绍一下。

health 端点

health 断点默认只是展示当前应用健康信息,但是我们可以通过另一个配置打开详细信息,这样不仅仅会监控当前应用,还会监控与当前应用相关的其他第三方应用,如 Redis

management:endpoint:health:show-details: always

这个配置打开之后,我们连接上 Redis 之后再次访问 health 端点,就可以展示 Redis 服务的健康信息了:

loggers 端点

访问 http://localhost:8080/actuator/loggers 可以查看当前应用的日志级别等信息:

这里面本身并不特别,但是有一个功能却非常有用,比如我们生产环境日志级别一般都是 info,但是现在有一个 bug 通过 info 级别无法排查,那么我们就可以临时修改 log 级别。

比如上图中的 ROOT 节点是 info 级别,那么我们可以通过 postman 等工具来发一个 post 请求修改日志级别。

修改之后就会发现,日志由原来的 info 变成了 debug

metrics 端点

metrics 是一个非常重要的监控端点,其监控内容覆盖了 JVM 内存、堆、类加载、处理器和 tomcat 容器等一些重要指标:

可以看到这里面包含了非常多的指标,任意访问一个指标就可以查看对应的指标信息:

自定义监控端点

通过上面的介绍,可以看到 SpringBoot 提供的监控非常强大,但是就算再全面的监控也不可能满足所有人的需求,所以 SpringBoot 也支持自定义监控端点。

自定义监控端点常用注解

自定义一个监控端点主要有如下常用注解:

  • @Endpoint:定义一个监控端点,同时支持 HTTP 和 JMX 两种方式。

  • @WebEndpoint:定义一个监控端点,只支持 HTTP 方式。

  • @JmxEndpoint:定义一个监控端点,只支持 JMX 方式。

以上三个注解作用在类上,表示当前类是一个监控端点,另外还有一些注解会用在方法和参数上:

  • @ReadOperation:作用在方法上,可用来返回端点展示的信息(通过 Get 方法请求)。

  • @WriteOperation:作用在方法上,可用来修改端点展示的信息(通过 Post 方法请求)。

  • @DeleteOperation:作用在方法上,可用来删除对应端点信息(通过 Delete 方法请求)。

  • @Selector:作用在参数上,用来定位一个端点的具体指标路由。

来,一起写一个自己的监控端点

  • 定义一个类,并使用 @Endpoint 注解标注标识,同时定义几个方法用 @ReadOperation 和 @WriteOperation 注解来标注:

@Endpoint(id="myEndpoint")
@Component
public class MyEndpoint {private String STATUS = "up";private String DETAIL = "一切正常";// @ReadOperation
// public String test1(){
// return "wolf";
// }// @ReadOperation
// public Map<String,String> test2(){
// Map<String,String> map = new HashMap();
// map.put("status","up");
// return map;
// }@ReadOperationpublic JSONObject test3(){JSONObject jsonObject= new JSONObject();jsonObject.put("status",STATUS);jsonObject.put("detail",DETAIL);return jsonObject;}@ReadOperationpublic JSONObject test3_1(@Selector String name){JSONObject jsonObject= new JSONObject();if ("status".equals(name)){jsonObject.put("status",STATUS);}else if ("detail".equals(name)){jsonObject.put("detail",DETAIL);}return jsonObject;}@WriteOperation//动态修改指标public void test4(@Selector String name,@Nullable String value){if (!StringUtils.isEmpty(value)){if ("status".equals(name)){STATUS = value;}else if ("detail".equals(name)){DETAIL = value;}}}
}

1. @Component 注解表示将该类交给 Spring 进行管理,或者也可以再定义一个 Configuration 类来加载该 Bean 也可以,当然,如果我们需要提供给第三方使用,如果无法保证当前包名被扫描,则需要使用 SpringBoot 的自动装配机制将该类进行管理。

2. @ReadOperation 方法可以返回 String 或者 JSONObject 或者 Map 集合等。

3. 参数上加了 @Selector 注解则表示访问断端点的时候可以直接访问子节点。

完成了上面的类,启动 SpringBoot 应用,接下来就可以直接通过 http://localhost:8080/actuator/myEndpoint 进行访问了:

同时,因为 test3_1 方法使用了 @Selector 注解,所以我们可以通过这个方法每一个指标的明细:

而带有 @WriteOperation 注解的方法可以用来修改指标,这个方法需要用 post 进行访问,访问的参数可以直接使用字符串传参,也可以直接使用 json 进行传参,修改之后再次查看就可以发现指标已经被动态修改:

JMX 监控

JMX 全称为 Java Management Extensions,即 Java 管理扩展。它提供了对 Java 应用程序和 JVM 的监控管理。通过JMX 我们可以监控服务器中各种资源的使用情况以及线程,内存和 CPU 等使用情况。

打开 jdk 下提供的工具 jConsole

打开之后这里会监控到我们已经启动的应用,双击进入:

如何手动注册一个 JMX MBean

  • 定义一个接口 SystemInfoMBean(注意名字必须要用 MBean 结尾):

public interface SystemInfoMBean {int getCpuCore();long getTotalMemory();void shutdown();
}
  • 再定义一个类实现 SystemInfoMBean 接口,实现类的明明方式为接口名去掉 MBean

public class SystemInfo implements SystemInfoMBean {@Overridepublic int getCpuCore() {return Runtime.getRuntime().availableProcessors();}@Overridepublic long getTotalMemory() {return Runtime.getRuntime().totalMemory();}@Overridepublic void shutdown() {System.exit(0);}
}
  • 最后就是需要将该实现类进行注册:

public class JmxRegisterMain {public static void main(String[] args) throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, MalformedObjectNameException, IOException {MBeanServer mBeanServer= ManagementFactory.getPlatformMBeanServer();ObjectName objectName=new ObjectName("com.lonely.wolf.note.springboot.actuator.jmx:type=SystemInfo");SystemInfo SystemInfo =new SystemInfo();mBeanServer.registerMBean(SystemInfo,objectName);System.in.read();}
}

运行该 main 方法,再打开 jConsole 就可以看到成功注册了一个 MBean

同样的,Spring 当中只要我们使用了 @@Endpoint 或者 @JmxEndpoint 注解,就会自动帮我们注册一个 MBean,其原理也是利用了自动装配机制。

除了 SpringBoot 自带的监控之外,也有其他第三方开源的强大监控系统,如 Prometheus,而且 SpringBoot 也将其进行了集成,使用 Prometheus 时只需要引入如下 jar 包即可:

<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

当然,如果使用 Prometheus 的话需要单独安装,而且一般会选择 Prometheus + Grafana 来共同实现一个监控平台,在这里就不做过多介绍,如果感兴趣的朋友可以自己去了解下这两种软件的使用。

本文主要讲述了 Spring Boot actuator 的使用,并分别介绍了其中两种监控类型 HTTP 和 JMX,最后通过一个例子来实现了自定义的端点,同时也实现了手动注册一个 MBean 的方法。

推荐一个超级简单 Java 图形验证码模块

分享一个支付大屏实时监控数据平台

推荐一款清爽的实时监控大屏附安装教程

大屏监控 Metabase 集成到 Java 项目

一个超牛逼的 Java 文件在线预览项目

如何保障消息100%投递成功、消息幂等性

技术人,做的越多你才能走的更远

传统功夫,点到为止,这次不搞偷袭!

小清新前后端分离后台管理系统

一个开源免费的车牌识别训练实战项目

霸气分享 74 款绚丽的监控大屏

一个基于 Vue3.x 的数据可视化大屏项目

推荐一款基于 Vue 的电商级海报生成器

SpringBoot 的接口快速开发框架

架狗屎:聊一聊 Spring Boot 服务监控机制相关推荐

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

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

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

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

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

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

  4. 一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!...

    作者 | Richard_Yi 责编 | 徐威龙 稿源 | 掘金 封图| CSDN 下载于视觉中国 本文为作者个人经验,供大家参考. 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上 ...

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

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 来源:rrd.me/fJVL7 前言 去年我 ...

  6. (转)Spring Boot(二十):使用 spring-boot-admin 对 Spring Boot 服务进行监控

    http://www.ityouknow.com/springboot/2018/02/11/spring-boot-admin.html 上一篇文章<Spring Boot(十九):使用 Sp ...

  7. 高级版的 jvisualvm :Spring Boot Admin 监控 Spring Boot 微服务项目

    前奏:先说一下 Java VisualVM Java VisualVM 是一个能够监控 JVM 的 jdk 自带的图形化工具: 在 $JAVA_HOME/bin 目录下,可直接运行它. 要想监控远程服 ...

  8. 面试官:聊一聊SpringBoot服务监控机制

    面试官:聊一聊SpringBoot服务监控机制 前言 SpringBoot 监控 HTTP Endpoints 监控 内置端点 health 端点 loggers 端点 metrics 端点 自定义监 ...

  9. Spring Boot 应用监控:Actuator与 Admin

    第 III 部分Spring Boot 系统监控.测试与运维 Spring Boot 应用监控:Actuator与 Admin <Spring Boot 实战开发>(陈光剑) -- 基于 ...

最新文章

  1. Detach Volume 操作 - 每天5分钟玩转 OpenStack(55)
  2. NASA重金悬赏 太空尿片最佳解决方案
  3. 深入分析 Javascript 单线程
  4. execl中设置的格式无法实现
  5. python pyquery库_python解析HTML之:PyQuery库的介绍与使用
  6. [Fanly Submit V4.1]WordPress插件普通收录
  7. 黑盒测试和白盒测试_黑盒测试综合策略
  8. java之struts2的执行流程讲解(1)
  9. 联发科MT6763处理器参数MT6763芯片资料
  10. Excel表格常用函数-VLOOKUP|IFERROR|IF
  11. appcan 文件下载到根目录(pdf)
  12. 微信小号赚钱(转载)
  13. 反斗联盟不显示服务器,《反斗联盟》关服公告
  14. 一次心脏滴血漏洞的bug处理过程
  15. Android正方教务系统课程表+查成绩+查考试安排
  16. Google Chrome谷歌浏览器导入csv账号密码
  17. Linux操作系统下复现github上的项目(一):下载项目、配置环境
  18. Navicat 12 for MySQL激活方法(注册机)
  19. VisualSVN-Server服务器的搭建
  20. 为你的项目搭建sentry并且通过企微推送

热门文章

  1. 网站没有搜索功能怎么搜索_如何搜索任何网站,即使它没有搜索功能
  2. 工作4年从美团、陌陌、百度、阿里面试回来感想
  3. 压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST)
  4. 序列模型与注意力机制总结
  5. 如何让青少年在AI时代抢占先机
  6. 洛谷P5594-【XR-4】模拟赛(模拟)
  7. Linux网络编程之获取网络天气信息
  8. Origin怎样让坐标轴标签置于曲线顶层/上方
  9. cad调了比例因子没反应_大神们都在用的9个CAD制图技巧,你会用几个?
  10. 如何快速搭建”疫情问答“小助手服务