2015-11-04 34 views
-3

我正试图在我们的项目中使用Zookeeper。可以运行服务器..即使使用zkcli.sh测试它..所有好.. 但找不到一个很好的教程,使用Java连接到此服务器!所有我需要的Java API是一个方法好的Zookeeper Hello世界程序与Java客户端

public String getServiceURL (String serviceName) 

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

http://zookeeper.apache.org/doc/trunk/javaExample.html:好的分类;但不能清楚地理解概念!我觉得这是没有解释以及..

+2

也许您应该更改您的问题并避免使用“tutorial”;-) – Marged

+3

我认为通过询问诸如“我的Zookeeper Hello World程序出现了什么错误?”这样的问题,可以通过示例代码来更好地解释问题,并引用了现有的引用。 – entpnerd

回答

12

最后,这是我想出了这将有助于你与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); 
    } 

} 
+3

感谢您的示例。应该注意的是,默认情况下需要将CountDownLatch设置为0以外的值,因为一旦锁存器达到默认值0即会返回.await()。如果在event.getState()== KeeperState.SyncConnected时将其设置为1,则它将启动计时器,并在间隔1达到0后返回zk。 – ammills01

+0

在主要方法中通过连接的主机,因为没有提到端口而错误。 – JSR29

3

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

Zookeeper是帮助可靠地协调分布式流程的最佳开源服务器和服务之一。 Zookeeper是一个提供一致性和分区容限的CP系统(参见CAP定理)。在所有节点中复制Zookeeper状态使其成为最终一致的分布式服务。

1

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

相关问题