引入Jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
Zookeeper配置
Zookeeper配置连接信息
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ZookeeperConfig {
@Bean("zookeeperClient")
public CuratorFramework create() {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
client.start();
return client;
}
}
Zookeeper 的使用
节点监控
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import com.plf.zookeeper.service.NodeService;
@Component
@Order(1)
public class ZookeeperInit implements CommandLineRunner {
private static final String ROOT_PATH = "/server";
public TreeCache treeCache;
@Autowired
private CuratorFramework zookeeperClient;
@Autowired
private NodeService nodeService;
@Override
public void run(String... args) throws Exception {
if (!nodeService.isExitNode(ROOT_PATH)) {
nodeService.createNode(ROOT_PATH);
}
// 监视某个节点的数据变化
treeCache = new TreeCache(zookeeperClient, ROOT_PATH);
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
ChildData eventData = event.getData();
switch (event.getType()) {
case NODE_ADDED:
System.out.println(eventData.getPath() + "节点添加" + eventData.getPath() + "\t添加数据为:"
+ new String(eventData.getData()));
break;
case NODE_UPDATED:
System.out.println(eventData.getPath() + "节点数据更新\t更新数据为:" + new String(eventData.getData())
+ "\t版本为:" + eventData.getStat().getVersion());
break;
case NODE_REMOVED:
System.out.println(eventData.getPath() + "节点被删除");
break;
default:
break;
}
}
});
// 启动监视器对象
treeCache.start();
}
}
节点新增
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class NodeService {
@Autowired
private CuratorFramework zookeeperClient;
public void createNode(String nodePath) {
try {
zookeeperClient.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)
.forPath(nodePath);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isExitNode(String path) {
try {
Stat stat = zookeeperClient.checkExists().forPath(path);
if(stat == null) {
return false;
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
还有很多其他的方法可以自行扩展。