apolloconfig / apolloconfig/apollo
关于找不到apollo.meta的问题分析和解决
- Vorherrschende Sprache
- Java
- Sterne
- 29.8k
- Forks
- 10.2k
- Ø Merge
- 4 T. 7 Std.
- Gemergte PRs (30 T.)
- 4
Beschreibung
我想提供一个这个问题真正的原因分析和解决方案
## 问题描述
```
Meta server address fallback to http://apollo.meta for env PRO, because it is not available in all MetaServerProviders
Could not complete get operation [Cause: apollo.meta]
```
## 问题分析

Apollo-client和Apollo-core包内的 这两个SPI文件实现类不一致(目前中央仓库1.6.0版本就是),在打可执行jar包的时候,有可能会覆盖另一个文件。这两个实现因历史原因,读取的meta方式不同:
- 在apollo-client发布到中央仓库之前,是读取`apollo-env.properties` (或文件内对应环境变量,例如pro_meta)(LegacyMetaServerProvider)
- 在apollo-client发布到中央仓库之后,是读取`apollo.meta`这个环境变量。(DefaultMetaServerProvider)
## 解决方案
如果项目是可执行jar,一般解决办法就是:
```
org.apache.maven.plugins
maven-shade-plugin
2.4.1
package
shade
false
.....
META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider
```
使用shade插件将两个文件Append到一起。这样就能真正实现'fallback'。
### 方法二:
在知道原因之后,也可以再指定`apollo.meta`(配置了{env}.meta没有用的原因就是丢失了LegacyMetaServerProvider实现。)
## 总结
**SpringBoot可执行jar的项目,会因打包的插件不同,以及使用者定义meta方式不同而具有不确定性。**
SpringBoot使用的打包插件spring-boot-maven-plugin亦是基于maven-shade-plugin,大多数情况项目并不会报错,这里就不花时间分析SpringBoot是否针对重复的SPI文件做了Appending操作。
如果遇到找不到apollo-meta,报错的原因知道了,便不再困惑,参考上述内容即可对症解决。
相关issue:
https://github.com/ctripcorp/apollo/issues/2908
*如果觉得这个分享不错,希望能写入WIKI*
Beitragsleitfaden
Bewertung
Dieses Issue wurde noch nicht bewertet.