文档章节

基于zk的配置管理

xixicat
 xixicat
发布于 2015/02/17 09:02
字数 885
阅读 123
收藏 1
点赞 0
评论 0

一、使用netflix的ZooKeeperConfigurationSource

(1)参考文档

https://github.com/Netflix/archaius/wiki/ZooKeeper-Dynamic-Configuration

 

(2)添加依赖

<dependency>
            <groupId>com.netflix.archaius</groupId>
            <artifactId>archaius-core</artifactId>
            <version>0.6.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.netflix.archaius</groupId>
            <artifactId>archaius-zookeeper</artifactId>
            <version>0.6.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

如果之前pom文件已经引入了curator-client,则需要在引入archaius时exclude下

 

(3)代码

@Before
    public void before() throws Exception {
        String zkConfigRootPath = "/cfg";
        CuratorFramework client = ZkClientUtil.getClient();
        ZooKeeperConfigurationSource zkConfigSource = new ZooKeeperConfigurationSource(client, zkConfigRootPath);
        zkConfigSource.start();
        DynamicWatchedConfiguration zkDynamicConfig = new DynamicWatchedConfiguration(zkConfigSource);
        ConfigurationManager.install(zkDynamicConfig);
    }

    /**
     * 仅仅是在本地内存中更新
     * 即ConcurrentMapConfiguration中的map更新
     * 不会更新到zk
     */
    @Test
    public void locatSet(){
        String key = "com.fluxcapacitor.my.property";
        System.out.println("before set zk config");
        ConfigurationManager.getConfigInstance().setProperty(key,"123");
        System.out.println("after set zk config");
        String myProperty = DynamicPropertyFactory.getInstance()
                .getStringProperty(key, "<none>")
                .get();
        Assert.assertEquals(myProperty,"123");
    }

 

二、自定义的zkconfig

(1)ZooKeeperConfigurationSource的局限

     它是在start的时候,去注册节点的监听事件,默认采用的是pathChildrenCache只能监听子节点的变化事件,如果需要监听整个树的话,则需要TreeCache。

     它是在new DynamicWatchedConfiguration的时候去读取zk的所有数据的。

public DynamicWatchedConfiguration(WatchedConfigurationSource source, boolean ignoreDeletesFromSource,
            DynamicPropertyUpdater updater) {
        this.source = source;
        this.ignoreDeletesFromSource = ignoreDeletesFromSource;
        this.updater = updater;

        // get a current snapshot of the config source data
        try {
            Map<String, Object> currentData = source.getCurrentData();
            WatchedUpdateResult result = WatchedUpdateResult.createFull(currentData);

            updateConfiguration(result);
        } catch (final Exception exc) {
            logger.error("could not getCurrentData() from the WatchedConfigurationSource", exc);
        }

        // add a listener for subsequent config updates
        this.source.addUpdateListener(this);
    }

 

      内存数据存储在ConcurrentMapConfiguration中的map中,对于set方法,只是作用于此map,并不会对远程zk进行set操作

 

(2)zk默认的最终一致性

      zk默认采用的是最终一致性的,即对于一个更新操作,leader在获得超半数follower的支持后,返回更新。这里有两个问题容易导致一致性问题:

A、如果应用程序是通过本地内存读取的数据,则由于zk的事件通知延迟,可能读到脏数据

B、如果应用程序是通过远程读取zk的数据,则由于zk leader同步数据到follower的延迟,可能连接到的follower尚未更新,读到脏数据

 

(3)zk读取最新数据

      如果要读取最新数据,则需要采取上边提到的B方法,但是在该方法之前先,调用下zk的client方法,跟leader同步数据,只要是在sync之前更新的数据,sync之后,读到的是最新的。但是会有性能消耗问题:

 /**
     * 强一致性的读取方法
     * 不从本地内存缓存读取
     * 也不从zk的follower读取
     * 通过sync从zk的leader读取
     * @param key
     * @param defaultValue
     * @return
     */
    private Object getRawPropertySync(String key,Object defaultValue){
        String fullPath = ZkClientUtil.getFullPath(rootPath,key);
        ZkClientUtil.sync(fullPath);
        Object value = ZkClientUtil.getValue(fullPath);
        if(value != null){
            return  value;
        }
        //if read from zk is null,return defaultValue
        return defaultValue;
    }

 

(4)根据大部分场景的折中方案

       大部分场景是读多写少,对于新增配置的操作,从本地内存读取,读取不到,则从zk去读取,这样能最大限度地保证读到最新数据;对于更新操作,始终都是更新到zk,然后本地内存等待zk事件通知,才更新本地数据。

       由于配置通常不区分add操作还是update操作,因此对zk的操作,有几种策略:

/**
     * 几种实现策略选择:
     * 1、先更新、出错在新增
     * 2、先新增、出错在更新
     * 3、先删除再新增
     * @param fullPath
     * @param value
     */
    public static void setValue(String fullPath,String value) {
        if(value == null){
            value = "";
    }
//        try {
//            client.setData().forPath(fullPath, value.getBytes());
//        } catch (KeeperException.NoNodeException exc) {
//            try {
//                client.create().creatingParentsIfNeeded().forPath(fullPath, value.getBytes());
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        try {
            client.inTransaction().check().forPath(fullPath).and()
                    .setData().forPath(fullPath,value.getBytes()).and()
                    .commit();
        } catch (Exception e) {
            try {
                client.create().creatingParentsIfNeeded().forPath(fullPath, value.getBytes());
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
    }


© 著作权归作者所有

共有 人打赏支持
xixicat
粉丝 61
博文 201
码字总数 129524
作品 0
深圳
程序员
初探storm in Docker

背景 Storm是一个已经被业界广泛应用的流处理引擎,主要特点是实时性强,编程模型和接口简单,易于快速实现流处理功能。在目前的主流大数据平台软件栈中(如Hortonworks的HDP和Cloudera的CDH...

biggeng
2017/07/28
0
0
使用 ZK 框架的富 Internet 应用程序

简介: ZK 是一个用 Java™ 代码编写的开源 Asynchronous JavaScript + XML (Ajax) 框架,使用该框架,您无需编写 JavaScript 代码就可以编写一个支持 Web 2.0 的富 Internet 应用程序。Doj...

红薯
2010/04/09
4.2K
8
XXL-CONF v1.4.1 发布,分布式配置管理平台

版本新特性: 1、Ehcache 缓存对象 CacheNode 序列化优化; 2、XML 配置方式,Bean 初始化时配置加载逻辑优化; 3、升级多项依赖至较新版本:spring、spring-boot、jackson、freemarker、myb...

许雪里
04/12
0
0
Zookeeper学习笔记-zookeeper介绍

一、什么是zookeeper? zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更加高级的服务,比如同步,配置管理,集群管理,命名...

binxin5108
2016/04/03
615
0
zookeeper -- 第一章 zookeeper介绍

概述:作为一枚搬砖工人,只能不能的学习,稍微偷懒感觉就要被淘汰了,赶紧弥补下。下面开始啰嗦的理论知识阐述,虽然啰嗦但是对于后续理解还是很有必要。 1、Zookeeper介绍 Zookeeper是一个...

来来来来来
01/14
3
0
分布式配置管理平台 - xxl-conf

分布式配置管理平台XXL-CONF XXL-CONF 是一个分布式配置管理平台,拥有"毫秒级动态推送、多环境、多语言、配置监听、权限控制、版本版本回滚"等特性。现已开放源代码,开箱即用。 特性 1、简...

许雪里
2015/11/29
0
1
XXL-CONF v1.4.2 发布,新增 “多环境、多语言” 等特性

版本新特性: 多环境支持:单个调度中心集群,支持自定义多套环境,管理多个环境的的配置数据;环境之间相互隔离; 多数据类型配置:支持多种数据类型配置,如:String、Boolean、Short、Int...

许雪里
05/31
0
0
ZooKeeper一二事 - 搭建ZooKeeper伪分布式及正式集群 提供集群服务

集群真是好好玩,最近一段时间天天搞集群,redis缓存服务集群啦,solr搜索服务集群啦,,,巴拉巴拉 今天说说zookeeper,之前搭建了一个redis集群,用了6台机子,有些朋友电脑跑步起来,有点...

风间影月
2016/05/02
0
0
hezui/configMenagement

基于Zookeeper的工程文件管理配置中心 在大型集群和分布式应用中,配置不宜分散到集群结点中,或者工程数量较多管理混乱,这时配置应该集中管理,这个配置中心基于使用简单,功能完善为目标,...

hezui
2015/10/14
0
0
分布式配置管理平台VS统一集中配置管理

在大型集群和分布式应用中,配置不宜分散到节点中,应该集中管理,为各种业务平台提供统一的配置管理服务。 随着业务的发展,应用系统中的配置通常会越来越多,常见的一些应用配置大致会有数...

English0523
2017/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
17分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
24分钟前
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
32分钟前
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
33分钟前
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
35分钟前
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
58分钟前
0
0
转行零基础该如何学Python?这些一定要明白!

转行零基础学Python编程开发难度大吗?从哪学起?近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大?今天,小编就来为大家详细解读一下这个问题。...

猫咪编程
58分钟前
2
0
205. Isomorphic Strings - LeetCode

Question 205. Isomorphic Strings Solution 题目大意:判断两个字符串是否具有相同的结构 思路:构造一个map,存储每个字符的差,遍历字符串,判断两个两个字符串中相同位置字符的差是否相同 Ja...

yysue
今天
0
0
聊聊EurekaRibbonClientConfiguration

序 本文主要研究一下EurekaRibbonClientConfiguration EurekaRibbonClientConfiguration spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netfl......

go4it
今天
1
0
NoSQL

一、NoSQL介绍 1、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量...

人在艹木中
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部