在之前的一篇博文《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);
});
}
@Override
public 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);
}
@Override
public 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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/sinat_36553913/article/details/103328799
内容来源于网络,如有侵权,请联系作者删除!