apolloconfig / apolloconfig/apollo

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

Đang mở
#3,072 7 bình luận 0 reaction 0 người được giao Xem trên GitHub
info
Ngôn ngữ chính
Java
Star
29.8k
Fork
10.2k
Merge trung bình
4 ngày 7 giờ
Pull request đã merge (30 ngày)
4

Mô tả

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

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.