说明

在之前的一篇博文《Apollo学习(二): Java客户端使用》中,我简单地总结了Apollo配置中心的java客户端使用方法,其中有几个重要步骤,如确定项目的AppId,设置Meta Server的地址,设置本地缓存路径的地址等。
在之前的博文中,对Meta Server地址的设定是通过项目内的app.properties配置文件和系统配置环境参数来进行设置的,这种方式在实际使用中,有很多个项目要接入配置中心,在每个项目中配置Meta Server的地址是十分不便的。在本篇博文中,我将根据官方文档的介绍,创建自定义的Meta Server地址定位逻辑,以jar包的形式,方便多个项目配置使用。

正文

根据文档介绍,Apollo提供了MetaServerProvider接口,通过实现此接口来定义地址提供逻辑。并且使用方式使用了典型的Java Service Loader模式。

注意,使用该模式后,必须在在 resources 下创建 META-INF/services/ com.ctrip.framework.apollo.core.spi.MetaServerProvider 文件,写入自定义实现 MetaServerProvider 的全类名。

以下是我的实现类,首先在resources下创建apollo-env.porperties配置文件,该文件配置了各个环境的Meta Server的地址。在获取时,首先会从Java System Property中获取,若获取值不为空,则直接返回,否则从配置文件中获取

public class CustomMetaServerProvider implements MetaServerProvider {private static final int ORDER = Ordered.HIGHEST_PRECEDENCE;private static final Map<Env, String> ENVMAP = new ConcurrentHashMap<>(16);public CustomMetaServerProvider() {initProperties();}public void initProperties() {Properties properties = ResourceUtils.readConfigFile("apollo-env.properties", null);properties.entrySet().forEach(entry -> {String envStr = (String) entry.getKey();String serverUrl = (String) entry.getValue();Env env = Env.fromString(envStr.substring(0, envStr.indexOf("_")));ENVMAP.put(env, serverUrl);});}@Overridepublic String getMetaServerAddress(Env env) {String url = System.getProperty("apollo.meta");if (!Strings.isNullOrEmpty(url)) {return url;}url = getServerAddress(env);return url;}private String getServerAddress(Env env) {return ENVMAP.get(env);}@Overridepublic int getOrder() {return ORDER;}
}

注意,Apollo在运行时会按照顺序遍历所有的MetaServerProvider,直到获取到一个非空的Meta Server地址。因此,在实现了自定义获取方式后,要定义它的Order,值越小优先级越大,所以这里我配置了最高优先级

最后,我们可以将该项目打包成jar包的方式,因为该项目依赖了apollo-client,所以客户端在使用是可以直接依赖这个jar即可。


项目源码:https://github.com/Edenwds/apollo_docker
参考资料:
https://github.com/ctripcorp/apollo/blob/master/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultMetaServerProvider.java

https://github.com/ctripcorp/apollo/blob/master/apollo-core/src/main/java/com/ctrip/framework/apollo/core/internals/LegacyMetaServerProvider.java

Apollo学习(六):自定义Meta Server地址定位逻辑相关推荐

  1. Apollo学习笔记 进阶课程之三:定位技术②

    Apollo学习笔记 进阶课程之三:定位技术② 百度的无人驾驶定位方案 1).GNSS定位 GPS误差来源: 上图为单点定位,基于TOA 载波定位技术:(RPK技术,PPP技术) RPK:可以在五秒内 ...

  2. ns2仿真学习(六)-自定义协议

    这次,我是仿照ns2中的sctp,实现了一个多宿主的UDP协议,目前还比较简单,只能获取端到端的rtt,能够明显看到数据包的乱序情况.中间遇到遇到一些小波折,记录在此,以备后用. 在ns2目录下增加文 ...

  3. Apollo学习(超详细)

    Apollo 文章目录 Apollo 1. 学习地址 2. 概览 1. 什么是配置 2. 什么是配置中心 3. Apollo简介 1. 主流配置中心 1.1. 功能特性对比 1.2 总结 2. Apo ...

  4. Apollo代码学习(六)—模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码

    Apollo代码学习(六)-模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码

  5. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  6. 前端学习六——html5+CSS3

    前端学习六--html5+CSS3 HTML5 H5新增语义标签 多媒体标签 audio音频标签 audio音频标签常见属性 音频标签语法 视频标签video 视频标签语法 H5新增input表单.表 ...

  7. HTML5+CSS3的学习(六)

    HTML5+CSS3的学习(六) 2018版李立超html+css基础 103集教程,哔哩哔哩链接:https://www.bilibili.com/video/BV1sW411T78k?spm_id ...

  8. 开源:推荐一个不错的离线IP地址定位库

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://gitee.com/lions ...

  9. Docker学习六:综合实践

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

最新文章

  1. php 头部utf8,PHP去掉utf8格式文件中的bom头部_PHP教程
  2. jQuery中get()和eq()的区别
  3. 独立开发人员的自由之路 ——1
  4. 利用vector实现一对一(pair<int,int>)
  5. TiDB集群大规模删除实践
  6. 每天工作6小时,月入过万,这个新职业火了
  7. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
  8. docker stop
  9. 毕啸南专栏 | 对话驭势CEO吴甘沙:无人车结盟竞争是大势所趋
  10. android程序安全编码向导,Android安全编码规范
  11. 代码织入 android,这可能是Android最傻瓜式的AOP框架
  12. Cocos2dx 3.0 交流篇
  13. Octavia 加速 OpenStack LBaaS 落地大规模应用场景
  14. 软件测试理论试题及答案
  15. plc c语言做报警,wincc声音报警C脚本版
  16. 服务器性能检测器,Linux服务器性能检测工具之 collectl
  17. Springboot启动流程详解
  18. Maya菜单中英文对照表(一)
  19. jqGrid参数列表
  20. sql查询数据库表中重复数值

热门文章

  1. 一种针对夏克哈特曼波前传感器质心数据求解波前斜率的处理方法
  2. 霍尼韦尔助力航空公司实现机上高速上网;索尼收购“美版B站” | 美通社头条...
  3. 学IT什么培训机构比较好?
  4. Ventoy多系统启动盘制作及虚拟机VMware配置使用
  5. 根据证券代码获取证券市场(SH,SZ,IB)
  6. JS onclick is not defined解决办法
  7. Workerman 小蝌蚪聊天室去掉端口
  8. UnityShader 实现 PhotoShop中的正片叠底
  9. [傲游浏览器 v6.1.0.2200 Beta x64] Windows版+双核引擎+云推送云分享云同步等功能
  10. 快速文件重命名,中文文件名转换成英文文件名