【问题标题】:Good Zookeeper Hello world Program with Java client带有 Java 客户端的优秀 Zookeeper Hello world 程序
【发布时间】:2016-02-05 02:32:27
【问题描述】:

我试图在我们的项目中使用 Zookeeper。可以运行服务器..甚至使用 zkcli.sh 测试它.. 一切都很好.. 但是找不到一个好的教程让我使用 Java 连接到这个服务器!我在 Java API 中只需要一个方法

public String getServiceURL ( String serviceName ) 

我试过https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index --> 对我不好。

http://zookeeper.apache.org/doc/trunk/javaExample.html :还可以;但无法清楚地理解概念!我觉得解释得不好..

【问题讨论】:

  • 也许你应该重新表述你的问题并避免使用“教程”;-)
  • 我认为通过询问类似“我的 Zookeeper Hello World 程序有什么问题?”之类的问题可能会更好地重新表述这个问题,并在问题中包含示例代码,并引用您目前拥有的现有参考资料。
  • 不知道谁能在他们的正常头脑中否定这个问题。同一个人在下面提供的问题和答案对我帮助很大!谢谢迪帕克!!!

标签: java apache-zookeeper


【解决方案1】:

最后,这是我想出的最简单、最基本的程序,它将帮助您使用 ZooKeeper“入门”:

package core.framework.zookeeper;

import java.util.Date;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ZkConnect {
    private ZooKeeper zk;
    private CountDownLatch connSignal = new CountDownLatch(0);

    //host should be 127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002
    public ZooKeeper connect(String host) throws Exception {
        zk = new ZooKeeper(host, 3000, new Watcher() {
            public void process(WatchedEvent event) {
                if (event.getState() == KeeperState.SyncConnected) {
                    connSignal.countDown();
                }
            }
        });
        connSignal.await();
        return zk;
    }

    public void close() throws InterruptedException {
        zk.close();
    }

    public void createNode(String path, byte[] data) throws Exception
    {
        zk.create(path, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    public void updateNode(String path, byte[] data) throws Exception
    {
        zk.setData(path, data, zk.exists(path, true).getVersion());
    }

    public void deleteNode(String path) throws Exception
    {
        zk.delete(path,  zk.exists(path, true).getVersion());
    }

    public static void main (String args[]) throws Exception
    {
        ZkConnect connector = new ZkConnect();
        ZooKeeper zk = connector.connect("54.169.132.0,52.74.51.0");
        String newNode = "/deepakDate"+new Date();
        connector.createNode(newNode, new Date().toString().getBytes());
        List<String> zNodes = zk.getChildren("/", true);
        for (String zNode: zNodes)
        {
           System.out.println("ChildrenNode " + zNode);   
        }
        byte[] data = zk.getData(newNode, true, zk.exists(newNode, true));
        System.out.println("GetData before setting");
        for ( byte dataPoint : data)
        {
            System.out.print ((char)dataPoint);
        }

        System.out.println("GetData after setting");
        connector.updateNode(newNode, "Modified data".getBytes());
        data = zk.getData(newNode, true, zk.exists(newNode, true));
        for ( byte dataPoint : data)
        {
            System.out.print ((char)dataPoint);
        }
        connector.deleteNode(newNode);
    }

}

【讨论】:

  • 感谢您的示例。需要注意的是,默认情况下您需要将 CountDownLatch 设置为 0 以外的值,因为 .await() 将在锁存器达到 0 时返回,这是默认值。如果在 event.getState() == KeeperState.SyncConnected 时将其设置为 1,它将启动计时器并在间隔 1 达到 0 后,因此返回 zk。
  • main方法中传递给connect的主机,是不是因为没有提到端口而出错。
  • @JSR29 Zookeeper 假设您使用的是 2181。
  • 这段代码是一个死锁。有人成功吗? watcher.process 在 remove latch.await 后执行
【解决方案2】:

这篇文章几乎包含了与 Zookeeper 交互所需的所有操作。 https://www.tutorialspoint.com/zookeeper/zookeeper_api.htm

  1. 使用数据创建 ZNode
  2. 删除ZNode
  3. 获取 ZNodes(Children) 列表
  4. 检查 ZNode 是否存在
  5. 编辑 ZNode 的内容...

【讨论】:

    【解决方案3】:

    这篇博文 Zookeeper Java API examples 包含一些很好的示例,如果您正在寻找 Java 示例。 Zookeeper 还提供了一个非常易于使用的客户端 API 库(C 和 Java)。

    Zookeeper 是最好的开源服务器和服务之一,有助于可靠地协调分布式进程。 Zookeeper 是一个提供一致性和分区容错性的 CP 系统(请参阅 CAP 定理)。 Zookeeper 状态在所有节点之间的复制使其成为最终一致的分布式服务。

    【讨论】:

      【解决方案4】:

      这很简单。我正在构建一个工具,它将使用 ZK 来锁定正在处理的文件(因此是类名):

      package mypackage;
      
      import java.io.IOException;
      import java.util.List;
      
      import org.apache.zookeeper.KeeperException;
      import org.apache.zookeeper.WatchedEvent;
      import org.apache.zookeeper.ZooKeeper;
      import org.apache.zookeeper.Watcher;
      
      public class ZooKeeperFileLock {
      
        public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
      
          String zkConnString = "<zknode1>:2181,<zknode2>:2181,<zknode3>:2181";
      
          ZooKeeperWatcher zkWatcher = new ZooKeeperWatcher();
          ZooKeeper client = new ZooKeeper(zkConnString, 10000, zkWatcher);
      
          List<String> zkNodes = client.getChildren("/", true);
      
          for(String node : zkNodes) {
            System.out.println(node);
          }
        }
      
        public static class ZooKeeperWatcher implements Watcher {
      
          @Override
          public void process(WatchedEvent event) {
          }
      
        }
      

      【讨论】:

      • 哇,为什么投反对票?这列出了 ZK Chroot 目录中的所有节点,并且非常简单。我怎么知道谁投了反对票?请在投反对票并继续前进之前先澄清一下。
      • 我给了你 UPVOTE :)。这对我很有帮助。有时人们在没有任何解释的情况下投票。我也遇到过。
      • 您实际上并没有使用任何文件。我认为你的程序只是列出了根 znodes
      • 是的,我可以编辑。那是我正在编写的实际程序中使用的存根代码。感谢您的提醒。
      • "会话建立是异步的。"您不是在等待与 Zookeeper 建立连接。
      【解决方案5】:

      如果您在 AWS 上;现在我们可以创建内部 ELB,它支持基于 URI 的重定向 .. 这可以真正解决这个问题,因为它已经融入了高可用性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多