栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CuratorFramework实现zk同步本地配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CuratorFramework实现zk同步本地配置

SpringBoot连接Zk
连接配置
  • pom文件导入

    
            
                org.apache.curator
                curator-recipes
                4.3.0
            
            
                org.apache.curator
                curator-framework
                4.0.1
            
    
            
                org.apache.curator
                curator-client
                4.0.1
                
                    
                        log4j
                        log4j
                    
                
            
    
  • 连接配置

    zk:
      url: ###
      projectName: /itdfq/zookeeperDemo
      #休眠时间
      baseSleepTimeMs: 1000
      #失败重试次数
      maxRetries: 3
    
  • 连接设置

        
        @Bean
        public Curatorframework getCuratorframework() {
            //重试策略
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(zkProperties.getbaseSleepTimeMs(), zkProperties.getMaxRetries());
            return CuratorframeworkFactory.newClient(zkProperties.getUrl(), retryPolicy);
        }
    
        
        @Bean
        public TreeCache getTreeCache() {
            return new TreeCache(curatorframework, zkProperties.getProjectName());
        }
    
  • 初始化

      @Autowired
        private Curatorframework curatorframework;
        @Autowired
        private TreeCache treeCache;
        
        private final Properties properties = new Properties();
    
        @PostConstruct
        public void loadProperties() {
            try {
                log.info("================初始化配置=================");
                curatorframework.start();
                treeCache.start();
                // 从zk中获取配置放入本地配置中
                Stat stat = curatorframework.checkExists().forPath(zkProperties.getProjectName());
                if (stat == null) {
                    curatorframework.create().forPath(zkProperties.getProjectName());
                }
                List configList = curatorframework.getChildren().forPath(zkProperties.getProjectName());
                log.info("配置参数:{}", JSON.toJSONString(configList));
                for (String s : configList) {
                    byte[] value = curatorframework.getData().forPath(zkProperties.getProjectName() + ZkConstant.SEPARATOR + s);
                    log.info("节点:【{}】   key:【{}】   Value:【{}】 ", zkProperties.getProjectName() + ZkConstant.SEPARATOR + s, s, new String(value));
                    properties.setProperty(s, new String(value));
                }
    
                // 监听属性值变更
                treeCache.getListenable().addListener(new TreeCacheListener() {
                    @Override
                    public void childEvent(Curatorframework curatorframework, TreeCacheEvent treeCacheEvent) throws Exception {
                        if (Objects.equals(treeCacheEvent.getType(), TreeCacheEvent.Type.NODE_ADDED) ||
                                Objects.equals(treeCacheEvent.getType(), TreeCacheEvent.Type.NODE_UPDATED)) {
                            String updateKey = treeCacheEvent.getData().getPath().replace(zkProperties.getProjectName() + ZkConstant.SEPARATOR, "");
                            properties.setProperty(updateKey, new String(treeCacheEvent.getData().getData()));
                            log.info("数据更新:更新类型【{}】,更新的key:【{}】,更新value:【{}】", treeCacheEvent.getType(), zkProperties.getProjectName() + ZkConstant.SEPARATOR + updateKey, new String(treeCacheEvent.getData().getData()));
                        }
                    }
                });
    
            } catch (Exception e) {
                log.error("zk配置初始化异常", e);
            }
        }
    
get/set方法
    
    public String getProperties(String key) {
        return properties.getProperty(key);
    }

    
    public String getZkValue(String key) {
        try {
            byte[] bytes = curatorframework.getData().forPath(zkProperties.getProjectName() + ZkConstant.SEPARATOR + key);
            return new String(bytes);
        } catch (Exception e) {
            return null;
        }
    }

    
    public Boolean setZkValue(String key, String value) {
        try {
            String propertiesKey = zkProperties.getProjectName() + ZkConstant.SEPARATOR + key;
            Stat stat = curatorframework.checkExists().forPath(propertiesKey);
            if (stat == null) {
                curatorframework.create().forPath(propertiesKey);
            }
            curatorframework.setData().forPath(propertiesKey, value.getBytes());
            return Boolean.TRUE;
        } catch (Exception e) {
            return Boolean.FALSE;
        }
    }
分布式锁
   
    public InterProcessMutex getLock(String path) {
        InterProcessMutex lock = null;
        try {
            lock = new InterProcessMutex(curatorframework, zkProperties.getProjectName() + ZkConstant.SEPARATOR + path);
            return lock;
        } catch (Exception e) {
            log.error("获取锁失败", e);
        }
        return null;
    }

实现结果
  • 项目启动初始化
  • 在zk中改个配置
  • 结果
  • 在线获取配置
  @RequestMapping("/get/{key}")
    public String get(@PathVariable("key") String key) {
        log.info("请求参数:{}", key);
        return "结果:" + zkApi.getProperties(key);
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349354.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号