【279期】Spring Boot 服务监控机制,总算整明白了!
点击上方“Java精选”,选择“设为星标”
别问别人为什么,多问自己凭什么!
下方有惊喜,留言必回,有问必答!
每一天进步一点点,是成功的开始...
SpringBoot 监控
| HTTP Endpoints 监控
使用 HTTP 监控非常简单,在 SpringBoot 项目中,引入如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
默认就可以通过地址 http:localhost:8080/actuator/health,访问之后得到如下结果:
内置端点
SpringBoot 中默认提供的常用内置端点如下:
虽然说这里的大部分端点都是默认开启的,但是默认暴露(允许对外访问)的只有 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 可以查看当前应用的日志级别等信息:
比如上图中的 ROOT 节点是 info 级别,那么我们可以通过 postman 等工具来发一个 post 请求修改日志级别。
修改之后就会发现,日志由原来的 info 变成了 debug:
metrics 端点
metrics 是一个非常重要的监控端点,其监控内容覆盖了 JVM 内存、堆、类加载、处理器和 tomcat 容器等一些重要指标:
可以看到这里面包含了非常多的指标,任意访问一个指标就可以查看对应的指标信息:
自定义监控端点
@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;
// }
@ReadOperation
public JSONObject test3(){
JSONObject jsonObject= new JSONObject();
jsonObject.put("status",STATUS);
jsonObject.put("detail",DETAIL);
return jsonObject;
}
@ReadOperation
public 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;
}
}
}
}
完成了上面的类,启动 SpringBoot 应用,接下来就可以直接通过 http://localhost:8080/actuator/myEndpoint 进行访问了:
同时,因为 test3_1 方法使用了 @Selector 注解,所以我们可以通过这个方法每一个指标的明细:
而带有 @WriteOperation 注解的方法可以用来修改指标,这个方法需要用 post 进行访问,访问的参数可以直接使用字符串传参,也可以直接使用 json 进行传参,修改之后再次查看就可以发现指标已经被动态修改:
| JMX 监控
打开 jdk 下提供的工具 jConsole:
打开之后这里会监控到我们已经启动的应用,双击进入:
如何手动注册一个 JMX MBean?
定义一个接口 SystemInfoMBean(注意名字必须要用 MBean 结尾):
public interface SystemInfoMBean {
int getCpuCore();
long getTotalMemory();
void shutdown();
}
再定义一个类实现 SystemInfoMBean 接口,实现类的明明方式为接口名去掉 MBean:
public class SystemInfo implements SystemInfoMBean {
@Override
public int getCpuCore() {
return Runtime.getRuntime().availableProcessors();
}
@Override
public long getTotalMemory() {
return Runtime.getRuntime().totalMemory();
}
@Override
public 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:
除了 SpringBoot 自带的监控之外,也有其他第三方开源的强大监控系统,如 Prometheus,而且 SpringBoot 也将其进行了集成,使用 Prometheus 时只需要引入如下 jar 包即可:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
总结
作者:双子孤狼
https://blog.csdn.net/zwx900102/article/details/115446997
公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
3000+ 道面试题在线刷,最新、最全 Java 面试题!
【271期】16 个 Redis 常见使用场景,面试有内容聊啦!
【272期】使用 Jenkins 部署码云上的 Spring Boot 项目
【273期】面试官问:为什么不推荐使用 BeanUtils 属性转换工具?
【274期】Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?
【275期】从一个消费慢的例子深入理解 kafka rebalance
最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!