临时参数
临时参数和配置文件的4级分类.wmv
现在项目已经在liunx服务器上启动起来了,但是随之而来有很多问题,比如项目打包的时候定死了8080端口,但是在8080端口上我们有更加重要的程序,这个时候就可以通过临时参数去指定端口
java -jar SpringBoot_08_SSMP-0.0.1-SNAPSHOT.jar --server.port=80
****************************多个属性使用空格分割*********************************
java -jar SpringBoot_08_SSMP-0.0.1-SNAPSHOT.jar --server.port=80 --spring.datasource.druid.password=dongdong
这里牵扯一个问题,及我们在项目的配置文件中配置了端口,在命令行启动的时候有指定了端口,生效的是命令行,那么这里的优先级是什么呢?从上到下,优先级为从低到高,如果配置了属性之后没生效则考虑是否是优先级问题
临时属性必须是当前boot工程支持的属性,否则设置无效
问题:
如果运维加的临时属性一直不能生效,后端需要在idea环境下帮助运维人员把命令测通,那么在idea环境下怎么测试临时属性是否生效呢?请看下一章。
开发环境测试临时属性
命令行配置的临时参数,也可以通过idea指定
不管是命令行还是idea指定的临时参数,最终都要传入main函数,main函数接受到临时参数之后,交给SpringApplication.run启动生效
package com.xuezhi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Arrays;
@SpringBootApplication
public class SpringBoot08SsmpApplication {
public static void main(String[] args) {
// 打印需在终端测试
System.out.println(Arrays.toString(args));
// 通过编程形式带参数启动SpringBoot程序,为程序添加运行参数
String[] arg = {"--server.port=8082"};
SpringApplication.run(SpringBoot08SsmpApplication.class, arg);
}
}
如上代码�,我们可以通过编程的形式干扰启动的参数,可能会出现安全问题,所以启动SpringBoot程序时,可以选择是否使用命令行属性为SpringBoot程序传递启动属性
public static void main(String[] args) {
SpringApplication.run(SpringBoot08SsmpApplication.class);
}
� 这时候出现了新的问题,研发的时候配了一套配置,上线的时候经理配了一套配置,这时候需求不一样怎么办?往下看
配置文件4级分类
关于上一章问题,关于研发为了方便本机测试做了一套配置,而项目经理在上线的时候要修改这些配置,这个时候boot给我们提供了基于现有的配置之上再做一套配置的机制,这样就不用再命令行上输入那么多的临时属性了。
实现方案:在资源目录下新建config文件夹,新的配置写在config目录下即可
这两套配置一套是给程序员用的(resources目录下的配置),一套是给项目经理在程序上线的时候做总控用的(resources/config目录下的),这两套配置文件是互相合作的关系,我配了而你没配 的配置总会生效,我配了而你也配了的配置 优先级高的生效,resources/config 优先级 高于 resources
新的问题:如果项目上线之后,又想修改配置怎么办?或者说你们是外包企业给证券公司做项目,你只有开发环境的配置,一些涉密的配置不可能给你,比如证券的密码等 这个时候你又该怎么办?
解决方案:
在项目运维阶段的时候,在jar包的同级目录下会在创建一个配置文件,这个配置文件会覆盖掉与你开发阶段的冲突配置,这个配置文件是给运维人员使用的
运维阶段当然还需要一个更高优先级的配置,对运维的配置做最后的总控,这个配置需要放在jar包的同级目录下的config文件夹下
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文件格式均支持
也可以指定多个
方式2
通过启动参数加载指定文件路径下的配置文件
多个值使用逗号分开,properties与yml文件格式均支持
小结:
单服务器项目:使用自定义配置文件需求较低
多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
基于Springcloud技术,所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
总结:
1.SpringBoot在开发和运行环境均支持使用临时参数修改工程配置
2.SpringBoot支持4级配置文件,应用于开发与线上环境进行配置的灵活设置
3.SpringBoot支持使用自定义配置文件的形式修改配置文件存储位置
4.基于微服务开发时配置文件将使用配置中心进行管理
多环境开发
单yaml配置
多环境开01.wmv
在我们自己电脑上的时候是开发环境,跑到测试哪里连的库和密码等配置肯定不一样,跑到生产环境下连的库和密码等配置又不一样,不会是你本机的了,每一种不同的环境对应的配置是有点区别的,通常我们自己开发环境图方便的配置,跑到测试环境和生产环境都会不一样。
那么我们怎么构造这种形式,保证在不同的环境下应用不同的配置
#应用环境,默认环境,公共配置
spring:
profiles:
active: pro
---
#设置环境
#生产环境
spring:
config:
activate:
on-profile: pro
server:
port: 6666
---
#开发环境
spring:
config:
activate:
on-profile: dev
server:
port: 7777
---
#测试环境
spring:
config:
activate:
on-profile: test
server:
port: 8888
�
1.多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
2.yaml格式中设置多环境使用 —- 区分环境设置边界,使用下面配置给每个环境起名字进行区分
spring:
config:
activate:
on-profile: 环境名
3.每种环境的区别在于加载的配置属性不同
4.启用某种环境时需要指定启动时使用该环境
那么现在又出现了新的问题,把多种环境都设置在一个配置文件中,对于一些涉密配置是存在安全隐患的,会暴露给多种环境的人员看到。
多文件yaml配置
多环境配置02.wmv
如上,把多种环境都设置在一个配置文件中,是存在安全隐患的,容易暴露信息,并且维护起来也不方便,接下来我们可以把文件一分为四,把每一部分信息都独立出来。
命名规则一定要是application-xxx,在主环境中通过配置文件的后缀 xxx 激活环境配置
#主环境,默认环境,公共配置
spring:
profiles:
active: dev
#开发环境
server:
port: 6666
#生产环境
server:
port: 7777
#测试环境
server:
port: 8888
好处:在开发的时候我们只需要关注开发环境的配置文件即可,项目经理会把测试环境和生产环境做好,上线的时候只需要已调整就能用了
:::success
书写技巧:
主配置文件中设置公共配置(全局)
环境分类配置文件中常用于设置冲突属性(局部)
:::
多文件properties配置
多环境03.wmv
和yaml的方式大同小异
#应用环境,默认环境
spring.profiles.active=dev
#开发环境
server.port= 6789
#生产环境
server.port= 7789
#测试环境
server.port= 8789
总结:
可以使用独立配置文件定义环境属性
独立配置文件便于线上系统维护更新并保障系统安全性
多环境分组管理
我们会根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
application-devDB.yml
application-devRedis.yml
application-devMVC.yml
好处:想更换配置的时候更加方便,更加细粒度的控制
以SSMP项目为例,我们可以把配置文件拆分成更细粒度的配置
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: xzjyroot
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
global-config:
db-config:
# 表前缀
table-prefix: tbl_
# 日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:
profiles:
active: dev
include: devDB,devMP
注意观察这里的加载顺序,如果出现配置冲突,后加载的配置生效,dev为主配置一直最后加载,其他配置的加载顺序取决于include的书写顺序
存在问题:如果需要切换环境,需要一个个修改include引入的配置
从SpringBoot2.4版开始使用group属性替代include属性,降低了配置书写量
使用group属性定义多种主环境与子环境的包含关系
spring:
profiles:
active: dev
group:
"dev": devDB,devMP
"pro": proDB,proMP
"test": testDB,testMP
注意这里的小变化,这里的加载顺序,变成了dev先加载了,一定要注意哦 如果出现配置冲突,后加载的配置生效
多环境开发使用group属性设置配置文件分组,便于线上维护管理
多环境Maven+SpringBoot开发控制 -线上相似度高-
多环境除了SpringBoot中有,Maven中也有,在很多与构建相关的工具都有多环境的设定,这个时候问题就来了,加入在Maven中设定的是生产环境,在SpringBoot中设定的是开发环境,他俩冲突了,谁生效?
因为SpringBoot是依赖Maven运行的,SpringBoot工作依赖于Maven坐标的配置,所以SpringBoot是基于Maven运行的,如果两方都配,肯定Maven生效。以Maven的配置为主,SpringBoot的配置为辅。
所以我们主配Maven,让SpringBoot读取Maven的配置,就能解决冲突问题
为了更好的演示,我们再创建一下pro的环境组,这里其实不需要全部创建只需要准备好数据源的配置即可,就算是激活了pro组的环境,但是没有对应的配置文件也不会报错,但是项目启动需要依赖数据源配置,没有则会报错
所以,干脆把pro的配置文件全部创建一份,这样也更接近真实的运行环境
spring:
profiles:
active: pro
group:
"dev": devDB,devMP
"pro": proDB,proMP
"test": testDB,testMP
把dev的配置复制一份改个名即可,毕竟是模拟不需要真正的搭建生产环境
在maven中配置多环境
<!-- 配置多环境 -->
<profiles>
<!-- 开发环境 -->
<profile>
<!-- 每个环境必须要有一个id -->
<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>
�在application.yml中引用maven中的环境配置,在yml使用@xxx@可以引用maven中的变量和自定义的环境属性
其实就是properties中自定义的属性,如果报错 就加上引号 “@xxx@”
spring:
profiles:
active: "@profile.active@"
group:
"dev": devDB,devMP
"pro": proDB,proMP
"test": testDB,testMP
执行maven的clean,然后package,找到包文件,解压之后查看application.yml中的变量是否引用成功
springboot中的@profile.active@ 不生效 解决方案
生效前提有两种方式
第一种是使用的是spring-boot官方parent,这样parent里已经设置好了资源目录,如:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.11.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
第二种就是未使用官方parent,需要手动设置一下资源目录,filtering=true是让资源文件解析变量
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
maven 多环境命令
【命令】:
mvn 指令 -D skipTests –P 环境定义id
【范例】:
mvn install -D skipTests –P pro_env
�