apolloconfig / apolloconfig/apollo

关于找不到apollo.meta的问题分析和解决

未关闭
#3,072 7 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
info
主要语言
Java
星标
29.8k
派生
10.2k
平均合并
4 天 7 小时
30 天内合并 PR
4

描述

我想提供一个这个问题真正的原因分析和解决方案
## 问题描述

```
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](https://user-images.githubusercontent.com/8142133/81635394-bcd4be00-9443-11ea-8b4a-2059b449cbe6.png)

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*

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。