SpringBoot整合Zookeeper

引入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;
	}
}

还有很多其他的方法可以自行扩展。

相关推荐
GreenTea8 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈8 小时前
FDE:一个缩写,两种命运
后端
名字还没想好☜10 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
明月_清风10 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端
GetcharZp11 小时前
5 分钟拥有自己的 S3:RustFS 上手(MinIO 的 Rust 替代,Apache 2.0 可商用)
后端
行百里er12 小时前
Redis 版本演进、新特性与协议那些事儿
redis·后端
Joy T12 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
打工仔折腾 AI13 小时前
FastAPI 从本机到生产服务器:Nginx+Gunicorn+Uvicorn 完整部署实录
人工智能·后端·python·nginx·fastapi·gunicorn
IT_陈寒13 小时前
Java空指针这次真把我坑惨了
前端·人工智能·后端