docker搭建zookeeper集羣以及使用java讀寫

搭建zookeeper集羣,docker-compose.yml文件內容如下

version: '3.1'

services:
  zoo1:
    image: zookeeper
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
      
networks:
  default:
    external:
      name: zookeeper_cluster2
      

可以使用java代碼鏈接到zookeeper集羣,進行節點數據的增刪改操作,代碼如下:

引入依賴:implementation 'org.apache.zookeeper:zookeeper:3.4.0'

//連接
CountDownLatch connectedSignal = new CountDownLatch(1);
ZooKeeper zoo;

zoo = new ZooKeeper("127.0.0.1:2182", 5000, new Watcher() {
    @Override
    public void process(WatchedEvent we) {
        if (we.getState() == Event.KeeperState.SyncConnected){
            connectedSignal.countDown();
        }
    }
});

connectedSignal.await();

//判斷節點是否存在
// znode path
String path = "/MyFirstZnode4"; // Assign path to znode

// data in byte array
byte[] data = "My first zookeeper app".getBytes(); // Declare data

Stat stat = zoo.exists(path, true);

//讀取數據
if (stat != null){
System.out.println("Node exists and the node version is " +
        stat.getVersion());

final CountDownLatch readedSignal = new CountDownLatch(1);
byte[] b = zoo.getData(path, new Watcher() {
    @Override
    public void process(WatchedEvent we) {
        if (we.getType() == Event.EventType.None) {
            switch(we.getState()) {
                case Expired:
                    readedSignal.countDown();
                    break;
            }

        } else {
            try {
                byte[] bn = zoo.getData(path,
                        false, null);
                String data = new String(bn,
                        "UTF-8");
                System.out.println(data);
                readedSignal.countDown();

            } catch(Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
}, null);

String data2 = new String(b, "UTF-8");
System.out.println(data2);

//修改數據
zoo.setData(path, Long.toString(System.currentTimeMillis()).getBytes(), stat.getVersion());

readedSignal.await();

//創建節點
}else {
    zoo.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}

zoo.close();

參考資料:

https://hub.docker.com/_/zookeeper

https://www.w3cschool.cn/zookeeper/zookeeper_api.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章