Apollo大家应该都有在项目中用到,我们项目也不例外,携程开源的非常好用的配置化平台。今天在搭建新服务的时候发现应为Apollo的配置导致服务启动失败,估次排查一下具体的原因顺便记录下来,翻边后面再次遇到可以查阅解决,顺便也希望可以帮助遇到问题的同学解一下惑。
问题描述
项目中明明配置了相关配置,但是项目启动的时候就是读取不到相关配置,现象如下。
问题根源确认
问题根源就是SpringBoot启动加载文件的先后问题,官网上也有人提出这个问题,并且得到了明确的答复。
解决方案
其实解决方案也不止上面提到的,有几种方案可供咱们解决该问题。
3.1、在properties文件中加载
3.2、采用Apollo官网提供的解决思路:使配置在更早的阶段注入
前提:Apollo 0.10.0及以上版本
# will inject 'application' namespace in bootstrap phase
apollo.bootstrap.enabled = true
# put apollo initialization before logging system initialization
apollo.bootstrap.eagerLoad.enabled=true
4、Spring Boot中@ConditionalOnProperty
4.1、源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
// 数组,获取对应property名称的值,与name不可同时使用
String[] value() default {};
// 配置属性名称的前缀,比如spring.http.encoding
String prefix() default "";
// 数组,配置属性完整名称或部分名称
// 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
String[] name() default {};
// 可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
String havingValue() default "";
// 缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
boolean matchIfMissing() default false;
}
其中:@Conditional(OnPropertyCondition.class)注解是Spring框架提供的注解,OnPropertyCondition.class,优先级特别高,这也于是这他的用途,根据配置初始化合适的bean。
1、public getMatchOutcome | 获取匹配的结果 |
2、private annotationAttributesFromMultiValueMap | 根据多个值,映射注解属性 |
3、private determineOutcome | 决定匹配的结果 |
4、private getNames | 获取名称 |
5、private collectProperties | 收集属性 |
6、private isMatch | 判断是否匹配 |
7、public toString | 打印字符串 |
4.2、作用域
springboot自动化配置的注解,它作用于接口、类、枚举、注解、方法之上
4.3、目的
目的是针对不同的配置,注册不同的配置bean。
参考资料:
1、https://www.cnblogs.com/secbro/p/12011522.html
2、https://github.com/ctripcorp/apollo/issues/903
4、https://blog.csdn.net/qq_31615049/article/details/90551789