一、配置文件
1.1、格式
1)支持两种全局配置文件,application.properteis和application.yml(application.yaml);
2)yaml文件格式要求:大小写敏感、使用缩进代表层级关系、相同的部分只出现一次;
1.2、存放位置及加载顺序
1)当前项目根目录下的一个/config 子目录中(第一);
2)当前项目根目录中(第二);
3)项目的 resources 即 classpath 根路径下的/config 目录中(第三);
4)项目的 resources 即 classpath 根路径中(第四);
1.3、占位符${}
1)可以获取配置文件中的键的值赋给另一个键作为值;
2)可以获取框架提供的方法中的值如:random.int ;
1.4、bootstrap 配置文件
Spring Boot 中有两种上下文对象,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从 额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一 个环境,它是任何 Spring 应用程序的外部属性的来源。bootstrap 里面的属性会优先加载, 它们默认也不能被本地相同配置覆盖。
1)特征:boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载;boostrap 里面的属性不能被覆盖;
2)应用:加密/解密场景;一些固定的不能被覆盖的属性;使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
二、常见注解
2.1、核心注解
2.1.1、@SpringBootApplication
SpringBoot 的启动类注解,等同于@Configuration+@EnableAutoConfiguration+@ComponentScan 的组合;
2.1.2、@SpringBootConfiguration
是@Configuration 注解的派生注解,跟@Configuration 注解的功能一致,标注这个类是一个配置类;
@SpringBootConfiguration 是 springboot 的注解,而@Configuration 是 spring 的注解;
2.1.3、@Configuration
通过对bean对象的操作替代spring中xml文件;
2.1.4、@EnableAutoConfiguration
自动配置(auto-configuration):尝试根据你添加的 jar 依赖自动配置你的 Spring 应用;
@AutoConfigurationPackage 和@Import(AutoConfigurationImportSelector.class) 注解的组合;
2.1.5、@AutoConfigurationPackage
自动注入主类下所在包下所有的加了注解的类 (@Controller,@Service 等),以及配置类(@Configuration)
2.1.6、@Import({AutoConfigurationImportSelector.class})
导入普通的类;
导入实现了 ImportSelector 接口的类;
导入实现了 ImportBeanDefinitionRegistrar 接口的类;
2.1.7、@ComponentScan
组件扫描,可自动发现和装配一些 Bean;
2.1.8、@ConfigurationPropertiesScan
@ConfigurationPropertiesScan 扫描配置属性;
@EnableConfigurationProperties 注解的作用是使用 @ConfigurationProperties 注解的类生效;
2.2、控制层注解
2.2.1、@Controller
标识为控制类
2.2.2、@RestController
相当于@Controller+@ResponseBody 注解;
返回rest风格内容,无法跳转页面,InternalResourceViewResolver 也不起作用;
2.2.3、@GetMapping
指定为get请求,@RequestMapping(method = RequestMethod.GET)的缩写
2.2.4、@PostMapping
指定为post请求,是@RequestMapping(method = RequestMethod.POST)的缩写
2.2.5、@PutMapping
指定为put请求,@RequestMapping(method = RequestMethod.PUT)的缩写
2.2.6、@DeleteMapping
指定为delete请求,@RequestMapping(method = RequestMethod.DELETE)的缩写
三、监控检测
使用 Actuator 检查与监控服务
3.1、引入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2、访问监控服务
1)默认可访问两个/actuator监控服务(/health与/info)
2020-08-01 09:04:08.409 INFO 14660 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2020-08-01 09:04:08.478 INFO 14660 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
3.4、配置文件修改
#配置访问端点的根路径
management.endpoints.web.base-path=/actuator
# 开启指定访问端点,*表示所有
management.endpoints.web.exposure.include=*
# 屏蔽指定访问端点,如env,beans
management.endpoints.web.exposure.exclude=env,beans
3.3、常用监控指标接口
1)应用配置类:/beans、/info、/env、/env/{name}、/configprops、/mappings
2)监控指标类:/health、/dump、/trace、/metrics、/metrics/{name}
3)操作控制类:/shutdown
四、Admin使用(SBA)
4.1、简介
1)Spring Boot Admin 的使用是需要建立服务端与客户端,一个服务端可以监控多个客户端;
2)服务端:独立的项目,会将搜集到的数据在自己的图形界面中展示;
3)客户端:需要监控的项目;
4.2、服务端搭建
1)引入pom依赖
目前在 Spring Boot Admin Starter Server2.1.6 版本中不支持 Spring Boot2.2.x 版本, 只支持到 2.1.X
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.6</version>
</dependency>
2)开启启动类注解
@EnableAdminServer //开启 Spring Boot Admin 服务端
4.3、客户端搭建
1)引入pom依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.6</version>
</dependency>
2)指定服务端访问地址
#指定服务端的访问地址
spring.boot.admin.client.url=http://localhost:port
五、Logback日志
5.1、简介
1)Spring Boot 默认的日志管理组件,由 log4j 创始人设计;
2)在 spring-boot-starter 或者 spring-boot-starter-web 中已经包含了 Logback 的依赖;
5.2、Logback 读取配置文件方式
1)在 classpath 下查找文件 logback-test.xml;
2)如果文件不存在,则查找 logback.xml;
3)如果两个文件都不存在,LogBack 用 BasicConfiguration 自动对自己进行最小化配 置,这样既实现了上面我们不需要添加任何配置就可以输出到控制台日志信息;
5.3、添加logback.xml
在resources/
目录下添加logback.xml
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="d:/logback/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>
5.4、使用
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
5.5、屏蔽指定包中的日志输出
# 屏蔽org开头的包中日志
logging.level.org=off
六、打包方式
6.1、引入pom依赖
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
6.2、打包操作(idea)
Maven - 项目 - Lifecycle - install
6.3、运行
java -jar xxx.jar
七、多环境配置
1)结构
application-{profile}.properties/yml
dev环境:application-dev.properties/yml
test环境:application-test.properties/yml
prd环境:application-prod.properties/yml
2)打包启动(需要指定环境)
java -jar xxx.jar --spring.profiles.active={profile}
八、linux下脚本启动
1)使用步骤
修改脚本文件中的参数值
将启动脚本文件上传到 Linux 中
分配执行权限:chmod 777
启动命令:server.sh start
关闭命令:server.sh stop
2)脚本内容
#!/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