1智听、Code -> GitHub
https://github.com/liufengji/zookeeper_code.git
2哥艇、需求
某分布式系統(tǒng)中,主節(jié)點可以有多臺,可以動態(tài)上下線膳凝,任意一臺客戶端都能實時感知到主節(jié)點服務(wù)器的上下線
3、需求分析
4抬驴、先在集群上創(chuàng)建/servers節(jié)點
[zk: localhost:2181(CONNECTED) 10] create /servers "servers"
5秒啦、服務(wù)器端代碼
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
public class ZKServer {
private String connectString = "node1:2181,node2:2181,node3:2181";
private int sessionTimeout = 2000;
private String parentNode = "/servers";
ZooKeeper zkClient;
// 建立連接
public void getConnection() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) { }
});
}
// 業(yè)務(wù)
public void business() throws InterruptedException{
System.out.println("添加節(jié)點了…");
Thread.sleep(Long.MAX_VALUE);
}
// 注冊
public void regist(String hostname) throws KeeperException, InterruptedException {
String create = zkClient.create(parentNode + "/server",
hostname.getBytes(),
Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(hostname + " is online " + create);
}
public static void main(String[] args) throws Exception {
ZKServer zkServer = new ZKServer();
// 1 建立連接
zkServer.getConnection();
// 2 注冊
zkServer.regist(args[0]);
// 3 具體業(yè)務(wù)處理
zkServer.business();
}
}
6、客戶端代碼
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class ZKClient {
private String connectString = "node1:2181,node2:2181,node3:2181";
private int sessionTimeout = 2000;
ZooKeeper zkClient;
private String parentNode = "/servers";
// 獲取連接
public void getConnect() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
getServersList();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
// 監(jiān)聽節(jié)點變化
public void getServersList() throws KeeperException, InterruptedException{
List<String> children = zkClient.getChildren(parentNode, true);
ArrayList<String> servers = new ArrayList<>();
for (String node : children) {
byte[] data = zkClient.getData(parentNode+"/"+node, false, null);
servers.add(new String(data));
}
System.out.println(servers);
}
// 業(yè)務(wù)
public void business() throws InterruptedException{
System.out.println("節(jié)點狀態(tài)");
Thread.sleep(Long.MAX_VALUE);
}
public static void main(String[] args) throws Exception {
ZKClient zk = new ZKClient();
// 1 獲取連接
zk.getConnect();
// 2 監(jiān)聽節(jié)點變化
zk.getServersList();
// 3 業(yè)務(wù)邏輯處理
zk.business();
}
}