一、Spring Boot 度量指标监控与健康检查
1.使用 Actuator 检查与监控
[1]创建项目
[2]需改 POM 文件,添加依赖
<!--添加actuator启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
[3]修改配置文件
application.properties
#配置访问端点的根路径
management.endpoints.web.base-path=/actuator
#配置开启其他端点的 URI
#开启所有的端点访问:*
#指定开启端点访问:如:beans,env
management.endpoints.web.exposure.include=*
#指定排除某个端点,一般是已经开启了所有访问端点才会排除
#management.endpoints.web.exposure.exclude=
当我们访问某个端点时,会响应出json数据。但是这些数据过长,我们就需要借助于第三方项目 spring boot admin来将这些json数据可视化
[4]各项监控指标接口 URL 介绍
应用配置类
度量指标类
二、使用可视化监控应用 Spring Boot Admin
Spring Boot Admin 的使用是需要建立服务端与客户端。
服务端:独立的项目,会将搜集到的数据在自己的图形界面中展示。
客户端:需要监控的项目。
对应关系:一个服务端可以监控多个客户端。
1.搭建服务端
[1] 创建项目
应为目前Spring Boot Admin只支持到springboot2.2.3版本。所以选择一个2.3以下的版本。
Spring Boot Admin是一个网页项目,因此添加web启动器
[2]修改pom文件
选择和项目对应的版本,添加到pom文件依赖中
<!-- https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-server -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>
[3]修改端口号
应为要同时开启服务端和客户端,防止端口号占用,因此需要修改端口号
server.port=9090
[4]修改启动类
添加@EnableAdminServer接口
@SpringBootApplication
@EnableAdminServer //开启 Spring Boot Admin 服务端
public class SpringbootactuatorserverApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootactuatorserverApplication.class, args);
}
}
访问服务端主页
2.搭建客户端
客户端就是被监控的项目,环境是基于一、Spring Boot 度量指标监控与健康检查的基础之上。
[1]修改 POM 文件
去maven仓库搜索spring boot client starter,选择和服务端对应的版本。
修改客户端pom文件添加依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.4</version>
</dependency>
[2]修改配置文件
#配置访问端点的根路径
management.endpoints.web.base-path=/actuator
#配置开启其他端点的 URI
#开启所有的端点访问:*
#指定开启端点访问:如:beans,env
management.endpoints.web.exposure.include=*
#指定排除某个端点,一般是已经开启了所有访问端点才会排除
#management.endpoints.web.exposure.exclude=
#配置springboot admin服务端url
spring.boot.admin.client.url=http://localhost:9090
效果图
启动客户端项目
三、Spring Boot 的日志管理
Spring Boot 默认使用 Logback 组件作为日志管理。Logback 是由 log4j 创始人设计的一个开源日志组件。
在 Spring Boot 项目中我们不需要额外的添加 Logback 的依赖,因为在 spring-boot-starter或者 spring-boot-starter-web 中已经包含了 Logback 的依赖。
1.Logback 读取配置文件的步骤
(1)在 classpath 下查找文件 logback-test.xml
(2)如果文件不存在,则查找 logback.xml
(3)如果两个文件都不存在,LogBack 用 BasicConfiguration 自动对自己进行最小化配置,这样既实现了上面我们不需要添加任何配置就可以输出到控制台日志信息。
2.添加 Logback 配置文件
3.配置 Logback
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.base}/logs/" />
<!-- 控制台输出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="Stdout" />
<appender-ref ref="RollingFile" />
</root>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
日志异步到数据库
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
连接池
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>
4. 在代码中使用 Logback
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("logback")
public class HelloController {
private static final Logger log= LoggerFactory.getLogger(HelloController.class);
@RequestMapping("showlog")
public String showLog(){
log.info("记录日志");
return "Hello Back";
}
}
查看控制台
同时会在项目的根路径下打印生成log文件
5.在配置文件中屏蔽指定包的日志记录
#屏蔽指定包中的日志输出 指定org下的日志不输出
logging.level.org=off
重启项目后,查看控制台日志
四、Spring Boot 项目打包与多环境配置
1.Spring Boot 项目打包
[1]Spring Boot 的打包插件
如果是从spring 官网下载的项目或者是用idea手脚架工具创建的项目,则pom文件本身会包含这个。如果是从maven中添加的springboot启动器依赖,就要看看pom文件在是不是加了spring boot 打包插件了。
如果没有打包插件的话,也能打包,但是项目中没有关于spring 的jar包,因此项目在启动时会出错。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
[2]项目打包方式
打包完成后,可以在项目的target目录下找到该jar包
[3]运行命令
注意:需要正确的配置环境变量。
运行命令:java -jar 项目的名称(在该项目所在的路径下执行该命令)
也可以双击运行。
在浏览器访问该项目
我们可以ctrl+shift+esc打开任务管理器,然后结束该进程
结束进程后,刷新网页
2. springboot多环境配置
创建多个properties文件,命名方式以application-profile.properties
profile:dev: 开发环境、prod:生产环境、test:测试环境
分别给三个properties文件赋值,dev:server.port=9999、prod:server.port=8787、test:server.port=8848
在application.properties文件中,指定使用的配置文件
spring.profiles.active=test
项目启动后,tomcat端口号则为test中配置的端口号8848
[1] 在Windows 环境下指定配置文件启动方式
java -jar 项目名.jar --spring.profiles.active={profile}
如启动以dev方式启动(打包好的项目jar包放在了d盘根目录下)
[2]在linux下的启动方式
安装上传下载工具
安装命令:yum install lrzsz -y
上传命令:rz
下载命令:sz 下载文件名
启动脚本:server.sh
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
JAR_NAME="项目名称"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
#如果是多环境配置需要在该选项中指定profile
SPRING_PROFILES_ACTIV="-Dspring.profiles.active=配置文件profile名称"
#如果没有多环境配置将 SPRING_PROFILES_ACTIV注释掉,将SPRING_PROFILES_ACTIV=""取消注释
#SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%..log
echo_help()
{
echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
if [ -z $1 ];then
echo_help
exit 1
fi
if [ ! -d "$LOG_DIR" ];then
mkdir "$LOG_DIR"
fi
if [ ! -f "$LOG_PATH" ];then
touch "$LOG_DIR"
fi
if [ "$1" == "start" ];then
# check server
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
exit 1
fi
echo "Starting the $JAR_NAME..."
# start
nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
echo "${JAR_NAME} Started and the PID is ${PIDS}."
echo "You can check the log file in ${LOG_PATH} for details."
elif [ "$1" == "stop" ];then
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR:The $JAR_NAME does not started!"
exit 1
fi
echo -e "Stopping the $JAR_NAME..."
for PID in $PIDS; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps --no-heading -p $PID`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
echo_help
exit 1
fi
在运行时,我们需要根据实际需要修改该脚本内容
启动脚本的使用
(1)修改脚本文件中的参数值
复制jar包名称
粘贴到server.sh中
(2)将启动脚本文件上传到 Linux 中
(3)分配执行权限:chmod 777
(4)通过脚本启动命令:server.sh start
(5)通过脚本关闭命令:server.sh stop
访问项目
关闭项目