apolloconfig / apolloconfig/apollo

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

オープン
#3,072 コメント 7 件 リアクション 0 件 担当者 0 名 GitHub で見る
info
主要言語
Java
スター
29.8k
フォーク
10.2k
平均マージ
4日 7時間
マージ済み PR(30日)
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 を短くまとめたダイジェスト。