Apollo学习(六):自定义Meta Server地址定位逻辑
说明
在之前的一篇博文《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地址定位逻辑相关推荐
- Apollo学习笔记 进阶课程之三:定位技术②
Apollo学习笔记 进阶课程之三:定位技术② 百度的无人驾驶定位方案 1).GNSS定位 GPS误差来源: 上图为单点定位,基于TOA 载波定位技术:(RPK技术,PPP技术) RPK:可以在五秒内 ...
- ns2仿真学习(六)-自定义协议
这次,我是仿照ns2中的sctp,实现了一个多宿主的UDP协议,目前还比较简单,只能获取端到端的rtt,能够明显看到数据包的乱序情况.中间遇到遇到一些小波折,记录在此,以备后用. 在ns2目录下增加文 ...
- Apollo学习(超详细)
Apollo 文章目录 Apollo 1. 学习地址 2. 概览 1. 什么是配置 2. 什么是配置中心 3. Apollo简介 1. 主流配置中心 1.1. 功能特性对比 1.2 总结 2. Apo ...
- Apollo代码学习(六)—模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
Apollo代码学习(六)-模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
- PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表
第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip 相应的iret pop ip, cs 而call/ret only focus ip register 3 ...
- 前端学习六——html5+CSS3
前端学习六--html5+CSS3 HTML5 H5新增语义标签 多媒体标签 audio音频标签 audio音频标签常见属性 音频标签语法 视频标签video 视频标签语法 H5新增input表单.表 ...
- HTML5+CSS3的学习(六)
HTML5+CSS3的学习(六) 2018版李立超html+css基础 103集教程,哔哩哔哩链接:https://www.bilibili.com/video/BV1sW411T78k?spm_id ...
- 开源:推荐一个不错的离线IP地址定位库
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://gitee.com/lions ...
- Docker学习六:综合实践
前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...
最新文章
- php 头部utf8,PHP去掉utf8格式文件中的bom头部_PHP教程
- jQuery中get()和eq()的区别
- 独立开发人员的自由之路 ——1
- 利用vector实现一对一(pair<int,int>)
- TiDB集群大规模删除实践
- 每天工作6小时,月入过万,这个新职业火了
- springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
- docker stop
- 毕啸南专栏 | 对话驭势CEO吴甘沙:无人车结盟竞争是大势所趋
- android程序安全编码向导,Android安全编码规范
- 代码织入 android,这可能是Android最傻瓜式的AOP框架
- Cocos2dx 3.0 交流篇
- Octavia 加速 OpenStack LBaaS 落地大规模应用场景
- 软件测试理论试题及答案
- plc c语言做报警,wincc声音报警C脚本版
- 服务器性能检测器,Linux服务器性能检测工具之 collectl
- Springboot启动流程详解
- Maya菜单中英文对照表(一)
- jqGrid参数列表
- sql查询数据库表中重复数值
热门文章
- 一种针对夏克哈特曼波前传感器质心数据求解波前斜率的处理方法
- 霍尼韦尔助力航空公司实现机上高速上网;索尼收购“美版B站” | 美通社头条...
- 学IT什么培训机构比较好?
- Ventoy多系统启动盘制作及虚拟机VMware配置使用
- 根据证券代码获取证券市场(SH,SZ,IB)
- JS onclick is not defined解决办法
- Workerman 小蝌蚪聊天室去掉端口
- UnityShader 实现 PhotoShop中的正片叠底
- [傲游浏览器 v6.1.0.2200 Beta x64] Windows版+双核引擎+云推送云分享云同步等功能
- 快速文件重命名,中文文件名转换成英文文件名