2015-11-04 31 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的重定向。這可以真正解決這個問題,並且已經在高可用性中解決了這個問題。

相關問題