zookeeper使用

67 阅读1分钟

采用docker 安装的zookeeper,比较方便端口为默认端口2181;springboot集成zk
1 创建配置类, 具体配置从配置文件yml中获取

/**
 * @Descriptin: 配置
 * @ClassName: ZookeeperConfig
 */

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.CountDownLatch;

@Data
@Configuration
@Slf4j
public class ZookeeperConfig {

    /**
     * zookeeper 地址
     */
    @Value("${zookeeper.address}")
    private String connect;

    /**
     * connect 超时时间
     */
    @Value("${zookeeper.timeout}")
    private int timeout;

    /**
     * zookeeper client
     *
     * @return
     */
    @Bean(name = "zkClient")
    public ZooKeeper zkClient() {
        ZooKeeper zooKeeper = null;
        try {
            final CountDownLatch countDownLatch = new CountDownLatch(1);
            //连接成功后,会回调watcher监听,此连接操作是异步的,执行完new语句后,直接调用后续代码
            // 可指定多台服务地址 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
            zooKeeper = new ZooKeeper(connect, timeout, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (Event.KeeperState.SyncConnected == event.getState()) {
                        //如果收到了服务端的响应事件,连接成功
                        countDownLatch.countDown();
                    }
                }
            });
            countDownLatch.await();
            log.info("【初始化ZooKeeper连接状态....】={}", zooKeeper.getState());

        } catch (Exception e) {
            log.error("初始化ZooKeeper连接异常....】={}", e);
        }
        return zooKeeper;
    }
}

2 使用

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class ZkServiceTest {

    @Autowired
    ZooKeeper zkClient;

    @Test
    void exists() {
        //zkService.exists()

    }

    @Test
    void testExists() throws KeeperException, InterruptedException {
        System.out.println(zkClient.exists("/ht_test_one", true));
        System.out.println(zkClient.exists("/ht_test_one", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println(event.getPath());
            }
        }));
    }

    @Test
    void createNode() throws KeeperException, InterruptedException {
        zkClient.create("/ht_test_one/test_two", "0521test".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    @Test
    void updateNode() throws KeeperException, InterruptedException {
        zkClient.setData("/ht_test_one/test_two", "test111".getBytes(),-1);
    }

    @Test
    void deleteNode() throws KeeperException, InterruptedException {
        zkClient.delete("/ht_test_one",-1);
    }

    @Test
    void getChildren() throws KeeperException, InterruptedException {
        String path = "/ht_test_one";
        List<String> children = zkClient.getChildren(path,false);
        for (String child : children) {
            byte[] data = zkClient.getData(path + "/" + child, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    System.out.println(event.getType());
                }
            },new Stat());

            System.out.println(new String(data));
        }
    }

    @Test
    void getData() throws KeeperException, InterruptedException {
        byte[] data = zkClient.getData("/ht_test_one/test_two", new Watcher() {
            @Override
            public void process(WatchedEvent event) {

            }
        }, new Stat());

        System.out.println(new String(data));
    }
}

注意的是: 删除节点的时候,如果有子节点不能直接删除!
game over ;
具体代码在test中

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。