Apollo报错找不到apollo.meta的问题解决方案

问题描述

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的问题

相关文章
相关标签/搜索