问题描述

Apollo报错,找不到apoll.meta,但是明明配置了apollo-env.properties到apollo-client内了。

apollo-env.properties

  1. 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实现

  1. package com.ctrip.framework.apollo.core.spi;
  2. import com.ctrip.framework.apollo.core.enums.Env;
  3. /**
  4. * @since 1.0.0
  5. */
  6. public interface MetaServerProvider extends Ordered {
  7. /**
  8. * 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.
  9. * <br/>
  10. * 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
  11. */
  12. String getMetaServerAddress(Env targetEnv);
  13. }

而该接口有两个实现

默认实现:

  1. public class DefaultMetaServerProvider implements MetaServerProvider

第二个实现:(旧版本)

  1. 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内是:

  1. com.ctrip.framework.apollo.internals.DefaultMetaServerProvider



apollo-client-1.3.0-xxx.jar!/META-INF/services/com.ctrip.framework.apollo.core.spi.MetaServerProvider内是:

  1. 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的问题解决方案的更多相关文章

  1. IntelliJ_编译一直报错“找不到符号”

    执行maven compile时一直报错"找不到符号",类 XXX 各种clean.compile都不行 最后执行Rebuild Project一次后解决   执行rebuild ...

  2. .map文件的作用以及在chorme下会报错找不到jquery-1.10.2.min.map文件,404 的原因

    source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是map,压缩后通过变量替换规则可能会 ...

  3. MVC4数据访问EF查询linq语句的时候报错找不到表名问题

    一天做项目的时候遇到这样的问题,MVC4用EF访问数据查询用linq语句的时候报错找不到表名:报错如下图: 研究了几种情况,最后还是没有找到正真的问题所在,不过可能是和路由解析问题有关,暂时还没有进行 ...

  4. SQL Server 安装报错找不到vc_red.msi

    问题描述: 今天给 WIN 7 SP1 操作系统安装 SQL Server 2014 ,报错找不到vc_red.msi   (图片来源网络,请忽略2012字样..)   问题解决: 1.由于安装程序提 ...

  5. 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 ...

  6. macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案

    macOS VMWare Fusion报错”找不到可以连接的有效对等进程”的解决方案 我的是macOS 10,默认情况下不允许未知身份的软件安装 默认情况,如下图所示: 解决办法: sudo spct ...

  7. idea lib下有jar包但是仍然报错 找不到类

    现象: idea lib下有jar包但是仍然报错 找不到类 但是有个奇怪现象 同样的配置下项目在eclipse中可以正常编译 启动. package com.puhui.car.aspect; imp ...

  8. Intellij里检出svn报错找不到svn解决办法

    Intellij里检出svn报错找不到,解决办法: 1. 安装svn客户端: 2. 去掉settings->version control->subversion里的use command ...

  9. IDEA中flink程序报错找不到类

    Idea中运行flink程序,报错找不到类,其中pom文件中一项依赖为: <dependency> <groupId>org.apache.flink</groupId& ...

随机推荐

  1. 第六届蓝桥杯java b组第三题

    第三题 三羊献瑞 观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容. 答案这个题目完全可以使用暴 ...

  2. 自定义构建基于.net core 的基础镜像

    先说一个问题 首先记录一个问题,今天在用 Jenkins 构建项目的时候突然出现包源的错误: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): e ...

  3. js三级联动效果city-picker

    链接:https://pan.baidu.com/s/1NE_EO5_xGvR-y-lboYap7g 提取码:h00e 效果展示: 解决: 动态赋值: 注意:在执行赋值之前,必须执行reset和des ...

  4. 使用tomcat7发布war项目启动org_apache_tomcat_websocket报错

    在使用tomcat7发布项目时(项目是用springboot 2.1.4.RELEASE版本开发的) 换成tomcat8就可以正常发布了,网上说tomcat7不支持servlet3.1,升级到spri ...

  5. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

  6. TensorFlow2.0(四):填充与复制

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  7. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]

    微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的 ...

  8. golang的生产者消费者模型示例

    package main import "fmt" func Producer(ch chan int) { for i := 1; i <= 10; i++ { ch &l ...

  9. django-rest-framework解析请求参数

    django-rest-framework解析请求参数 前言 前面的文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进行请求, 接下来的问题是如何接受参数, 由于请求方式与参数序列化形式 ...

  10. COGS 2089. 平凡的测试数据

    [题目描述] 树链剖分可以干什么? “可以支持在树中快速修改一个点信息,快速询问一条链信息” LCT可以干什么? “可以支持树链剖分支持的特性,并且支持快速链接两个棵树,或者断开某条边” 那我现在要出 ...