이번시간엔 주키퍼의 노드를 만들어 보자
일단 주키퍼 예제는
여기 있다.
주키퍼 설치는
여기
그냥 간단하게 노드 한개만 만들어 볼 예정이다.
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를 연동해서 실제 서버가 잘 돌고 있는지 알아볼 예정이다.
언제가 될지는...