论坛网站建设开源工具,施工企业质量管理体系认证有效期,网站开发有哪些要求,dw网页制作教程怎么改背景Zookeeper入门 
Zookeeper 是一个开源的分布式的#xff0c;为分布式框架提供协调服务的Apache 项目。 Zookeeper工作机制 
Zookeeper从设计模式角度来理解#xff1a;是一个基于观察者模式设计的分布式服务管理框架#xff0c;它负责存储和管理大家都关心的数据#xff0c…Zookeeper入门 
Zookeeper 是一个开源的分布式的为分布式框架提供协调服务的Apache 项目。 Zookeeper工作机制 
Zookeeper从设计模式角度来理解是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据然后接受观察者的注册一旦这些数据的状态发生变化Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。 
Zookeeper特点 1Zookeeper一个领导者Leader多个跟随者Follower组成的集群。 2集群中只要有半数以上节点存活Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。 3全局数据一致每个Server保存一份相同的数据副本Client无论连接到哪个Server数据都是一致的。 4更新请求顺序执行来自同一个Client的更新请求按其发送顺序依次执行。 5数据更新原子性一次数据更新要么成功要么失败。 6实时性在一定时间范围内Client能读到最新数据。 
数据结构 
ZooKeeper 数据模型的结构与Unix 文件系统很类似整体上可以看作是一棵树每个节点称做一个ZNode。每一个ZNode 默认能够存储1MB 的数据每个ZNode 都可以通过其路径唯一标识。 
应用场景 
提供的服务包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。 
统一命名服务 
在分布式环境下经常需要对应用/服务进行统一命名便于识别。 统一配置管理 
分布式环境下配置文件同步非常常见 一般要求一个集群中所有节点的配置信息一致比如Kafka集群对配置文件修改同步到各个节点 配置管理交给Zookeeper实现 可将配置信息写入ZooKeeper上的一个Znode各个客户端服务器监听这个Znode一旦Znode中的数据被修改ZooKeeper将通知各个客户端服务器  统一集群管理 
分布式环境中实时掌握每个节点的状态是必要的 可根据节点实时状态做出一些调整 ZooKeeper可以实现实时监控节点状态变化 可将节点信息写入ZooKeeper上的一个ZNode监听Znode可获取它的实时的状态变化  服务器动态上下线 
客户端能实时洞察到服务器上下线的变化 软负载均衡 
在Zookeeper中记录每台服务器的访问数让访问数最少的服务器去处理最新的客户端请求 下载安装 
配置参数解读 
Zookeeper中的配置文件zoo.cfg中参数含义解读如下 
tickTime  2000通信心跳时间Zookeeper服务器与客户端心跳时间单位毫秒 initLimit  10LF初始通信时限 Leader和Follower初始连接时能容忍的最多心跳数tickTime的数量 syncLimit  5LF同步通信时限 Leader和Follower之间通信时间如果超过syncLimit * tickTimeLeader认为Follwer死掉从服务器列表中删除Follwer dataDir保存Zookeeper中的数据 注意默认的tmp目录容易被Linux系统定期删除所以一般不用默认的tmp目录。 clientPort  2181客户端连接端口通常不做修改。 
客户端命令行操作 
命令基本语法功能描述help显示所有操作命令ls pathls 查看当前znode的子节点 -w 监听子节点变化 -s附加次级信息create普通创建 -s 含有序列 -e临时重启或者超时消失get path获得节点的值可监听 -w 监听节点内容变化 -s 附加次级信息set设置节点的具体值stat查看节点状态delete删除节点deleteall递归删除节点 
znode节点数据信息 
查看当前znode中所包含的内容 
[zk: hadoop102 :2181(CONNECTED) 0] ls
[zookeeper]查看当前节点详细数据 
[zk: hadoop102 :2181(CONNECTED) 5] ls s /
[zookeeper]cZxid  0x0
ctime  Thu Jan 01 08:00:00 CST 1970
mZxid  0x0
mtime  Thu Jan 01 08:00:00 CST 1970
pZxid  0x0
cversion  1
dataVersion  0
aclVersion  0
ephemeralOwner  0x0
dataLength  0
numChildren  11 czxid 创建节点的事务 zxid 每次修改ZooKeeper状态都会 产生一个 ZooKeeper事务 ID。事务 ID是 ZooKeeper中所有修改总的次序。每 次 修改都有唯一的 zxid如果 zxid1小于 zxid2那么 zxid1在 zxid2之前发生。 2 ctime znode被创建的毫秒数从 1970年开始 3 mzxid znode最后更新的事务 zxid 4 mtime znode最后修改的毫秒数从 1970年开始 5 pZxid znode最后更新的子节点 zxid 6cversionznode 子节点变化号znode 子节点修改次数 7dataversionznode 数据变化号 8aclVersionznode 访问控制列表的变化号 9ephemeralOwner如果是临时节点这个是znode 拥有者的session id。如果不是 临时节点则是0。 10dataLengthznode 的数据长度 11numChildrenznode 子节点数量 节点类型持久/短暂/有序号/无序号 监听器原理 
客户端注册监听它关心的目录节点当目录节点发生变化数据改变、节点删除、子目录节点增加删除时ZooKeeper 会通知客户端。监听机制保证ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。 客户端API操作 
添加pom文件 propertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversionRELEASE/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.24/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.8.2/version/dependencydependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.5.7/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-client/artifactIdversion4.3.0/version/dependency/dependencies需要在项目的src/main/resources目录下新建一个文件命名为“ log4j.properties”在文件中填入。 
log4j.rootLoggerINFO, stdout
log4j.appender.stdoutorg.apache.log4j.ConsoleAppender
log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern%d %p [%c] - %m%n
log4j.appender.logfileorg.apache.log4j.FileAppender
log4j.appender.logfile.Filetarget/spring.log
log4j.appender.logfile.layoutorg.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern%d %p [%c] - %m%nSlf4j
public class ZKClient {// 注意逗号左右不能有空格private static final String CONNECTSTRING  127.0.0.1:2181;private static final int SESSIONTIMEOUT  2000;private ZooKeeper zookeeper;// 创建 ZooKeeper客户端Beforepublic void init() throws IOException {zookeeper  new ZooKeeper(CONNECTSTRING, SESSIONTIMEOUT, watchedEvent - {log.info(---------------------------------);ListString children;try {children  zookeeper.getChildren(/, true);for (String child : children) {log.info(child);}log.info(---------------------------------);} catch (Exception e) {e.printStackTrace();}});}// 创建子节点Testpublic void create() throws KeeperException, InterruptedException {zookeeper.create(/kangxiaozhuang, ss.avi.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}// 获取子节点并监听节点变化Testpublic void getChildren() throws KeeperException, InterruptedException {ListString children  zookeeper.getChildren(/, true);for (String child : children) {log.info(child);}// 延时Thread.sleep(5000);}// 节点是否存在Testpublic void exist() throws KeeperException, InterruptedException {Stat stat  zookeeper.exists(/atguigu, false);log.info(stat  null ? not exist  : exist);}
}客户端向服务端写数据流程 
写流程之写入请求直接发送给Leader节点 写流程之写入请求发送给follower节点 服务器动态上下线监听案例 
某分布式系统中主节点可以有多台可以动态上下线任意一台客户端都能实时感知到主节点服务器的上下线 先在集群上创建/servers 节点 
create /servers servers服务器端向Zookeeper注册代码 
package com.zhuang.zookeeper.case1;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import java.io.IOException;/*** 服务器动态上下线服务端*/
Slf4j
public class DistributeServer {private static final String CONNECTSTRING  127.0.0.1:2181;private static final int SESSIONTIMEOUT  2000;private ZooKeeper zk;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {DistributeServer server  new DistributeServer();// 1 获取zk连接server.getConnect();// 2 注册服务器到zk集群server.regist(hadoop101);// 3 启动业务逻辑睡觉server.business();}// 业务功能private void business() throws InterruptedException {Thread.sleep(Long.MAX_VALUE);}// 注册服务器private void regist(String hostname) throws KeeperException, InterruptedException {zk.create(/servers/  hostname, hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);log.info(hostname   is online);}private void getConnect() throws IOException {zk  new ZooKeeper(CONNECTSTRING, SESSIONTIMEOUT, watchedEvent - {});}
}DistributeClient客户端代码 
package com.zhuang.zookeeper.case1;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 服务器动态上下线客户端*/
Slf4j
public class DistributeClient {private static final String CONNECTSTRING  127.0.0.1:2181;private static final int SESSIONTIMEOUT  2000;private ZooKeeper zk;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {DistributeClient client  new DistributeClient();// 1 获取zk连接client.getConnect();// 2 监听/servers下面子节点的增加和删除client.getServerList();// 3 业务逻辑睡觉client.business();}private void business() throws InterruptedException {Thread.sleep(Integer.MAX_VALUE);}// 获取服务器列表信息private void getServerList() throws KeeperException, InterruptedException {// 1 获取服务器 子节点信息并且对父节点进行监听ListString children  zk.getChildren(/servers, true);// 2 存储服务器信息列表ArrayListString servers  new ArrayList();// 3 遍历所有节点获取节点中的主机名称信息for (String child : children) {byte[] data  zk.getData(/servers/  child, false, null);servers.add(new String(data));}// 打印log.info(String.valueOf(servers));}private void getConnect() throws IOException {zk  new ZooKeeper(CONNECTSTRING, SESSIONTIMEOUT, watchedEvent - {try {getServerList();} catch (Exception e) {e.printStackTrace();}});}
}ZooKeeper分布式锁案例 
什么叫做分布式锁呢比如说进程 1在使用该资源的时候会先去获得锁 进程 1获得锁以后会对该资源保持独占这样其他进程就无法访问该资源进程1用完该资源以后就将锁释放掉让其他进程来获得锁那么通过这个锁机制我们就能保证了分布式系统中多个进程能够有序的访问该临界资源。那么我们把这个分布式环境下的这个锁叫作分布式锁。 分布式锁实现 
package com.zhuang.zookeeper.case2;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;Slf4j
public class DistributedLock {// zookeeper server 列表private static final String CONNECTSTRING  127.0.0.1:2181;// 超时时间private static final int SESSIONTIMEOUT  2000;private final ZooKeeper zk;private final CountDownLatch connectLatch  new CountDownLatch(1);private final CountDownLatch waitLatch  new CountDownLatch(1);// 当前client等待的子节点private String waitPath;// 当前client创建的子节点private String currentMode;private String rootNode  locks;private String subNode  seq-;// 和 zk 服务建立连接并创建根节点public DistributedLock() throws IOException, InterruptedException, KeeperException {// 获取连接zk  new ZooKeeper(CONNECTSTRING, SESSIONTIMEOUT, watchedEvent - {// connectLatch  如果连接上zk  可以释放if (watchedEvent.getState()  Watcher.Event.KeeperState.SyncConnected) {connectLatch.countDown();}// waitLatch  需要释放if (watchedEvent.getType()  Watcher.Event.EventType.NodeDeleted  watchedEvent.getPath().equals(waitPath)) {waitLatch.countDown();}});// 等待zk正常连接后往下走程序connectLatch.await();// 判断根节点/locks是否存在Stat stat  zk.exists(/  rootNode, false);// 如果根节点不存在则创建根节点根节点类型为永久节点if (stat  null) {log.info(根节点不存在);// 创建一下根节点zk.create(/  rootNode, rootNode.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}}// 对zk加锁public void zklock() {// 创建对应的临时带序号节点try {currentMode  zk.create(/  rootNode  /  subNode, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);// wait一小会, 让结果更清晰一些Thread.sleep(10);// 判断创建的节点是否是最小的序号节点如果是获取到锁如果不是监听他序号前一个节点ListString children  zk.getChildren(/locks, false);// 如果children 只有一个值那就直接获取锁 如果有多个节点需要判断谁最小if (children.size()  1) {return;} else {Collections.sort(children);// 获取节点名称 seq-00000000String thisNode  currentMode.substring(/locks/.length());// 通过seq-00000000获取该节点在children集合的位置int index  children.indexOf(thisNode);// 判断if (index  -1) {log.error(数据异常);} else if (index  0) {// 就一个节点可以获取锁了return;} else {// 需要监听  他前一个节点变化waitPath  /locks/  children.get(index - 1);zk.getData(waitPath, true, new Stat());// 等待监听waitLatch.await();return;}}} catch (InterruptedException | KeeperException e) {e.printStackTrace();Thread.currentThread().interrupt();}}// 解锁public void unZkLock() {// 删除节点try {zk.delete(this.currentMode, -1);} catch (KeeperException | InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();}}}分布式锁测试 
(1)创建两个线程 
package com.zhuang.zookeeper.case2;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.KeeperException;import java.io.IOException;Slf4j
public class DistributedLockTest {public static void main(String[] args) throws InterruptedException, IOException, KeeperException {final DistributedLock lock1  new DistributedLock();final DistributedLock lock2  new DistributedLock();new Thread(() - {try {lock1.zklock();log.info(线程1 启动获取到锁);Thread.sleep(5000);lock1.unZkLock();log.info(线程1 释放锁);} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();}}).start();new Thread(() - {try {lock2.zklock();log.info(线程2 启动获取到锁);Thread.sleep(5000);lock2.unZkLock();log.info(线程2 释放锁);} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();}}).start();}
}(2) 观察控制台变化 线程1获取锁 线程1释放锁 线程2获取锁 线程2释放锁 Curator框架实现分布式锁案例 
原生的 Java API开发存在的问题 1) 会话连接是异步的需要自己去处理。比如使用 CountDownLatch 2) Watch需要重复注册不然就不能生效 3) 开发的复杂性还是比较高的 4) 不支持多节点删除和创建。需要自己去递归 
Curator是一个专门解决分布式锁的框架解决了原生 Java API开发分布式遇到的问题。 
详情请查看官方文档 https://curator.apache.org/index.html 
Curator案例实操 dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-client/artifactIdversion4.3.0/version/dependency代码实现 
package com.zhuang.zookeeper.case3;import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;Slf4j
public class CuratorLockTest {public static void main(String[] args) {// 创建分布式锁1InterProcessMutex lock1  new InterProcessMutex(getCuratorFramework(), /locks);// 创建分布式锁2InterProcessMutex lock2  new InterProcessMutex(getCuratorFramework(), /locks);new Thread(() - {try {lock1.acquire();log.info(线程1 获取到锁);lock1.acquire();log.info(线程1 再次获取到锁);Thread.sleep(5000);lock1.release();log.info(线程1 释放锁);lock1.release();log.info(线程1  再次释放锁);} catch (Exception e) {e.printStackTrace();Thread.currentThread().interrupt();}}).start();new Thread(() - {try {lock2.acquire();log.info(线程2 获取到锁);lock2.acquire();log.info(线程2 再次获取到锁);Thread.sleep(5000);lock2.release();log.info(线程2 释放锁);lock2.release();log.info(线程2  再次释放锁);} catch (Exception e) {e.printStackTrace();Thread.currentThread().interrupt();}}).start();}private static CuratorFramework getCuratorFramework() {ExponentialBackoffRetry policy  new ExponentialBackoffRetry(3000, 3);CuratorFramework client  CuratorFrameworkFactory.builder().connectString(127.0.0.1:2181).connectionTimeoutMs(2000).sessionTimeoutMs(2000).retryPolicy(policy).build();// 启动客户端client.start();log.info(zookeeper 启动成功);return client;}
}线程1获取锁 线程1再次获取锁 线程1释放锁 线程1再次释放锁 线程2获取锁 线程2再次获取锁 线程2释放锁 线程2再次释放锁 企业面试真题面试重点 
选举机制 
半数 机制 超过半数的投票通过即通过。 1第一次启动选举规则 投票过半数时 服务器 id大的胜出 2第二次启动选举规则 ①EPOCH大的直接胜出 ②EPOCH相同事务 id大的胜出 ③事务id相同服务器 id大的胜出 
生产集群安装多少zk合适 
安装奇数台 生产经验 
10台 服务器 3台 zk20台 服务器 5台 zk100台 服务器 11台 zk200台 服务器 11台 zk 
服务器台数多好处提高可靠性坏处提高通信延时 
常用命令 
ls、 get、 create、 delete 
SpringBoot整合Zookeeper 
采用的版本apache-zookeeper-3.8.0-bin 创建SpringBoot项目导入依赖 
propertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.6.3/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!--Curator--dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion5.2.1/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion5.2.1/version/dependency!--解决Spring Boot Configuration Annotation Processor not configured提示问题--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build配置application.yml 
curator:#重试retryCount次当会话超时出现后curator会每间隔elapsedTimeMs毫秒时间重试一次共重试retryCount次。retryCount: 5elapsedTimeMs: 5000#服务器信息connectString: 127.0.0.1:2181#会话超时时间设置sessionTimeoutMs: 60000#连接超时时间connectionTimeoutMs: 5000server:port: 80Zookeeper配置类 
package com.zhuang.zookeeper.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** description: ZkConfig* date: 2023/4/9 22:06* author: Zhuang* version: 1.0*/
Data
Component
ConfigurationProperties(prefix  curator)
public class ZkConfig {private int retryCount;private int elapsedTimeMs;private String connectString;private int sessionTimeoutMs;private int connectionTimeoutMs;}CuratorConfig 
package com.zhuang.zookeeper.config;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** description: CuratorConfig* date: 2023/4/9 22:07* author: Zhuang* version: 1.0*/
Configuration
public class CuratorConfig {Autowiredprivate ZkConfig zkConfig;/*** 这里的start就是创建完对象放到容器后需要调用他的start方法** return CuratorFramework*/Bean(initMethod  start)public CuratorFramework curatorFramework() {return CuratorFrameworkFactory.newClient(zkConfig.getConnectString(),zkConfig.getSessionTimeoutMs(),zkConfig.getConnectionTimeoutMs(),new RetryNTimes(zkConfig.getRetryCount(), zkConfig.getElapsedTimeMs()));}}创建Controller通过Postman测试 
RestController
Slf4j
public class ZookeeperController {Autowiredprivate CuratorFramework curatorFramework;}创建节点 
/*** 创建节点*/PostMapping(/create/{nodeId}/{data})public String createNode(PathVariable String nodeId, PathVariable String data) throws Exception {// 添加持久节点String path  curatorFramework.create().forPath(/  nodeId);log.info({} node :{} successfully!!!, nodeId, path);// 添加临时序号节点,并赋值数据curatorFramework.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(/  nodeId, data.getBytes());log.info({} node :{} successfully!!!, nodeId, path);byte[] bytes  curatorFramework.getData().forPath(/  nodeId);log.info(new String(bytes, StandardCharsets.UTF_8));return create  nodeId  successfully!;}获取指定节点的值 /*** 获取指定节点的值*/GetMapping(/getNode/{nodeId})public String getNode(PathVariable String nodeId) throws Exception {byte[] bytes  curatorFramework.getData().forPath(/  nodeId);log.info(new String(bytes, StandardCharsets.UTF_8));return new String(bytes, StandardCharsets.UTF_8);}获取所有节点 /*** 获取所有节点*/GetMapping(/getAllNode)public ListString getAllData() throws Exception {return curatorFramework.getChildren().forPath(/);}修改节点数据 
/*** 修改节点数据*/PutMapping(/updateData/{nodeId}/{newData})public String testSetData(PathVariable String nodeId, PathVariable String newData) throws Exception {byte[] b1  curatorFramework.getData().forPath(/  nodeId);// 两个方法都可以实现修改节点数据如果存在节点就修改值不存在就创建curatorFramework.create().orSetData().forPath(/  nodeId, newData.getBytes());//curatorFramework.setData().forPath(/curator-node, 康小庄!.getBytes());byte[] b2  curatorFramework.getData().forPath(/  nodeId);return 修改前  nodeId  节点的值  new String(b1, StandardCharsets.UTF_8)  ,修改为-  new String(b2, StandardCharsets.UTF_8);}创建节点同时创建父节点 /*** 创建节点同时创建父节点*/PostMapping(/createNode/{parentNodeId}/{childNodeId})public String createWithParent(PathVariable String parentNodeId, PathVariable String childNodeId) throws Exception {String pathWithParent  /  parentNodeId  /  childNodeId;String path  curatorFramework.create().creatingParentsIfNeeded().forPath(pathWithParent);return create node   path   successfully!!!;}删除节点(包括子节点) /*** 删除节点(包含子节点)*/DeleteMapping(/deleteNode/{nodeId})public String deleteNode(PathVariable String nodeId) throws Exception {String pathWithParent  /  nodeId;curatorFramework.delete().guaranteed().deletingChildrenIfNeeded().forPath(pathWithParent);return delete   nodeId   successfully;} 文章转载自: http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.wfcqr.cn.gov.cn.wfcqr.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.hqgxz.cn.gov.cn.hqgxz.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.kbkcl.cn.gov.cn.kbkcl.cn http://www.morning.rxkl.cn.gov.cn.rxkl.cn http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn http://www.morning.jzyfy.cn.gov.cn.jzyfy.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.pmjw.cn.gov.cn.pmjw.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.znpyw.cn.gov.cn.znpyw.cn http://www.morning.ahscrl.com.gov.cn.ahscrl.com http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.tkcz.cn.gov.cn.tkcz.cn http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn http://www.morning.thbqp.cn.gov.cn.thbqp.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.nrqnj.cn.gov.cn.nrqnj.cn http://www.morning.rqknq.cn.gov.cn.rqknq.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn http://www.morning.dfhkh.cn.gov.cn.dfhkh.cn http://www.morning.fktlr.cn.gov.cn.fktlr.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn http://www.morning.jxzfg.cn.gov.cn.jxzfg.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.xrftt.cn.gov.cn.xrftt.cn http://www.morning.gqjzp.cn.gov.cn.gqjzp.cn http://www.morning.wrtw.cn.gov.cn.wrtw.cn http://www.morning.rjynd.cn.gov.cn.rjynd.cn http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn http://www.morning.dnmgr.cn.gov.cn.dnmgr.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.rjbb.cn.gov.cn.rjbb.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.rdsst.cn.gov.cn.rdsst.cn http://www.morning.sfwcx.cn.gov.cn.sfwcx.cn http://www.morning.zcfsq.cn.gov.cn.zcfsq.cn http://www.morning.rnmmh.cn.gov.cn.rnmmh.cn http://www.morning.nlgmr.cn.gov.cn.nlgmr.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.dqxnd.cn.gov.cn.dqxnd.cn http://www.morning.fllfz.cn.gov.cn.fllfz.cn http://www.morning.nwrzf.cn.gov.cn.nwrzf.cn http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.cjsnj.cn.gov.cn.cjsnj.cn http://www.morning.wqpb.cn.gov.cn.wqpb.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.tkkjl.cn.gov.cn.tkkjl.cn http://www.morning.jcxzq.cn.gov.cn.jcxzq.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.zdwjg.cn.gov.cn.zdwjg.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.wlgpz.cn.gov.cn.wlgpz.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.ksbmx.cn.gov.cn.ksbmx.cn http://www.morning.xgmf.cn.gov.cn.xgmf.cn