Apollo报错找不到apollo.meta的问题解决方案
问题描述
Apollo报错,找不到apoll.meta,但是明明配置了apollo-env.properties到apollo-client内了。
apollo-env.properties
pro.meta=http://apollo.xxxx.com:81
问题分析
因公司内部使用的 ctrip Apollo用了较早的版本,期间经过一次升级,而我算是Apollo的忠实用户,使用时间超过两年。
因此,我恰好知道,Apollo稍早的版本,没有将Apollo-client发布到 中央仓库,因为 Apollo-client的内部包含了编译期间指定的apollo-env.properties文件,
而为了发布到中央仓库,不能使用此方式将自己公司的meta地址放入其中,因此Apollo增加了一种配置方式:通过JVM参数等方式指定 apollo 的meta Server地址。
公司Maven仓库内的apollo-client内是含有apollo-env.properties。因此原则上Apollo不需要再配置。
而为什么报错呢?
问题原因
Apollo的 Meta 地址获取逻辑,采用JAVA的SPI实现
package com.ctrip.framework.apollo.core.spi;
import com.ctrip.framework.apollo.core.enums.Env;
/**
* @since 1.0.0
*/
public interface MetaServerProvider extends Ordered {
/**
* Provide the Apollo meta server address, could be a domain url or comma separated ip addresses, like http://1.2.3.4:8080,http://2.3.4.5:8080.
* <br/>
* In production environment, we suggest using one single domain like http://config.xxx.com(backed by software load balancers like nginx) instead of multiple ip addresses
*/
String getMetaServerAddress(Env targetEnv);
}
而该接口有两个实现
默认实现:
public class DefaultMetaServerProvider implements MetaServerProvider
第二个实现:(旧版本)
public class LegacyMetaServerProvider implements MetaServerProvider
正常情况下,apollo应该使用二者之一的Provider。
如果JVM启动的时候,使用了DefaultMetaServerProvider,这种情况没有配置JVM参数 apollo.meta,那么将报错,找不到meta server。
那为什么公司的仓库内 apollo-client 有apollo-env.properties 但是没有使用LegacyMetaServerProvider ?
问题解决
因为踩坑次数多了,自然想到去jar包内看看,经过检查发现 jar内的META-INF确实有apollo-env.properties。
问题就出在,apollo-core-1.3.0-xxx.jar!/META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider内是:
com.ctrip.framework.apollo.internals.DefaultMetaServerProvider
而
apollo-client-1.3.0-xxx.jar!/META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider内是:
com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider
最终原因在于,maven打包工具有 maven-jar-plugin,maven-assembly-plugin, maven-shaded-plugin。
如果使用spring-boot-maven-plugin,虽然内置有maven-shaded-plugin,但是他根本不知道apollo的。
这些情况最终导致了不确定性,JVM加载的Jar包顺序不一样,或者打包的顺序,导致一个SPI文件被另一个文件覆盖掉了,因此丢失了一个provider实现。
但是只有maven-shaded-plugin,可以经过配置TRANSFORMER,将这两种合并到一个com.ctrip.framework.apollo.core.spi.MetaServerProvider文件内。
最终解决方案
保持apollo-client和apollo-core包内 的/META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider
有两个Provider,分别写一行。
或者联系相关人员,将这两个文件的内容保持一致,并给出适用的使用方案。例如jar包内附带了pro.meta等变量的时候,提供LegacyMetaServerProvider。
如果没有附带,则要求使用人员自行配置 apollo.meta。
刚好这篇文章解决了我另一篇同样是关于Apollo和Dubbo集成的文章中遇到的问题。
解决Dubbo 2.7.3版本使用ConfigCenterConfig集成Apollo No Provider found的问题
Apollo报错找不到apollo.meta的问题解决方案的更多相关文章
- IntelliJ_编译一直报错“找不到符号”
执行maven compile时一直报错"找不到符号",类 XXX 各种clean.compile都不行 最后执行Rebuild Project一次后解决 执行rebuild ...
- .map文件的作用以及在chorme下会报错找不到jquery-1.10.2.min.map文件,404 的原因
source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是map,压缩后通过变量替换规则可能会 ...
- MVC4数据访问EF查询linq语句的时候报错找不到表名问题
一天做项目的时候遇到这样的问题,MVC4用EF访问数据查询用linq语句的时候报错找不到表名:报错如下图: 研究了几种情况,最后还是没有找到正真的问题所在,不过可能是和路由解析问题有关,暂时还没有进行 ...
- SQL Server 安装报错找不到vc_red.msi
问题描述: 今天给 WIN 7 SP1 操作系统安装 SQL Server 2014 ,报错找不到vc_red.msi (图片来源网络,请忽略2012字样..) 问题解决: 1.由于安装程序提 ...
- salt '*' state.highstate 报错找不到文件,环境如下No Top file or master_tops data matches found.
salt '*' state.highstate 报错找不到文件,环境如下No Top file or master_tops data matches found. file_roots: b ...
- macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案
macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案 我的是macOS 10,默认情况下不允许未知身份的软件安装 默认情况,如下图所示: 解决办法: sudo spct ...
- idea lib下有jar包但是仍然报错 找不到类
现象: idea lib下有jar包但是仍然报错 找不到类 但是有个奇怪现象 同样的配置下项目在eclipse中可以正常编译 启动. package com.puhui.car.aspect; imp ...
- Intellij里检出svn报错找不到svn解决办法
Intellij里检出svn报错找不到,解决办法: 1. 安装svn客户端: 2. 去掉settings->version control->subversion里的use command ...
- IDEA中flink程序报错找不到类
Idea中运行flink程序,报错找不到类,其中pom文件中一项依赖为: <dependency> <groupId>org.apache.flink</groupId& ...
随机推荐
- 移动端获取短信验证码java实现——阿里云短信服务
需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...
- 利用Code::Blocks搭建64位C++开发平台
0.前言 随着64位计算机的普及,编写64位程序成为程序员基本的要求.我在<体验Code::Blocks下的C++编程>中描述了利用Code::Blocks官方提供的封装了编译器的安装包( ...
- 初级Python
[toc] 一.数据类型 1.1基本数据类型 1.1.1数字类型 1.整数类型 十进制:1010,-219 二进制:以0b或0B开头:0b010,-0B101 八进制,以0o或0O开头:0o123,- ...
- [UWP] 自定义一个ItemsPanel
在做游民星空的搜索页面的时候,需要展示搜索热点词,返回的是一个string数组的形式,然后以一种错落的方式显示,每一个Item的大小都和热点词长度一致,然后一行放不下之后就换行,描述的不太直观,直接看 ...
- 快学Scala 第十课 (包和包对象)
Scala包定义: 嵌套式: package a1 { class a1Class{ val age = 10 } package a2 { class PackageTest { def main( ...
- 项目三:ssm仓库管理系统
声明:项目来源于网络,尊重原创,学习使用,仅在此记录 项目介绍 ssm仓库管理系统,功能模块:客户信息管理,供应商管理,货物管理,仓库管理,仓库管理员管理,仓库出入口管理,仓库库存记录管理,系统日志管 ...
- 从xxe-lab来深入学习xxe漏洞
这几天,想复习一下xxe的知识,于是把以前的一个靶场拿过来玩玩,顺便审计一下代码2333,靶场地址:https://github.com/c0ny1/xxe-lab 首先先练习的是php-xxe: 我 ...
- Window下的VScode快捷键
转载自4ark 全局 Ctrl + Shift + P, F1 显示命令面板 Ctrl + P 快速打开Ctrl + Shift + N 打开新窗口Ctrl + Shift + W 关闭窗口 基本 C ...
- python+selenium自动化框架
---恢复内容开始--- 主要使用的模块: selenium/webdriver模块(须准备Chrome驱动),主要用于调用浏览器实现自动点击. unittest模块,主要用于整合测试用例. xlrd ...
- 渗透系统虚拟机----win7(渗透工具包)
今天把自己用的win7渗透虚拟机和渗透工具脚本整合到一起备份传网盘了: D:\渗透工具包>dir 驱动器 D 中的卷是 DATA 卷的序列号是 0D74-084B D:\渗透工具包 的目录 // ...