问题描述
在微服务下使用携程的Apollo配置中心,在一个之前部署过的apollo的环境里增加新的配置,死活连不上Apollo里配的配置,具体表现是 apollo-cache-dir
下没有任何配置文件。
apollo配置如下:
app.id=${spring.application.name}
apollo.meta=http://apollo-host:8080
apollo.cacheDir=apollo-cache-dir
apollo.cluster=default
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application,middleware
apollo.bootstrap.eagerLoad.enabled=true
原因分析:
我从下面的可能原因入手分析
一切没有头绪时,我决定仔细分析apollo的每个参数,看看配置是否有问题(因为这份配置在其他环境没有问题,我也没怀有多大希望)。
我发现了 apollo.bootstrap.eagerLoad.enabled
这个配置,官方解释是 将Apollo配置加载提到初始化日志系统之前(1.2.0+)。
也就是说,这个参数设为 true
,Apollo的加载顺序会放到日志系统加载之前,不过这会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!所以在Apollo代码中使用Slf4j的日志输出便没有任何内容)。
难怪我一直看不到日志信息,我感觉离解决问题不远了。
我将参数设为 false
,果然,启动时看到了apollo的日志:
2022-03-31 18:57:01 [main] INFO com.ctrip.framework.foundation.internals.provider.DefaultServerProvider -Loading /opt/settings/server.properties
2022-03-31 18:57:01 [main] INFO com.ctrip.framework.foundation.internals.provider.DefaultServerProvider -Environment is set to [Local] by property 'env' in server.properties.
2022-03-31 18:57:01 [main] WARN com.ctrip.framework.apollo.spi.DefaultConfigFactory -==== Apollo is in local mode! Won't pull configs from remote server for namespace application ! ====
2022-03-31 18:57:01 [main] WARN com.ctrip.framework.apollo.spi.DefaultConfigFactory -==== Apollo is in local mode! Won't pull configs from remote server for namespace middleware ! ====
人家做得很到位,还强调了2遍:Apollo is in local mode! Won't pull configs from remote server for namespace application
.
就是 /opt/settings/server.properties
这个配置文件导致的:
# cat /opt/settings/server.properties
env=Local
看到这里我就无语了,这是线上环境,居然有人改成这样???
我将该配置删掉,得到正常的日志:
com.ctrip.framework.foundation.internals.provider.DefaultServerProvider
-Environment is set to null. Because it is not available in either
(1) JVM system property 'env', (2) OS env variable 'ENV' nor (3) property 'env' from the properties InputStream.