运维篇
1.SpringBoot程序的打包与运行
1.1程序打包
-
SpringBoot程序是基于Maven创建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea环境下执行。
mvn package
-
打包后会产生一个与工程名类似的jar文件,其名称是由模块名+版本号+.jar组成的。
1.2程序运行
-
程序包打好以后,就可以直接执行了。在程序包所在路径下,执行指令。
java -jar 工程包名.jar
-
执行程序打包指令后,程序正常运行,与在Idea下执行程序没有区别。
-
注意事项
-
如果计算机中没有安装java的jdk环境,是无法正确执行上述操作的,因为程序执行使用的是java指令。
-
在使用向导创建SpringBoot工程时,pom.xml文件中会有如下配置,这一段配置千万不能删除,否则打包后无法正常执行程序。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
1.3命令行启动常见问题
-
常用DOS命令
# 查询端口 netstat -ano # 查询指定端口 netstat -ano |findstr "端口号" # 根据进程PID查询进程名称 tasklist |findstr "进程PID号" # 根据PID杀死任务 taskkill /F /PID "进程PID号" # 根据进程名称杀死任务 taskkill -f -t -im "进程名称"
-
常见问题→遇到再说
2.高级配置
2.1临时属性设置
-
SpringBoot提供了灵活的配置方式,如果发现你的项目中有个别属性需要重新配置,可以使用临时属性的方式快速修改某些配置。
java –jar springboot.jar –-server.port=80 /** java –jar springboot.jar是启动springboot程序的命令 输入完之后空一格,两个--号,下面按照属性名=属性值的形式添加对应参数就可以了 这里的书写格式为properties的 如果要修改多个属性,继续在后面加上空格和两个--号作为分隔即可 java –jar springboot.jar –-server.port=80 --logging.level.root=debug **/
①属性加载优先级
- 不管这个顺序是怎么个高低排序,开发时一定要配置成自己要的顺序为准。这个顺序只是在自己想不明白问题的时候帮助自己分析而已。
- 比如你\现在加载了一个user.name属性。结果发现出来的结果和想的不一样,那肯定是别的优先级比现在高的属性覆盖你的配置属性了,那就可以看着这个顺序挨个排查。哪个位置有可能覆盖了属性。
②开发环境中使用临时属性
- 打开SpringBoot引导类的运行界面,在里面找到配置项。其中Program arguments对应的位置就是添加临时属性的
2.2配置文件分类
-
配置文件分为4种
- 项目类路径配置文件:服务于开发人员本机开发与测试
- 项目类路径config目录中配置文件:服务于项目经理整体调控
- 工程路径配置文件:服务于运维人员配置涉密线上环境
- 工程路径config目录中配置文件:服务于运维经理整体调控
-
多层级配置文件间的属性采用叠加并覆盖的形式作用于程序
2.3自定义配置文件
-
方式1:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名
-
方式2:使用临时属性设置配置文件路径,这个是全路径名
-
设置加载多个配置文件
使用的属性一个是spring.config.name,另一个是spring.config.location,这个要区别清楚。
3.多环境开发
什么是多环境? 其实就是你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样,这就是多环境。常见的多环境开发主要兼顾3种环境设置,开发环境——自己用的,测试环境——自己公司用的,生产环境——甲方爸爸用的。因为这是绝对不同的三台电脑,所以环境肯定有所不同,比如连接的数据库不一样,设置的访问端口不一样等等。
3.1多环境开发(yaml单一文件版)
-
那什么是多环境开发?就是针对不同的环境设置不同的配置属性即可。比如你自己开发时,配置你的端口如下
server: port: 80
-
设计两组环境呢
server: port: 80 --- #中间使用三个减号分隔开 server: port: 81
-
给环境起名字
spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
-
设置默认启动
spring: profiles: active: pro # 启动pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
-
其中关于环境名称定义上述格式是过时格式,标准格式如下
spring: config: activate: on-profile: pro
3.2多环境开发(yaml多文件版)
将所有的配置都放在一个配置文件中,尤其是每一个配置应用场景都不一样,这显然不合理,于是就有了将一个配置文件拆分成多个配置文件的想法。拆分后,每个配置文件中写自己的配置,主配置文件中写清楚用哪一个配置文件就好了。
-
主配置文件
spring: profiles: active: pro # 启动pro
-
环境配置文件
server: port: 80
-
使用文件名区分环境配置文件
-
application-pro.yaml
server: port: 80
-
application-dev.yaml
server: port: 81
-
文件的命名规则为:application-环境名.yml
-
-
在配置文件中,如果某些配置项所有环境都一样,可以将这些项写入到主配置中,只有哪些有区别的项才写入到环境配置文件中。
- 主配置文件中设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
3.3多环境开发(properties多文件版)
SpringBoot最早期提供的配置文件格式是properties格式的,这种格式的多环境配置也了解一下吧。
-
主配置文件
spring.profiles.active=pro
-
环境配置文件
-
application-pro.properties
server.port=80
-
application-dev.properties
server.port=81
-
文件的命名规则为:application-环境名.properties
-
3.4多环境开发独立配置文件书写技巧
-
准备工作
- 将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
- 将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
-
使用
-
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring: profiles: active: dev include: devDB,devRedis,devMVC
-
-
注意
- 当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
-
优化
-
但是上面的设置也有一个问题,比如我要切换dev环境为pro时,include也要修改。
-
因为include属性只能使用一次,这就比较麻烦了。SpringBoot从2.4版开始使用group属性替代include属性,降低了配置书写量。简单说就是我先写好,你爱用哪个用哪个
spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
-
3.5多环境开发控制
-
当Maven与SpringBoot同时对多环境进行控制时,以Mavn为主,SpringBoot使用@..@占位符读取Maven对应的配置属性值
-
maven中设置多环境(使用属性方式区分环境)
<profiles> <profile> <id>env_dev</id> <properties> <profile.active>dev</profile.active> </properties> <activation> <activeByDefault>true</activeByDefault> <!--默认启动环境--> </activation> </profile> <profile> <id>env_pro</id> <properties> <profile.active>pro</profile.active> </properties> </profile> </profiles>
-
SpringBoot中读取maven设置值
spring: profiles: active: @profile.active@
-
上面的@属性名@就是读取maven中配置的属性值的语法格式。
-
-
基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时pom.xml每次更新需要手动compile方可生效
4.日志
- 日志其实就是记录程序日常运行的信息,主要作用
- 编程期调试代码
- 运营期记录信息
- 记录日常运营重要信息(峰值流量、平均响应时长……)
- 记录应用报错信息(错误堆栈)
- 记录运维过程数据(扩容、宕机、报警……)
4.1代码中使用日志工具记录日志
-
添加日志记录操作
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ //log对象用来记录日志的对象 private static final Logger log = LoggerFactory.getLogger(BookController.class); @GetMapping public String getById(){ //log.debug等操作就是写日志的API log.debug("debug..."); log.info("info..."); log.warn("warn..."); log.error("error..."); return "springboot is running...2"; } }
-
设置日志输出级别
-
日志设置好以后可以根据设置选择哪些参与记录。这里是根据日志的级别来设置的。日志的级别分为6种
- TRACE:运行堆栈信息,使用率低
- DEBUG:程序员调试代码使用
- INFO:记录运维过程数据
- WARN:记录运维过程报警数据
- ERROR:记录错误堆栈信息
- FATAL:灾难信息,合并计入ERROR
-
一般情况下,开发时候使用DEBUG,上线后使用INFO,运维信息记录使用WARN即可
# 开启debug模式,输出调试信息,常用于检查系统运行状况 debug: true # 设置日志级别,root表示根节点,即整体应用日志级别 logging: level: root: debug
-
-
设置日志组,控制指定包对应的日志输出级别,也可以直接控制指定包对应的日志输出级别
logging: # 设置日志组 group: # 自定义组名,设置当前组中所包含的包 ebank: com.itheima.controller level: root: warn # 为对应组设置日志级别 ebank: debug # 为对包设置日志级别 com.itheima.controller: debug
4.2优化日志对象创建代码
-
写代码的时候每个类都要写创建日志记录对象,这个可以优化一下,使用前面用过的lombok技术给我们提供的工具类即可。
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //这一句可以不写了 }
-
导入lombok后使用注解搞定,日志对象名为log
@Slf4j //这个注解替代了下面那一行 @RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //这一句可以不写了 }
4.3日志文件
-
记录日志到文件中格式非常简单,设置日志文件名即可。
logging: file: name: server.log
-
面对线上的复杂情况,一个文件记录是不能够满足运维要求的,通常会每天记录日志文件,同时为了便于维护,还要限制每个日志文件的大小
#日志文件的常用配置方式 logging: logback: rollingpolicy: #要求容量到达3KB以后就转存信息到第二个文件中 max-file-size: 3KB #%d标识日期,%i是一个递增变量,用于区分日志文件。 file-name-pattern: server.%d{yyyy-MM-dd}.%i.log