Apollo报错,找不到apoll.meta,可是明明配置了apollo-env.properties到apollo-client内了。html
apollo-env.propertiesnginx
pro.meta=http://apollo.xxxx.com:81
因公司内部使用的 ctrip Apollo用了较早的版本,期间通过一次升级,而我算是Apollo的忠实用户,使用时间超过两年。
所以,我刚好知道,Apollo稍早的版本,没有将Apollo-client发布到 中央仓库,由于 Apollo-client的内部包含了编译期间指定的apollo-env.properties文件,
而为了发布到中央仓库,不能使用此方式将本身公司的meta地址放入其中,所以Apollo增长了一种配置方式:经过JVM参数等方式指定 apollo 的meta Server地址。spring
公司Maven仓库内的apollo-client内是含有apollo-env.properties。所以原则上Apollo不须要再配置。dom
而为何报错呢?maven
Apollo的 Meta 地址获取逻辑,采用JAVA的SPI实现ide
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); }
而该接口有两个实现spring-boot
默认实现:工具
public class DefaultMetaServerProvider implements MetaServerProvider
第二个实现:(旧版本)url
public class LegacyMetaServerProvider implements MetaServerProvider
正常状况下,apollo应该使用两者之一的Provider。code
若是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的问题