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

x33g5p2x  于2021-12-20 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(570)

说明

在之前的一篇博文《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

相关文章