连接配置
-
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()); } ListconfigList = 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); } }
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);
}



