SpringBoot运维实用篇

149 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情


⭐️前面的话⭐️

✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee


1 配置高级

  • 带属性参数启动 SpringBoot(携带多个属性启动 SpringBoot,属性间使用空格分隔)属性加载优先顺序

(1)命令行

java –jar springboot.jar –-server.port=80

(2)IDEA 中配置

(3)通过编程形式带参数启动 SpringBoot程序,为程序添加运行参数

public static void main(String[] args) {
    // 添加参数
    String[] arg = new String[1];
    arg[0] = "--server.port=8080";
    
    SpringApplication.run(SSMPApplication.class, arg);
}
  • 配置文件分类
# SpringBoot中4级配置文件
1. file :config/application.yml 【最高】(运维组长整体调控,副行长类似)(工程路径config目录中配置文件)
2. file :application.yml(运维人员 配置涉密线上环境)(工程路径配置文件)
3. classpath:config/application.yml(开发经理整体调控)(项目类路径config目录中配置文件)
4. classpath:application.yml 【最低】(程序员本机开发与测试👨🏻‍💻)(项目类路径配置文件)

# 如果yml与properties在不同层级中共存会是什么效果?
类路径application.properties属性是否覆盖文件系统config目录中application.yml属性

# 多层级配置文件间的属性采用叠加并覆盖的形式作用于程序
  • 配置文件加载
    • 通过启动参数加载配置文件(无需书写配置文件扩展名)
    • 通过启动参数加载指定文件路径下的配置文件(可以加载多个)
    • 多配置文件常用于将配置进行分类,进行独立管理,或将可选配置单独制作便于上线更新维护

2 多环境开发

  • 多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
    • 每种环境的区别在于加载的配置属性不同
    • 指定启动时使用某种环境

YAML

Properties

  • 配置文件书写
    • 主配置文件中设置公共配置(全局)
    • 环境分类配置文件中常用于设置冲突属性(局部)
  • 配置文件可拆分:可以根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,如下
application-devDB.yml
application-devRedis.yml
application-devMVC.yml
  • include 属性:在激活指定环境的情况下,使用 include 属性同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:
  profiles:
    active: dev
    include: devDB,devRedis,devMVC
  • 其它说明
    • 当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
    • 从 Spring2.4 版开始使用 group 属性替代 include 属性,降低了配置书写量,使用 group属性定义多种主环境与子环境的包含关系。多环境开发使用 group 属性设置配置文件分组,便于线上维护管理。
spring:
  profiles:
    active: dev
    group:
      "dev": devDB,devRedis,devMVC
      "pro": proDB,proRedis,proMVC
      "test": testDB,testRedis,testMVC

2.1 Maven 与 SpringBoot多环境兼容

  • 两者同时对多环境进行控制时,以Mavn为主。SpringBoot使用@xxx@占位符读取Maven对应的配置属性值,pom.xml 每次更新需要手动 compile 方可生效。

3 日志

3.1 日志基础

日志作用

  • 编程期调试代码
  • 运行期记录信息
    • 记录日常运营重要信息(峰值流量、平均响应时长……)
    • 记录应用报错信息(错误堆栈)
    • 记录运维过程数据(扩容、宕机、报警……)

代码中使用日志工具记录日志

①:添加日志记录操作

@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
  • 总结一下
    • 日志用于记录开发调试与运维过程消息
    • 日志的级别共6种,通常使用4种即可,分别是 DEBUG,INFO, WARN, ERROR
    • 可以通过日志组代码包的形式进行日志显示级别的控制

@Slf4j 注解优化日志对象创建

  • 基于lombok提供的 @Slf4j 注解为类快速添加日志对象
@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..."; 
    }
}

3.2 日志输出格式控制

# 说明
PID:进程ID,用于表明当前操作所处的进程,当多服务同时记录日志时,该值可用于协助程序员调试程序

所属类/接口名:当前显示信息为SpringBoot重写后的信息,名称过长时,简化包名书写为首字母,甚至直接删除

# 设置日志输出格式
%d:日期
%m:消息
%n:换行

如下

logging:
  pattern:
    console: "%d - %m%n"
    
logging:
  pattern:
    console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"   

3.3 日志文件配置

  • 设置日志记录到文件&&日志文件详细配置
logging:
  file:
    name: server.log
  logback:
    rollingpolicy:
      max-file-size: 3KB  # 单文件最大值
      file-name-pattern: server.%d{yyyy-MM-dd}.%i.log  # 文件名