当前位置: 首页 > 后端技术 > Java

SpringBoot是如何监控的?这下终于清楚了,..

时间:2023-04-01 21:38:46 Java

作者:双子座独狼\来源:https://blog.csdn.net/zwx9001...任何服务如果没有被监控,就会被蒙蔽,无法知道服务当前的运行状态,无法to它很好地处理了可能出现的异常情况,因此监控对于任何服务来说都是必不可少的。目前来看,大部分微服务应用都是基于SpringBoot构建的,所以了解SpringBoot的监控特性是很有必要的,而SpringBoot也提供了一些特性来帮助我们监控应用。本文基于SpringBoot2.3.1.RELEASE版本演示。SpringBoot监控SpringBoot中的监控可以分为HTTP端点和JMX来监控当前应用程序的健康状况和指标收集。|HTTP端点监控执行器端点允许您监控您的应用程序并与之交互。SpringBoot包含许多内置端点,并允许我们添加自己的端点。每个端点都可以启用或禁用,并通过HTTP或JMX公开(使其可远程访问)。每个端点都有一个唯一的id,可以通过以下地址访问:http:ip:port/{id}(SpringBoot1.x)。SpringBoot2.x版本默认新增/actuator作为基本路径,访问地址对应:http:ip:port/actuator/{id}。使用HTTP监控非常简单。在SpringBoot工程中,引入如下依赖:SpringBoot的基础就不介绍了。推荐这个实用教程:https://github.com/javastacks...默认可以传地址http:localhost:8080/actuator/health。访问后可以得到如下结果:SpringBoot提供了很多默认的端点监控,但是出于安全考虑,有些端点默认是不开启的,比如shutdown端点默认是关闭的。内置端点SpringBoot默认提供的常用内置端点如下:虽然这里的大部分端点都是默认开启的,但是默认只暴露health和info端点(允许外部访问),所以如果你需要允许端点暴露,可以通过Configure如下(如果要暴露所有端点,可以直接配置“*”):management:endpoints:web:exposure:include:[health,info,mappings]//或者直接配置“*”另外,启用或禁用端点也可以通过如下配置进行动态控制:management.endpoint..enabled=true接下来,我们将选择几个关键的端点进行介绍。healthendpoint健康断点默认只展示当前应用的健康信息,但是我们可以通过另外的配置开启详细的信息,这样不仅会监控当前应用,还会监控与当前应用相关的其他第三方应用,比如Redis。management:endpoint:health:show-details:always开启这个配置后,我们连接Redis,再次访问health端点,显示Redis服务的健康信息:loggers端点访问http://localhost:8080/actuato。..可以查看当前应用的日志级别等信息:这个本身没什么特别的,但是有一个功能非常好用。比如我们生产环境的日志级别一般都是info,但是现在有一个bug无法通过info级别查看,所以我们可以临时修改日志级别。比如上图中的ROOT节点是info级别,那么我们可以使用postman等工具发送post请求修改日志级别。修改后会发现日志由原来的info变成了debug:metricsendpointmetrics是一个非常重要的监控端点,其监控内容涵盖JVM内存、堆、类加载、处理器、tomcat等一些重要指标container:可以看到有很多指标,访问任意一个指标都可以查看对应的指标信息:自定义监控端点通过上面的介绍可以看出SpringBoot提供的监控是非常强大的,甚至是全面的监控是不够的。不可能满足所有人的需求,所以SpringBoot也支持自定义监控端点。自定义监控端点主要有以下常用注解:@Endpoint:定义一个监控端点,同时支持HTTP和JMX。@WebEndpoint:定义一个监控端点,只支持HTTP。@JmxEndpoint:定义一个监控端点,只支持JMX模式。以上三个注解作用于类,表示当前类是一个监控端点。另外,一些注解会用在方法和参数上:@ReadOperation:作用于方法,可用于返回端点显示的信息(通过Get方法请求)。@WriteOperation:作用于方法,可用于修改端点显示的信息(通过Post方法请求)。@DeleteOperation:作用于方法,可用于删除对应的端点信息(通过Delete方法请求)。@Selector:作用于参数,用于定位某个端点的具体指标路由。来,一起写自己的监控端点,定义一个类,并使用@Endpoint注解标记,定义几个方法用@ReadOperation和@WriteOperation注解标记:@Endpoint(id="myEndpoint")@ComponentpublicClassMyEndpoint{privateStringSTATUS="up";privateStringDETAIL="EverythingisOK";//@ReadOperation//publicStringtest1(){//return"wolf";//}//@ReadOperation//publicMaptest2(){//Mapmap=newHashMap();//map.put("status","up");//returnmap;//}@ReadOperationpublicJSONObjecttest3(){JSONObjectjsonObject=newJSONObject();jsonObject.put("状态",STATUS);jsonObject.put("细节",细节);返回jsonObject;}@ReadOperationpublicJSONObjecttest3_1(@SelectorStringname){JSONObjectjsonObject=newJSONObject();if("status".equals(name)){jsonObject.put("status",STATUS);}elseif("detail".equals(name)){jsonObject.put("detail",DETAIL);}returnjsonObject;}@WriteOperation//动态修改指标publicvoidtest4(@SelectorStringname,@NullableStringvalue){if(!StringUtils.isEmpty(value)){if("status".equals(name)){STATUS=value;}elseif("detail".equals(name)){DETAIL=value;}}}}SpringBoot的基础就不介绍了,推荐这个实用教程:https://github.com/javastacks...①@Component注解表示要交的类交给Spring进行管理,或者也可以定义一个Configuration类来加载Bean,当然如果我们需要提供给第三方,如果不能保证扫描到当前包名,就需要使用SpringBoot的自动装配机制来管理这个类②@ReadOperation方法可以返回String,JSONObject,或者Map集合等③在参数上加上@Selector注解,表示在访问断点的时候可以直接访问子节点。完成上面的类后,启动SpringBoot应用,然后就可以直接通过http://localhost:8080/actuato访问了...同时,因为test3_1方法使用了@Selector注解,我们可以通过这个方法every指标的详细信息:带有@WriteOperation注释的方法可用于修改指标。该方法需要post访问。访问的参数可以直接通过string或者json传递。修改后可以再次通过查看指标已经动态修改:|JMX监控JMX全称为JavaManagementExtensions,即Java管理扩展。它提供对Java应用程序和JVM的监视和管理。通过JMX我们可以监控服务器中各种资源的使用情况以及线程、内存和CPU的使用情况。打开jdk下提供的工具jConsole:打开后,我们启动的应用程序会在这里监听,双击进入:HowtomanuallyregisteraJMXMBean?定义一个接口SystemInfoMBean(注意名称必须以MBean结尾):publicinterfaceSystemInfoMBean{intgetCpuCore();长getTotalMemory();voidshutdown();}定义一个类来实现SystemInfoMBean接口,实现类的明显方法是接口名称RemoveMBean:publicclassSystemInfoimplementsSystemInfoMBean{@OverridepublicintgetCpuCore(){returnRuntime.getRuntime().availableProcessors();}@OverridepubliclonggetTotalMemory(){returnRuntime.getRuntime().totalMemory();}@Overridepublicvoidshutdown(){System.exit(0);}}最后,需要注册实现类:ObjectNameobjectName=newObjectName("com.lonely.wolf.note.springboot.actuator.jmx:type=SystemInfo");SystemInfoSystemInfo=newSystemInfo();mBeanServer.registerMBean(SystemInfo,objectName);//注册System.in.read();//防止程序结束}}运行main方法,然后打开jConsole可以看到已经成功注册了一个MBean:同样的,只要我们在Spring中使用@Endpoint或者@JmxEndpoint注解,它就会自动为我们注册一个MBean,原理是还要使用自动组装机制除了SpringBoot自带的监控外,还有其他第三方开源强大的监控系统,比如Prometheus,SpringBoot也集成了它,使用Prometheus时,只需要导入以下内容jar包:io.micrometermicrometer-registry-prometheus当然如果使用Prometheus的话需要单独安装,一般选择Prometheus+Grafana共同实现一个监控平台,这里就不做过多介绍了,有兴趣的可以自行了解这两款软件的使用。小结本文主要介绍了SpringBootactuator的使用,分别介绍了HTTP和JMX中的两种监控类型,最后通过一个例子来实现自定义端点,同时也实现了手动注册MBean的方法。近期热点文章推荐:1.1,000+Java面试题及答案(2022最新版)2.全球最棒!Java协程来了……3.SpringBoot2.x教程,太全面了!4.不要写爆满屏的类,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!