服务器动态上下线

1.需求

某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

注意:创建的都是临时节点;创建在父路径下;根节点是永久的;

未避免重复注册,注册的节点是临时节点;

3.具体实现

(0)先在集群上创建/servers节点

[zk: localhost:2181(CONNECTED) 10] create /servers "servers"

Created /servers

(1)服务器端向Zookeeper注册代码

public class DistributeServer {

   private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";

   private static int sessionTimeout = 2000;

   private ZooKeeper zk = null;

   private String parentNode = "/servers";

  

   // 创建到zk的客户端连接

   public void getConnect() throws IOException{

      zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

          @Override

          public void process(WatchedEvent event) {

          }

      });

    }

   // 注册服务器

   public void registServer(String hostname) throws Exception{

 

      String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

     

      System.out.println(hostname +" is online "+ create);

   }

  

   // 业务功能

   public void business(String hostname) throws Exception{

      System.out.println(hostname+" is working ...");

      Thread.sleep(Long.MAX_VALUE);

   }

 

   public static void main(String[] args) throws Exception {

// 1获取zk连接

      DistributeServer server = new DistributeServer();

      server.getConnect();

     

      // 2 利用zk连接注册服务器信息

      server.registServer(args[0]);

     

      // 3 启动业务功能

      server.business(args[0]);

    }

}

(2)客户端代码

public class DistributeClient {

 

   private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";

   private static int sessionTimeout = 2000;

   private ZooKeeper zk = null;

   private String parentNode = "/servers";

 

   // 创建到zk的客户端连接

   public void getConnect() throws IOException {

      zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

 

          @Override

          public void process(WatchedEvent event) {

 

             // 再次启动监听

             try {

                 getServerList();

             } catch (Exception e) {

                 e.printStackTrace();

             }

          }

      });

   }

 

   // 获取服务器列表信息

   public void getServerList() throws Exception {

     

      // 1获取服务器子节点信息,并且对父节点进行监听

      List<String> children = zk.getChildren(parentNode, true);

 

        // 2存储服务器信息列表

      ArrayList<String> servers = new ArrayList<>();

     

        // 3遍历所有节点,获取节点中的主机名称信息

      for (String child : children) {

          byte[] data = zk.getData(parentNode + "/" + child, false, null);

 

          servers.add(new String(data));

      }

 

        // 4打印服务器列表信息

      System.out.println(servers);

   }

 

   // 业务功能

   public void business() throws Exception{

 

      System.out.println("client is working ...");

Thread.sleep(Long.MAX_VALUE);

   }

 

   public static void main(String[] args) throws Exception {

 

      // 1获取zk连接

      DistributeClient client = new DistributeClient();

      client.getConnect();

 

      // 2获取servers的子节点信息,从中获取服务器信息列表

      client.getServerList();

 

      // 3业务进程启动

      client.business();

   }

}

猜你喜欢

转载自blog.csdn.net/syc0616/article/details/108568752