临时参数

临时参数和配置文件的4级分类.wmv
现在项目已经在liunx服务器上启动起来了,但是随之而来有很多问题,比如项目打包的时候定死了8080端口,但是在8080端口上我们有更加重要的程序,这个时候就可以通过临时参数去指定端口

  1. java -jar SpringBoot_08_SSMP-0.0.1-SNAPSHOT.jar --server.port=80
  2. ****************************多个属性使用空格分割*********************************
  3. java -jar SpringBoot_08_SSMP-0.0.1-SNAPSHOT.jar --server.port=80 --spring.datasource.druid.password=dongdong

image.png
这里牵扯一个问题,及我们在项目的配置文件中配置了端口,在命令行启动的时候有指定了端口,生效的是命令行,那么这里的优先级是什么呢?从上到下,优先级为从低到高,如果配置了属性之后没生效则考虑是否是优先级问题
image.png
临时属性必须是当前boot工程支持的属性,否则设置无效
问题:
如果运维加的临时属性一直不能生效,后端需要在idea环境下帮助运维人员把命令测通,那么在idea环境下怎么测试临时属性是否生效呢?请看下一章。

开发环境测试临时属性

命令行配置的临时参数,也可以通过idea指定
image.png
image.png
不管是命令行还是idea指定的临时参数,最终都要传入main函数,main函数接受到临时参数之后,交给SpringApplication.run启动生效
image.png

  1. package com.xuezhi;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import java.util.Arrays;
  5. @SpringBootApplication
  6. public class SpringBoot08SsmpApplication {
  7. public static void main(String[] args) {
  8. // 打印需在终端测试
  9. System.out.println(Arrays.toString(args));
  10. // 通过编程形式带参数启动SpringBoot程序,为程序添加运行参数
  11. String[] arg = {"--server.port=8082"};
  12. SpringApplication.run(SpringBoot08SsmpApplication.class, arg);
  13. }
  14. }

如上代码�,我们可以通过编程的形式干扰启动的参数,可能会出现安全问题,所以启动SpringBoot程序时,可以选择是否使用命令行属性为SpringBoot程序传递启动属性

  1. public static void main(String[] args) {
  2. SpringApplication.run(SpringBoot08SsmpApplication.class);
  3. }

� 这时候出现了新的问题,研发的时候配了一套配置,上线的时候经理配了一套配置,这时候需求不一样怎么办?往下看

配置文件4级分类

关于上一章问题,关于研发为了方便本机测试做了一套配置,而项目经理在上线的时候要修改这些配置,这个时候boot给我们提供了基于现有的配置之上再做一套配置的机制,这样就不用再命令行上输入那么多的临时属性了。
实现方案:在资源目录下新建config文件夹,新的配置写在config目录下即可
image.png
image.png
这两套配置一套是给程序员用的(resources目录下的配置),一套是给项目经理在程序上线的时候做总控用的(resources/config目录下的),这两套配置文件是互相合作的关系,我配了而你没配 的配置总会生效,我配了而你也配了的配置 优先级高的生效,resources/config 优先级 高于 resources

新的问题:如果项目上线之后,又想修改配置怎么办?或者说你们是外包企业给证券公司做项目,你只有开发环境的配置,一些涉密的配置不可能给你,比如证券的密码等 这个时候你又该怎么办?
解决方案:
在项目运维阶段的时候,在jar包的同级目录下会在创建一个配置文件,这个配置文件会覆盖掉与你开发阶段的冲突配置,这个配置文件是给运维人员使用的image.png
image.png

运维阶段当然还需要一个更高优先级的配置,对运维的配置做最后的总控,这个配置需要放在jar包的同级目录下的config文件夹下
image.png
image.png

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级常用于项目经理进行整体项目属性调控
项目外部配置文件 > 项目内部配置文件

如果yml与properties在不同层级中共存会是什么效果?
同级相同配置优先级高的执行,不同配置共存,也就是有冲突取优先级高的,没有冲突互相补充
同级别下 properties优先执行, 不同级别下遵循高级别的优先

自定义配置文件

自定义配置文件.wmv
配置文件默认都是application开头的,怎么修改呢?
环境准备:最好新建一个boot项目进行测试

方式1:

通过启动参数加载配置文件(无需书写配置文件扩展名) properties与yml文件格式均支持
image.png
image.png
也可以指定多个
image.png
image.png

方式2

通过启动参数加载指定文件路径下的配置文件
image.png
image.png
多个值使用逗号分开,properties与yml文件格式均支持
小结:
单服务器项目:使用自定义配置文件需求较低
多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
基于Springcloud技术,所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息

总结:

1.SpringBoot在开发和运行环境均支持使用临时参数修改工程配置
2.SpringBoot支持4级配置文件,应用于开发与线上环境进行配置的灵活设置
3.SpringBoot支持使用自定义配置文件的形式修改配置文件存储位置
4.基于微服务开发时配置文件将使用配置中心进行管理

多环境开发

单yaml配置

多环境开01.wmv
在我们自己电脑上的时候是开发环境,跑到测试哪里连的库和密码等配置肯定不一样,跑到生产环境下连的库和密码等配置又不一样,不会是你本机的了,每一种不同的环境对应的配置是有点区别的,通常我们自己开发环境图方便的配置,跑到测试环境和生产环境都会不一样。
image.png
那么我们怎么构造这种形式,保证在不同的环境下应用不同的配置

  1. #应用环境,默认环境,公共配置
  2. spring:
  3. profiles:
  4. active: pro
  5. ---
  6. #设置环境
  7. #生产环境
  8. spring:
  9. config:
  10. activate:
  11. on-profile: pro
  12. server:
  13. port: 6666
  14. ---
  15. #开发环境
  16. spring:
  17. config:
  18. activate:
  19. on-profile: dev
  20. server:
  21. port: 7777
  22. ---
  23. #测试环境
  24. spring:
  25. config:
  26. activate:
  27. on-profile: test
  28. server:
  29. port: 8888

image.png
1.多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
2.yaml格式中设置多环境使用 —- 区分环境设置边界,使用下面配置给每个环境起名字进行区分

  1. spring:
  2. config:
  3. activate:
  4. on-profile: 环境名

3.每种环境的区别在于加载的配置属性不同
4.启用某种环境时需要指定启动时使用该环境

那么现在又出现了新的问题,把多种环境都设置在一个配置文件中,对于一些涉密配置是存在安全隐患的,会暴露给多种环境的人员看到。

多文件yaml配置

多环境配置02.wmv
如上,把多种环境都设置在一个配置文件中,是存在安全隐患的,容易暴露信息,并且维护起来也不方便,接下来我们可以把文件一分为四,把每一部分信息都独立出来。
image.png
命名规则一定要是application-xxx,在主环境中通过配置文件的后缀 xxx 激活环境配置

  1. #主环境,默认环境,公共配置
  2. spring:
  3. profiles:
  4. active: dev
  1. #开发环境
  2. server:
  3. port: 6666
  1. #生产环境
  2. server:
  3. port: 7777
  1. #测试环境
  2. server:
  3. port: 8888

image.png
好处:在开发的时候我们只需要关注开发环境的配置文件即可,项目经理会把测试环境和生产环境做好,上线的时候只需要已调整就能用了 :::success 书写技巧:
主配置文件中设置公共配置(全局)
环境分类配置文件中常用于设置冲突属性(局部) :::

多文件properties配置

多环境03.wmv
和yaml的方式大同小异
image.png

  1. #应用环境,默认环境
  2. spring.profiles.active=dev
  1. #开发环境
  2. server.port= 6789
  1. #生产环境
  2. server.port= 7789
  1. #测试环境
  2. server.port= 8789

properties仅支持多文件配置

总结:

可以使用独立配置文件定义环境属性
独立配置文件便于线上系统维护更新并保障系统安全性

多环境分组管理

我们会根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
application-devDB.yml
application-devRedis.yml
application-devMVC.yml
好处:想更换配置的时候更加方便,更加细粒度的控制
以SSMP项目为例,我们可以把配置文件拆分成更细粒度的配置
image.png
image.png

  1. server:
  2. port: 8080
  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/mybatis
  5. username: root
  6. password: xzjyroot
  7. type: com.alibaba.druid.pool.DruidDataSource
  1. mybatis-plus:
  2. global-config:
  3. db-config:
  4. # 表前缀
  5. table-prefix: tbl_
  6. # 日志
  7. configuration:
  8. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔

  1. spring:
  2. profiles:
  3. active: dev
  4. include: devDB,devMP

注意观察这里的加载顺序,如果出现配置冲突,后加载的配置生效dev为主配置一直最后加载,其他配置的加载顺序取决于include的书写顺序
image.png
存在问题:如果需要切换环境,需要一个个修改include引入的配置


从SpringBoot2.4版开始使用group属性替代include属性,降低了配置书写量
使用group属性定义多种主环境与子环境的包含关系

  1. spring:
  2. profiles:
  3. active: dev
  4. group:
  5. "dev": devDB,devMP
  6. "pro": proDB,proMP
  7. "test": testDB,testMP

注意这里的小变化,这里的加载顺序,变成了dev先加载了,一定要注意哦 如果出现配置冲突,后加载的配置生效
image.png
多环境开发使用group属性设置配置文件分组,便于线上维护管理

多环境Maven+SpringBoot开发控制 -线上相似度高-

多环境除了SpringBoot中有,Maven中也有,在很多与构建相关的工具都有多环境的设定,这个时候问题就来了,加入在Maven中设定的是生产环境,在SpringBoot中设定的是开发环境,他俩冲突了,谁生效?
因为SpringBoot是依赖Maven运行的,SpringBoot工作依赖于Maven坐标的配置,所以SpringBoot是基于Maven运行的,如果两方都配,肯定Maven生效。以Maven的配置为主,SpringBoot的配置为辅。
所以我们主配Maven,让SpringBoot读取Maven的配置,就能解决冲突问题

为了更好的演示,我们再创建一下pro的环境组,这里其实不需要全部创建只需要准备好数据源的配置即可,就算是激活了pro组的环境,但是没有对应的配置文件也不会报错,但是项目启动需要依赖数据源配置,没有则会报错
所以,干脆把pro的配置文件全部创建一份,这样也更接近真实的运行环境

  1. spring:
  2. profiles:
  3. active: pro
  4. group:
  5. "dev": devDB,devMP
  6. "pro": proDB,proMP
  7. "test": testDB,testMP

把dev的配置复制一份改个名即可,毕竟是模拟不需要真正的搭建生产环境
image.png

在maven中配置多环境

  1. <!-- 配置多环境 -->
  2. <profiles>
  3. <!-- 开发环境 -->
  4. <profile>
  5. <!-- 每个环境必须要有一个id -->
  6. <id>env_dev</id>
  7. <!-- 属性 -->
  8. <properties>
  9. <!-- 属性名自定义,但要见名知意 -->
  10. <profile.active>dev</profile.active>
  11. </properties>
  12. <!-- 设置环境生效 -->
  13. <activation>
  14. <activeByDefault>true</activeByDefault>
  15. </activation>
  16. </profile>
  17. <!-- 生产环境 -->
  18. <profile>
  19. <id>env_pro</id>
  20. <properties>
  21. <profile.active>pro</profile.active>
  22. </properties>
  23. </profile>
  24. </profiles>

�在application.yml中引用maven中的环境配置,在yml使用@xxx@可以引用maven中的变量和自定义的环境属性
其实就是properties中自定义的属性,如果报错 就加上引号 “@xxx@”

  1. spring:
  2. profiles:
  3. active: "@profile.active@"
  4. group:
  5. "dev": devDB,devMP
  6. "pro": proDB,proMP
  7. "test": testDB,testMP

执行maven的clean,然后package,找到包文件,解压之后查看application.yml中的变量是否引用成功
image.png
image.png

springboot中的@profile.active@ 不生效 解决方案

生效前提有两种方式
第一种是使用的是spring-boot官方parent,这样parent里已经设置好了资源目录,如:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.7.11.RELEASE</version>
  5. <relativePath /> <!-- lookup parent from repository -->
  6. </parent>

第二种就是未使用官方parent,需要手动设置一下资源目录,filtering=true是让资源文件解析变量

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <filtering>true</filtering>
  5. </resource>
  6. </resources>

maven 多环境命令

  1. 【命令】:
  2. mvn 指令 -D skipTests P 环境定义id
  3. 【范例】:
  4. mvn install -D skipTests P pro_env