上一节讲到,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(2) 配置源的更多相关文章

  1. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  2. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. 深入了解三种针对文件(JSON、XML与INI)的配置源

    深入了解三种针对文件(JSON.XML与INI)的配置源 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonCon ...

  4. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  5. CentOS配置源

    一.源列表 aliyun源 #各系统版本repo文件对应的下载操作 CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.al ...

  6. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  7. [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]

    物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  8. [ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]

    .NET Core采用的这个全新的配置模型的一个主要的特点就是对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源.如果采用物理文件作为配置源,我们可以选择 ...

  9. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

随机推荐

  1. 2020.5.24 第四篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...

  2. C语言如何动态分配二维数组

    C语言如何动态分配二维数组(转载) 原文链接:https://www.cnblogs.com/0xWitch/p/9314621.html 使用malloc().free()函数进行动态分配,这两个函 ...

  3. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  4. hadoop平台环境搭建

    centos01 配置静态ip vim /etc/sysconfig/network-scripts/ifcfg-eth0 见图1 修改主机名 vim /etc/sysconfig/network 见 ...

  5. Istio安全-授权(实操三)

    Istio安全-授权 目录 Istio安全-授权 授权HTTP流量 为使用HTTP流量的负载配置访问控制 卸载 授权TCP流量 部署 配置TCP负载的访问控制 卸载 使用JWT进行授权 部署 使用有效 ...

  6. android studio生成aar包

    android studio生成aar包并在其他工程引用aar包 http://blog.csdn.net/getchance/article/details/47257389 用Android st ...

  7. Java实现IO通信(服务器篇)

    Java实现IO通信(服务器篇) 如何利用java实现我们的通信呢?首先我们了解一下什么是通信?通信的机制是怎样的? 首先来讨论一下什么是通信?通信,指人与人或人与自然之间通过某种行为或媒介进行的信息 ...

  8. tp5下的文件上传与下载类

    class FieldInterfun extends Controller { /** * [upload 上传文件] * @param [type] $file [description] * @ ...

  9. CTF常见源码泄漏总结

    .hg源码泄漏 漏洞成因: hg init的时候会生成.hge.g.http://www.am0s.com/.hg/ 漏洞利用:工具:dvcs-ripperrip-hg.pl -v -u http:/ ...

  10. UEFI、BIOS、GPT、MBR等概念的辨析

    (本文转移自本人的旧博客) 从各个地方包括知乎,Wiki,CSDN搜索到的一些整理,这些概念极易混淆. 先说互相的关系 BIOS和UEFI是两种固件接口标准 MBR和GPT是两种分区表 Legacy模 ...