spring-support

a distributed config system, based on mysql & zookeeper

License

License

GroupId

GroupId

com.github.colin-lee
ArtifactId

ArtifactId

spring-support
Last Version

Last Version

1.0.0
Release Date

Release Date

Type

Type

jar
Description

Description

spring-support
a distributed config system, based on mysql & zookeeper
Project URL

Project URL

https://github.com/colin-lee/autoconf/tree/master/spring-support
Source Code Management

Source Code Management

https://github.com/colin-lee/autoconf

Download spring-support

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.colin-lee/spring-support/ -->
<dependency>
    <groupId>com.github.colin-lee</groupId>
    <artifactId>spring-support</artifactId>
    <version>1.0.0</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.colin-lee/spring-support/
implementation 'com.github.colin-lee:spring-support:1.0.0'
// https://jarcasting.com/artifacts/com.github.colin-lee/spring-support/
implementation ("com.github.colin-lee:spring-support:1.0.0")
'com.github.colin-lee:spring-support:jar:1.0.0'
<dependency org="com.github.colin-lee" name="spring-support" rev="1.0.0">
  <artifact name="spring-support" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.colin-lee', module='spring-support', version='1.0.0')
)
libraryDependencies += "com.github.colin-lee" % "spring-support" % "1.0.0"
[com.github.colin-lee/spring-support "1.0.0"]

Dependencies

compile (8)

Group / Artifact Type Version
com.github.colin-lee : config-core jar 1.0.0
joda-time : joda-time jar 2.8.2
org.springframework : spring-context jar 4.2.1.RELEASE
ch.qos.logback : logback-classic jar 1.1.3
org.slf4j : jcl-over-slf4j jar 1.7.12
org.apache.zookeeper : zookeeper jar 3.4.6
org.apache.curator : curator-recipes jar 2.9.0
com.google.guava : guava jar 18.0

provided (2)

Group / Artifact Type Version
javax.servlet : jstl jar 1.2
javax.servlet : javax.servlet-api jar 3.1.0

test (3)

Group / Artifact Type Version
org.springframework : spring-test jar 4.2.1.RELEASE
junit : junit jar 4.11
org.apache.curator : curator-test jar 2.9.0

Project Modules

There are no modules declared in this project.

##配置管理系统(ConfigManagerSystem)

Build Status Coverage Status

###设计理念

  • 基于Zookeeper集群实现集中式、实时更新配置
  • 基于本地FileCache实现冷启动加速、去中心强依赖功能
  • 扫描本地FileCache的修改,调试时临时修改参数不必通过web界面操作,避免生成很多特例配置

每个配置文件对应zookeeper的一个path,并且会把这个内容写入到一个本地目录下的同名文件中。 会有一个异步线程扫描本地文件的修改,若有修改会触发重新加载。 本地修改的内容会在服务重启以及zookeeper重写覆盖,只能是临时调试使用。

###本地配置目录

  • 可以通过环境变量 -DlocalConfigPath=/data/config 来指明本地配置目录
  • 如果不指定会从当前类路径下查找 autoconf 名字的目录,找到就会使用
  • 找不到 autoconf 目录,则会尝试创建一个 autoconf
  • 创建失败,则会使用 java.io.tmpdir 环境变量指明的目录作为本地配置目录

###远程Zookeeper配置目录

  • 可以通过环境变量 -DzkConfigPath=/cms/config 来指明远程配置根目录
  • 可以通过环境变量 -Dprocess.profile=dev -Dprocess.name=appName 来指明进程信息,用于定位具体配置

###配置大小限制 受zookeeper的默认配置限制,目前设定为最大 1M 。如果超过1M,抱歉,目前不支持。 这类大的配置文件,应该走发布系统进行下发,直接保存到对应机器中,不必一直放到zookeeper的内存镜像中。 而且这类大文件也不适合通过web界面进行编辑。

###配置文件编码 默认都是UTF8编码

###配置文件命名

  • 匹配字符集[a-zA-Z_-]
  • 文件名不要超过128个字符

###KV格式配置

  • 提供各种数据类型的get方法,比如
getInt(String key, int defaultVal)
getInt(String key)
如果不提供默认值,相当于数字类型默认为0,bool类型默认为false。
  • 判断是否有对应配置,has(String key)

###文本格式配置 提供获取纯文本内容,所有文本行的功能。默认会删掉“#”和“//”开头的注释文本行

  • getString() 返回UTF8解码的文本内容
  • getString(Charset charset) 返回指定编码的文本内容
  • getLines() 返回UTF8解码的所有文本行
  • getLines(Charset charset) 返回指定编码的所有文本行
  • getLines(Charset charset, boolean removeComment) 根据是否去除注释指定,返回对应编码所有文本行

###二进制格式配置

  • getContent() 返回配置的原始字节流,可以自己进行解析对应的byte[]内容

###配置加载优先顺序 默认在zookeeper上创建 /cms/config 根目录。如果当前进程信息如下

process.team = teamName
process.profile = deploy
process.name = view-main
process.ip = 10.204.8.32
process.port = 8011

以demo.ini的配置为例,根据当前进程process.properties的配置,会按照下面顺序加载

  1. /cms/config/teamName/app/demo.ini/10.204.8.32:8011 针对正式环境10.204.8.32:8011这个进程实例的特殊配置
  2. /cms/config/teamName/app/demo.ini/10.204.8.32 针对正式环境10.204.8.32这个机器的特殊配置
  3. /cms/config/teamName/app/demo.ini/deploy 针对正式环境的配置
  4. /cms/config/teamName/app/demo.ini/view-main 针对view-main业务的特殊配置

###配置更新回调 ####简单kv格式 不需要自己添加回调功能,系统会自动更新每个IConfig对象的数据,这样config.getInt()这样的函数每次都能拿到最新配置 ####自定义回调函数

  • 回调接口定义
public interface IChangeListener {
    /**
     * 配置更新,回调注册的功能实现对应功能变更
     *
     * @param config 配置文件
     */
    void changed(IConfig config);
}
  • 回调注册
/**
 * 注册更新回调方法,并且会马上调用1次回调函数,避免外层还需要手动调用1次
 *
 * @param listener 更新回调方法
 */
void addListener(IChangeListener listener);
/**
 * 注册更新回调方法
 *
 * @param listener 更新回调方法
 * @param loadAfterRegister 注册后立即调用回调函数
 */
void addListener(IChangeListener listener, boolean loadAfterRegister);
  • 回调注销
/**
 * 去掉listener
 *
 * @param listener 更新回调函数
 */
public void removeListener(IChangeListener listener);

###使用样例 获取一个config对象,并注册自己的更新回调函数,默认不需要

public class ConfigDemo {
    static {
        ConfigFactory.getConfig("server.ini", new IChangeListener() {
            @Override
            public void changed(IConfig config) {
                loadConfig(config);
            }
        });
    }

    private static void loadConfig(IConfig config) {
        //do something
        int aInt = config.getInt("key");
    }
 }

Versions

Version
1.0.0