apolloconfig / apolloconfig/apollo

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

Ouverte
#3,072 7 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
info
Langage dominant
Java
Étoiles
29.8k
Forks
10.2k
Merge moyen
4 j 7 h
PR mergées (30 j)
4

Description

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

```
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*

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.