我们如何监控SpringBoot的健康状况,其实对于SpringBoot是很有必要去监控和检查的,
因为我们通过这个方式呢,是当前程序运行的一个状态,那我们讲监控SpringBoot健康状况的当中,会讲两种
方式,第一种是使用Actuator插件,检查SpringBoot的状态,第二种可以使用可视化的监控报表,SpringBootAdmin,
来监控我们SpringBoot的健康状况,我们先讲解第一种,使用Actuator检查与监控,在这里我们先说一下,如果SpringBoot
想用Actuator来做监控的话,来做健康检查的话,他的使用步骤是什么样的,第一步我们需要在pom文件里添加Actuator的
坐标,并且通过坐标会导入相应的坐标,在pom文件中添加Actuator的坐标,这是第一个步骤,第二个步骤,在全局配置文件中,
设置关闭安全限制,也就是默认的对于访问信息,安全限制是开启的,那么我们就没法去获取安全信息,当然这个在不同的版本
当中是有区别的,比如说我们现在,打开我们的pom文件,现在我们用的springboot用的是1.5.12.RELEASE,我没记错的话是在
1.5以下,不包括1.5,他的这个版本当中,与Actuator使用是不用关闭安全限制的,在1.5以上对于安全限制呢,他默认是开启的,
需要在配置文件当中去关闭,如果我们把上面两个步骤做完,我们就可以使用Actuator插件,SpringBoot就可以去做健康监控了,
那我们接下来就跟着这个步骤,去完成相应的操作,打开我们的pom文件,在这里我们需要添加一个坐标,这个坐标是什么呢,
我们把它copy过来,还是org.springframework.boot下的一个jar包,jar包叫什么呢,
artifactId叫spring-boot-starter-actuator,
其实这个坐标也很好记,把我们的WEB启动器,后面的WEB改成actuator就可以了,因为它是springboot的一个插件,给他的groupId
也都是相同的,这是第一步,第二步我们说过,需要去关闭安全限制,那么在哪去设置安全限制呢,在全局配置文件当中,打开我们的项目
看一下,其实我们现在没有一个全局配置文件,这些都加入了其他字符了,就不再是默认的springboot的配置文件了,那我们需要重新
创建一个全局配置文件,在这里我拷贝一个,我们新建的就是springboot全局配置文件的,他的名称叫application.properties,
在这里我们把端口号去掉,在这里我们需要加入什么呢,加入一句话
management.security.enabled=false
默认的是true,我们把它改成false,这样就关闭了安全限制,我们把这两项设好以后,接下来我们再把springboot程序启动一下,
找到启动类,运行,我们观察控制台,在这里我们看,控制台它会输出这样的信息,其实这些信息就是为我们提供了健康状况做
不同检查的URI的一个标记,比如这里我们找一个最简单的,像这个health
Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.
Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.a
Mapped "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}" onto
Mapped "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+j
Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+j
Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actua
Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot
Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1
Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1
Mapped "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+js
Mapped "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+j
Mapped "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuato
Mapped "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot
Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json |
Mapped "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+jso
/health这表示什么意思呢,在我的笔记当中已经给大家罗列出来了
对应控制台里的URI,比如我们找health,他表示什么呢,显示应用程序运行健康信息,
这是最简单的一个信息了,我们接下来就看怎么通过URI,去获取springboot的基本信息,我们把这个URI
copy一下,打开浏览器,我们在这里去访问一下,后面直接加我们拷贝的URI就可以了
localhost:8080/health
{
status: "UP",
diskSpace: {
status: "UP",
total: 104857595904,
free: 12969869312,
threshold: 10485760
}
}
这是一个JSON格式的字符串,返回给springboot的一个基本信息,这里我们来看一下,第一个status是状态,UP表示什么呢,
就是当前这个状态是正常的,就是你的springboot项目是正常运行的,然后还有一个diskSpace,就是你的磁盘空间,在磁盘空间
里呢,运行状态也是正常的,total就是你当前项目的磁盘,服务器所在的磁盘,总空间,free是剩余空间,就是可用空间,然后还有一个
threshold,这是什么呢,边界值,边界值是什么意思呢,当前你要在你的磁盘里面运行你的springboot程序,那么你的磁盘空间至少
要有10485760这么多,至少要提供10M的空间,所以这是一个边界值,所以我们通过health可以得到基本的显示,当然这里还有其他的,
再找一个比较常见的,你像这个env,这是什么呢,看环境变量的,我们拿过来,在这里我们把它访问一下
http://localhost:8080/env
这个时候的信息就会多一些,那么对于这样的信息,你会发现他也是JSON格式的了,那这个时候我们怎么办呢,当然我们也可以用工具
来做JSON格式的转换,比如我们可以找一下JSON在线解析的工具
json在线解析
https://www.sojson.com/
然后我们把信息copy一下,然后放到在线工具当中,在这里我们看一下,
profiles: [ ],
profiles现在什么都没有,所以是空的,不用管它,然后有一个
server.ports: {
local.server.port: 8080
}
当前你的程序所监听的一个端口,8080,然后还有一个
servletContextInitParams: { }
就是你上下文初始化所需要的参数,那我们这里没有相应的参数,所以是空的,然后下面就是你的系统属性systemProperties
java.runtime.name: "Java(TM) SE Runtime Environment",
sun.boot.library.path: "C:\Program Files\Java\jdk1.8.0_151\jre\bin",
java.vm.version: "25.151-b12",
user.country.format: "US",
java.vm.vendor: "Oracle Corporation",
java.vendor.url: "http://java.oracle.com/",
path.separator: ";",
java.vm.name: "Java HotSpot(TM) 64-Bit Server VM",
file.encoding.pkg: "sun.io",
user.country: "CN",
user.script: "",
sun.java.launcher: "SUN_STANDARD",
sun.os.patch.level: "",
PID: "8904",
java.vm.specification.name: "Java Virtual Machine Specification",
user.dir: "C:\JavaEE_Workspace\springboot-hello",
java.runtime.version: "1.8.0_151-b12",
java.awt.graphicsenv: "sun.awt.Win32GraphicsEnvironment",
org.jboss.logging.provider: "slf4j",
java.endorsed.dirs: "C:\Program Files\Java\jdk1.8.0_151\jre\lib\endorsed",
os.arch: "amd64",
java.io.tmpdir: "C:\Users\Leon.sun\AppData\Local\Temp\",
line.separator: " ",
java.vm.specification.vendor: "Oracle Corporation",
user.variant: "",
os.name: "Windows 8.1",
sun.jnu.encoding: "GBK",
spring.beaninfo.ignore: "true",
在这里有java.runtime.name,表示你当前JAVA虚拟机的一个版本,虚拟机的一个名称,我们用的是
Java(TM) SE Runtime Environment,然后还有你用的JDK的路径,
我们用的是C:\Program Files\Java\jdk1.8.0_151\jre\bin,然后还有当前JVM的版本,还有URL,还有分隔符,
还有VM里面核心的名称是什么,Java HotSpot(TM) 64-Bit Server VM,在这里我们可以看到跟环境变量相关的信息,
这里读的这一块就是虚拟机的一些信息,下面还有其他的配置信息,这是对env,看我们springboot环境变量的一个方式,
还有一个是什么呢,我们还可以通过/dump,来查看他的dump信息
localhost:8080/dump
其实大家对dump并不陌生吧,举个最简单的例子,我们用debug去调式的时候,在debug模式下,左侧显示线程的信息,其实就是dump里面的
一些信息,在没有springboot提供的Actuator工具的时候,如果我们想要看dump信息,其实这是一件非常麻烦的事,我们得借助JDK当中的
一些工具,通过工具才能查看dump的信息,如果感兴趣的呢,我在这里就不讲了,在JVM检查他的健康状况,就有对于dump文件的查看,然后
我们也把这个copy,在这里我们可以看到,是我们线程的信息
{
threadName: "DestroyJavaVM",
threadId: 33,
blockedTime: -1,
blockedCount: 0,
waitedTime: -1,
waitedCount: 0,
lockName: null,
lockOwnerId: -1,
lockOwnerName: null,
inNative: false,
suspended: false,
threadState: "RUNNABLE",
stackTrace: [ ],
lockedMonitors: [ ],
lockedSynchronizers: [ ],
lockInfo: null
}
ThreadId线程ID是多少,还有锁的时间,没有锁,blockedCount锁的数量,没有,还有lockName锁的名称,保持本地线程inNative,
也没有本地线程也是false,还有这个线程是否是挂起的suspended,也是false的,这些其实就是dump文件给我们输出的dump信息,
可以查看springboot在运行时的一些状况,那么至于其他的URI表示什么意思呢,就不一一讲解了,表格去看一下,你也可以去
试一下,我相信大家去读一下也是能读懂的,我们主要是讲一下Actuator的一个使用,其实相对于来说,Actuator比SpringBoot
Admin还要简单一些,毕竟他不是一个可视化的一个报表,我们主要讲一下什么是监控健康状况,怎么去监控
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>springboot-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-hello</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springBoot的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
management.security.enabled=false
package com.learn.springboothello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootHelloApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloApplication.class, args);
}
}