写在前面:本博客主要是记录在学习黑马视频中遇到的问题和一些所思所想,日后忘记了,方便回顾查阅,后续遇到新的知识还会继续进行补充。本系列一共分四篇博客记录,分别是基础篇、运维实用篇、开发实用篇、原理篇。
目录
1. 打包与运行
1.1 程序打包与运行(windows版)
1.SpringBoot项目快速启动
①:对SpringBoot项目打包(执行maven构建指令package)
mvn package
②: 运行项目(执行启动指令)
java -jar springboot.jar
ps:打jar包时,可以用这个跳过不想要的执行过程,例如test。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果没有使用上述的插件支持,则打出来的jar包运行会报错:
- Windonws端口被占用
# 查询端口netstat -ano# 查询指定端口netstat -ano |findstr " 端口号 "# 根据进程 PID 查询进程名称tasklist |findstr " 进程 PID 号 "# 根据 PID 杀死任务taskkill /F /PID " 进程 PID 号 "# 根据进程名称杀死任务taskkill -f -t -im " 进程名称 "
1.2 程序运行(Linux版)
- 基于Linux(CenterOS7)
- 安装JDK,且版本不低于打包时使用的JDK版本
- 安装包保存在/usr/local/自定义目录中或$HOME下
- 其他操作参照Windows版进行
2. 配置高级
2.1 临时属性设置
- 带属性数启动SpringBoot
java –jar springboot.jar –-server.port=80
- 携带多个属性启动SpringBoot,属性间使用空格分隔
1. 属性加载优先顺序
2. 临时属性设置(开发环境)
- 带属性启动SpringBoot程序,为程序添加运行属性
- 通过编程形式带参数启动SpringBoot程序,为程序添加运行参数
public static void main(String[] args) {
String[] arg = new String[1];
arg[0] = "--server.port=8080";
SpringApplication.run(SSMPApplication.class, arg);
}
- 不携带参数启动SpringBoot程序
public static void main(String[] args) {
SpringApplication.run(SSMPApplication.class);
}
ps:
- 这里的args打印输出,其实就是外部追加的参数信息
- 不携带参数args可以保护程序的安全性,这样就不能通过外部命令行的形式设置参数信息了。
- 这里的主要目的是为运维人员测试命名是否可用。
2.2 配置文件分类
场景:真实开发中研发人员配置的信息和运维经理配置的信息不一致,此时就需要配置多套配置文件,方便切换。
1. SpringBoot中4级配置文件
1级: file :config/application.yml【最高】
2级: file :application.yml
3级:classpath:config/application.yml
4级:classpath:application.yml 【最低】
- 1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控
- 3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
- 配置文件分为4种
- 项目类路径配置文件:服务于开发人员本机开发与测试
- 项目类路径config目录中配置文件:服务于项目经理整体调控
- 工程路径配置文件:服务于运维人员配置涉密线上环境
- 工程路径config目录中配置文件:服务于运维经理整体调控
- 多层级配置文件间的属性采用叠加并覆盖的形式作用于程序
- .properties文件优先级 > yml 文件优先级
2.3 自定义配置文件
1. 通过启动参数加载配置文件(无需书写配置文件扩展名)
- properties与yml文件格式均支持
3. 通过启动参数加载指定文件路径下的配置文件时可以加载多个配置
- 多配置文件常用于将配置进行分类,进行独立管理,或将可选配置单独制作便于上线更新维护
4. 注意:
- 单服务器项目:使用自定义配置文件需求较低
- 多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
- 基于SpringCloud技术,所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
3. 多环境开发
3.1 多环境开发(YAML版)
1. 实际开发中有多个环境,有生产环境、开发环境、测试环境等等。
2. 在yml文件中可以通过 三个杠(---)来区分各个环境配置:
- 第一个配置区域一般为默认配置,配置公共部分和选用哪个配置部分
- 除公共配置部分,其他配置部分需要进行命名,以便调用。
3. profiles命名格式已经过时,现在已被on-profile取代。
4. 上述配置缺点:
- 配置都在一个文件中,暴露配置
- 调用修改不便
5. 将各个区域按照application-命名.yml形式进行文件化
优点:独立配置文件便于线上系统维护更新并保障系统安全性
6. 技巧
- 主配置文件中设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
3.2 多环境开发(Properties版)
1. properties文件多环境配置仅支持多文件格式(没有合并单一文件版本)
2. 技巧
- 根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
- 使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:
profiles:
active: dev
include: devDB,devRedis,devMVC
ps: 当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
3. 上述模式的缺点:
- 当active换的时候,include内容页都要换,不方便
4. 使用group属性(常用)
- 从Spring2.4版开始使用group属性替代include属性,降低了配置书写量
- 使用group属性定义多种主环境与子环境的包含关系
spring:
profiles:
active: dev
group:
"dev": devDB,devRedis,devMVC
"pro": proDB,proRedis,proMVC
"test": testDB,testRedis,testMVC
3.3 多环境开发控制
场景:maven和spring两个的profile冲突了,应该运行谁的?到底是maven依赖springboot还是springboot依赖maven运行的呢?
说明:maven在前运行,springboot基于maven运行。所以以maven的配置为主,springboot的配置为辅。
1. Maven与SpringBoot多环境兼容
①:Maven中设置多环境属性
②:SpringBoot中引用Maven属性
③:执行Maven打包指令,并在生成的boot打包文件.jar文件中查看对应信息
2. IDEA工具存在的BUG(2021版本一下的可能存在)
将 activeByDefault 切换到其他的环境中后,发现idea仍然运行原来的环境。这时候即使clean也解决不了问题,而应该使用生命周期中的 compile。
<activation>
<activeByDefault>true</activeByDefault>
</activation>
3.注意:
- 当Maven与SpringBoot同时对多环境进行控制时,以Mavn为主, SpringBoot使用@..@占位符读取Maven对应的配置属性值 。
- 基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试 工程时pom.xml每次更新需要手动compile方可生效。
4. 日志
4.1 日志基础
1. 日志(log)作用
-
编程期调试代码
-
运营期记录信息
-
记录日常运营重要信息(峰值流量、平均响应时长……)记录应用报错信息(错误堆栈)记录运维过程数据(扩容、宕机、报警……)
-
2. 代码中使用日志工具记录日志
①:添加日志记录操作
@RestController
@RequestMapping("/books")
public class BookController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(BookController.class);
@GetMapping
public String getById(){
System.out.println("springboot is running...");
log.debug("debug ...");
log.info("info ...");
log.warn("warn ...");
log.error("error ...");
return "springboot is running...";
}
}
- 日志级别
- TRACE:运行堆栈信息,使用率低
- DEBUG:程序员调试代码使用
- INFO:记录运维过程数据
- WARN:记录运维过程报警数据
- ERROR:记录错误堆栈信息
- FATAL:灾难信息,合并计入ERROR
# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug: true
# 设置日志级别,root表示根节点,即整体应用日志级别
logging:
level:
root: debug
logging:
# 设置日志组
group:
# 自定义组名,设置当前组中所包含的包
ebank: com.itheima.controller
level:
root: warn
# 为对应组设置日志级别
ebank: debug
# 为对包设置日志级别
com.itheima.controller: debug
3. 优化日志对象创建代码
使用lombok提供的注解@Slf4j简化开发,减少日志对象的声明操作。即可代替下述代码:
private static final Logger log = LoggerFactory.getLogger(BookController.class);
@Slf4j
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("springboot is running...");
log.debug("debug info...");
log.info("info info...");
log.warn("warn info...");
log.error("error info...");
return "springboot is running...";
}
}
4.2 日志输出格式控制
- PID:进程ID,用于表明当前操作所处的进程,当多服务同时记录日志时,该值可用于协助程序员调试程序
- 所属类/接口名:当前显示信息为SpringBoot重写后的信息,名称过长时,简化包名书写为首字母,甚至直接删除
1. 设置日志输出格式
logging:
pattern:
console: "%d - %m%n"
- %d:日期
- %m:消息
- %n:换行
logging:
pattern:
console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
- %c : 类名
- clr() : 颜色
- 默认右对齐,加 - 号为左对齐
-
%-40.40c后面的.40是控制内容的截取
-
{cyan} 设置颜色
4.3 日志文件
1. 设置日志文件
logging:
file:
name: server.log
2. 日志文件详细配置
logging:
file:
name: server.log
logback:
rollingpolicy:
max-file-size: 3KB
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log
ps:日志文件超过自己设定的值就自动分文件记录。这里上一个文件和下一个文件靠%i来区别。