archaius源码分析之配置源

Posted zwh1988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了archaius源码分析之配置源相关的知识,希望对你有一定的参考价值。

  上一节讲到,archaius实现动态配置的核心就是定时去配置中心拉去配置内容,接下来几接就来看一下archaius内部具体是如何实现的。

  首先我们来了解一下配置源,什么是配置源呢,archaius内部配置的来源即配置源。archaius抽象了两种配置源,一种是主动拉取方式获取配置,一种是被动监听方式获取配置。

  所谓主动拉去就是配置源需要主动从目标位置获取配置;二被动监听则是注册一个监听器,当目标位置配置变换收接受变化的配置信息。

  我们先来看一下类图结构:

   PolledConfigurationSource定义了主动拉取配置的方法,并且支持断点加载。PollResult是拉取的结果数据。

public PollResult poll(boolean initial, Object checkPoint) throws Exception;  

  initial是否是初次获取,checkPoint上次获取的检查点。

  archaius实现了JDBCConfigurationSource和URLConfigurationSource两种配置源分别从数据库和指定url中加载配置信息。   

  JDBCConfigurationSource 需要用户指定数据源,查询语句,key的列名,value的列名。

public JDBCConfigurationSource(DataSource datasource, String query,
            String keyColumnName, String valueColumnName) {
        this.datasource = datasource;
        this.query = query;
        this.keyColumnName = keyColumnName;
        this.valueColumnName = valueColumnName;
    }

  根据数据源、查询语句、key的列名、value的列名从数据库中获取相应的配置,然后封装成PollResult返回,实际上JDBCConfigurationSource并没有实现断点加载,每一次获取都是获取所有数据。

public PollResult poll(boolean initial, Object checkPoint) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        ...
            conn = getConnection();
            pstmt = conn.prepareStatement(query.toString());
            rs = pstmt.executeQuery();
            while (rs.next()) {
                String key = (String) rs.getObject(keyColumnName);
                Object value = rs.getObject(valueColumnName);
                map.put(key, value);
            }

        ...
        return PollResult.createFull(map);
}

  URLConfigurationSource需要指定配置文件的url(如果没有指定默认读取类路径下config.properties文件)。URLConfigurationSource也没有实现断点加载,每一次获取都是获取所有数据。

public PollResult poll(boolean initial, Object checkPoint) throws IOException {    
  if (configUrls == null || configUrls.length == 0) {
     return PollResult.createFull(null);
   }
   Map<String, Object> map = new HashMap<String, Object>();
   for (URL url: configUrls) {
     InputStream fin = url.openStream();
      Properties props = ConfigurationUtils.loadPropertiesFromInputStream(fin);
      for (Entry<Object, Object> entry: props.entrySet()) {
        map.put((String) entry.getKey(), entry.getValue());
      }
   }
   return PollResult.createFull(map);
}

监听配置源

  WatchedConfigurationSource定义了监听配置源,当配置发生变化时,调用这些监听器,archaius内部并没有提供实现。

public interface WatchedConfigurationSource {
    /**增加监听器
     */
    public void addUpdateListener(WatchedUpdateListener l);
    /**删除监听器
     */
    public void removeUpdateListener(WatchedUpdateListener l);
    /**获取最新的所有配置信息
     */
    public Map<String, Object> getCurrentData() throws Exception;
}

  WatchedUpdateListener定义了监听器,

public interface WatchedUpdateListener {
    public void updateConfiguration(WatchedUpdateResult result);
}

  WatchedUpdateResult里面是改动的配置信息。

public class WatchedUpdateResult {
  /**分别存储完整的配置信息,新增的配置,改变的配置,删除的配置 */
protected final Map<String, Object> complete, added, changed, deleted; protected final boolean incremental; /**完整的配置信息*/ public static WatchedUpdateResult createFull(Map<String, Object> complete) { return new WatchedUpdateResult(complete); }

 

 

  

以上是关于archaius源码分析之配置源的主要内容,如果未能解决你的问题,请参考以下文章

archaius源码分析之属性对象

archaius文档翻译之概述

初识Archaius的简单使用及高级使用-01

初识Archaius的简单使用及高级使用-01

archaius简介

微服务技术专题Netflix动态化配置服务-微服务配置组件变色龙Archaius