이번시간엔 주키퍼의 노드를 만들어 보자
일단 주키퍼 예제는 여기 있다.
주키퍼 설치는 여기
그냥 간단하게 노드 한개만 만들어 볼 예정이다.

  public static void main(String[] args) throws IOException {
    String host = "wonwoo.ml:18813,wonwoo.ml:18815,wonwoo.ml:18819";
    String rootNode = "/zk_test";
    String childNode = "/zk_test/netty2";
    String data = "http://localhost:9091";
    ZookeeperWatcher zookeeperWatcher = new ZookeeperWatcher(host, rootNode, childNode, data);
    zookeeperWatcher.make();
    zookeeperWatcher.run();

  }

host는 주키퍼가 설치 되어 있는 서버이고 root 노드는 말그대로 root노드이다. childNode는 root의 child를 의미한다.
그리고 노드의 남길 data를 정의했다.
주키퍼는 비동기 콜백 형태로 되기 때문에 쓰레드를 락 걸고 했다.

public class ZookeeperWatcher implements Watcher, AsyncCallback.StringCallback {

  private ZooKeeper zooKeeper;
  private String rootNode;
  private String childNode;
  private String data;
  boolean dead = true;

  ZookeeperWatcher(String hostPort, String rootNode, String childNode, String data) throws IOException {
    this.rootNode = rootNode;
    this.childNode = childNode;
    this.data = data;
    zooKeeper = new ZooKeeper(hostPort, 6000, this);
  }

  public void make() {
    zooKeeper.create(rootNode, "root".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, this, "root");
  }

  @Override
  public void process(WatchedEvent event) {

  }

  @Override
  public void processResult(int rc, String path, Object ctx, String name) {
    KeeperException.Code code = KeeperException.Code.get(rc);
    if (code == KeeperException.Code.OK) {
      System.out.println(code);
      if ("root".equals(ctx)) {
        zooKeeper.create(childNode, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, this, null);
      }
    } else {
      dead = false;
      closing();
    }
  }

  public void run() {
    try {
      synchronized (this) {
        while (dead) {
          wait();
        }
      }
    } catch (InterruptedException e) {
    }
  }

  public void closing() {
    synchronized (this) {
      notifyAll();
    }
  }
}

나머지는 나중에 더 살펴보고 이번시간엔 make와 processResult를 알아 볼 것이다. 그냥 대충 만들었다.
make 함수의 zooKeeper.create는 아시다시피 노드를 생성 하는 것이다.
여기서 중요한건 노드가 생성한다고 하면 callback으로 성공인지 실패인지 등등 알려준다.
그게 바로 processResult 함수이다. 성공인지 실패인 알 수 있다.
그리고 노드를 만들 때 영원히 노드를 남길 것인지 아니면 세션이 있을 때만 남길 것인지 정할 수 있다.
create할때 CreateMode.PERSISTENT 속성을 넣으면 영원히
CreateMode.EPHEMERAL 속성은 해당 세션이 살아 있을 경우에 지속된다.
한번 테스트 해보자
main를 돌려보면 zk_test와 그 자식 netty2가 생겨났을 것이다.
zk_test에는 root라는 data가 netty2에는 localhost:9091 데이터가 생성 된 것을 볼 수 있다.
그 다음에는 netty2라는 노드는 세션이 살아 있을 때만 생성 했으니 세션이 끊어 버리면 사라질 것으로 예상된다.
한번 종료해보자
그럼 netty2는 사라졌다. 한 5초 이내로 사라진다. 아주 바로는 사라지지 않는다.
이것으로 주키퍼의 node생성에 대해 알아봤다.
나중에는 vertx나 netty를 연동해서 실제 서버가 잘 돌고 있는지 알아볼 예정이다.
언제가 될지는…