1A.Conf自动配置
1A.Conf自动配置
支持配置文件的分割,覆盖,禁用和profile,更有利于工程化的管理。
- 分割 - 指配置项可以按模块,功能,自由组成独立的配置文件
- 覆盖 - 配置项按一定的优先级(加载顺序)可以覆盖
- 禁用 - 可以通过block-list,禁止某配置文件加载
- profile,同spring规则。
wings对配置文件的处理方式,是层叠和过滤,配置以路径顺序和编号大小排序。
- 层叠 - 按优先级(前面的高)排序,高的叠住低的
- 过滤 - 通过profile进行排他过滤
1A.1.分割Config
实际项目开发中,只有一个大的application.*,不利于分工和协作,应该分隔,
- spring-datasource.properties
- spring-mail-79.properties
- logger-logback-79.properties
通过EnvironmentPostProcessor扫描各路径中/wings-conf/**/*.*,规则同 Externalized Configuration ,和配置文件有关的各路径及加载优先级如下。
- 命令行,
--spring.config.location,--spring.config.additional-location - Java 系统变量,
spring.config.location,spring.config.additional-location - 系统环境变量,
SPRING_CONFIG_LOCATION,SPRING_CONFIG_ADDITIONALLOCATION - 默认路径,
classpath:/,classpath:/config/,file:./,file:./config/ classpath:/会被以classpath*:/扫描- 非协议(不含
:),都以file:扫描 - 以
/结尾的当做目录,否则作为文件 - 路径中,
application.*,wings-conf/**/*.*
每个配置文件都由以下部分构成:dirname + basename + seq + profile + extname. 例如, classpath:/wings-conf/ + wings-mirana + -79 + @dev + .properties.
目前只加载 *.yml, *.yaml,*.xml, *.properties扩展名的配置文件。 工程提供的默认配置,文件名字后面都会加上-79,方便根据文件名排序设置默认值。
相同basename为同一配置,无序号的视序号为70,比默认的79要高,会覆盖默认配置。 配置文件,以Resource首先按扫描顺序排序,然后按base归类,按seq升序调整(值覆盖有关)。
所有配置文件必须为UTF8编码,可以更好的支持unicode,可以直接写中文注释或内容。 Wings在装载配置时对非ascii进行自动转义,以兼容spring默认的按byte读取行为。
1A.2.配置Profile
文件名不含@,profile名不包括.,以避免解析错误。和spring对比如下,
application.propertiesapplication-{profile}.propertieswings-conf/wings-test-module-79.propertieswings-conf/wings-test-module-79@{profile}.properties
相同basename的config视为同一组,并移除非活动的profile配置, 以@区分profile,因为wings的配置文件名中存在-,无法兼容spring格式。 在使用spring.profiles.active时,要确保配置文件按spring约定加载。
wings和spring的profile在处理上也有区别,默认wings优先于spring处理。
- application-{profile},wings扫描排序,spring处理
- wings-conf/layered-config@{profile},wings扫描及处理
- 有profile叠住无profile的配置,多个激活profile层叠覆盖
- 避免在wings-conf/中存在application命名的配置,导致spring和wings双重处理
SpringBoot仅支持单application配置,多profile形式,所以配置文件上仅有路径优先级。 多profile时,处理顺序为①排除非激活 ②激活的排字符序(后者优先)③无profile的垫底。
Wings支持多配置,多profile,其路径优先级和profile优先级与spring一致。 在多配置优先级,处理顺序为 ①profile ②路径 ③文件序号 ④字符顺序(前者优先)
1A.3.加载黑名单
存在于/wings-conf/wings-conf-block-list.cnf的文件名,不会自动加载。
- 一行一个文件名,区分大小写
#开头标识注释,自动忽略首尾空白- 以
String.endWith判断,全路径精确匹配 - 排除单个
@profile的配置文件,需要单独指定
1A.4.配置项提升
有些非Spring体系的功能,通过System.getProperties获得属性。 因此需要把需要的配置项,从spring写入System.properties。
- System若不存在,则写入,即
-Dkey=value优先级最高 - 变量名保存在
/wings-conf/wings-prop-promotion.cnf中 - 一行一个属性名,区分大小写,
#表注释
1A.5.logging/logback
参考wings-logging-79.properties配置,默认使用springboot配置。
- 只需要console输出(如果docker内)不需要额外设置
- 同时需要console和file时,增加以下配置
logging.file.name=/tmp/wings-example.log - 只需要file时,再增加
logging.config=classpath:logback-fileonly.xml - 可按名字配置appender日志级别,若存在FILE时,CONSOLE自动切到WARN以上(仅logback)
推荐的logging配置,默认INFO,指定包名的DEBUG
- logging.level.root=INFO
- logging.level.org.springframework.web=DEBUG
- logging.level.org.jooq=DEBUG
- logging.level.忽略的包路径=OFF
推荐使用wings-starter.sh启动,用wings-starter.env设置基础参数。
1A.6.动态调节
根据业务需求,按特定条件,触发线程级的日志输出。
- TweakLogger - 仅支持logback,通过LogbackFilter完成
- TweakClock - 全局或线程级调整时间
- TweakStack - 全局或线程级是否输出Stack
- TweakFeature - 全局或线程级开关功能
1A.7.参考资料
- "4.1.6. Application Events and Listeners"
- "4.2. Externalized Configuration"
- "9.2.3. Change the Location of External Properties of an Application"
- "9.1.3. Customize the Environment or ApplicationContext Before It Starts"
