利用zookeeper实现服务上线(离线)自动感知

1、环境说明

1.1、zookeeper环境

运行于centos 6.5 X64系统zookeeper-3.4.8版本,运行于三台节点ha环境,分别对应如下:

[java]zookeeperServer1、zookeeperServer2、zookeeperServer3[/java]

1.2、开发及测试环境

win10系统jdk1.7版本

2、代码实现

2.1、服务上线注册功能开发

package com.itunic.zookeeper.server;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.test.ClientBase;

/**
 * 利用zookeeper实现服务上线功能
 * 
 * @author itunic
 * 
 */
public class Server {
 // zookeeper 服务注册根节点
 static final String SERVER_HOME = "/server";

 public static void main(String[] args) throws Exception {
 // 连接zk
        ZooKeeper zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
                ClientBase.CONNECTION_TIMEOUT, new Watcher() {
 @Override
 public void process(WatchedEvent arg0) {
                        System.out.println("启动");
                    }
                });
        createNode(zk, args);
        Thread.sleep(Long.MAX_VALUE);
    }

 /**
     * 更新zk节点
     * 
     * @param zk
     * @param args
     * @throws Exception
     */
 public static void createNode(ZooKeeper zk, String[] args) throws Exception {
        zk.create(SERVER_HOME + "/" + args[0], args[0].getBytes(), Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL_SEQUENTIAL);
    }
}
2.2、实现服务上线/离线自动感知
package com.itunic.zookeeper.client;

import java.util.ArrayList;
import java.util.List;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.test.ClientBase;

/**
 * 利用zookeeper实现服务上线离线自动感知
 *
 * @author itunic
 *
 */
public class Client {
 static final String SERVER_HOME = "/server";
 private ZooKeeper zk = null;

 // 获取zk连接
 private void getZkClient() throws Exception {
        zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
                ClientBase.CONNECTION_TIMEOUT, new Watcher() {
 @Override
 public void process(WatchedEvent event) {
 if (event.getType() == EventType.None)
 return;
 try {
 // 获取新的服务器列表,重新注册监听
                            updateServers();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    }

 /**
     * 从zk中获取在线服务器信息
     */
 public void updateServers() throws Exception {
 // 从servers父节点下获取到所有子节点,并注册监听
        List<String> children = zk.getChildren(SERVER_HOME, true);
        ArrayList<String> serverList = new ArrayList<String>();
 for (String child : children) {
 byte[] data = zk.getData(SERVER_HOME + "/" + child, false, null);
            serverList.add(new String(data));
        }
        System.out.println("最新服务器节点");
 for (String server : serverList) {
            System.out.println(server);
        }
    }

 public static void main(String[] args) throws Exception {
        Client client = new Client();
 // 先构造一个zk的连接
        client.getZkClient();
 // 获取服务器列表
        client.updateServers();
        Thread.sleep(Long.MAX_VALUE);
    }
}

3、打包测试

3.1将Server.java && Client.java 打包为 Runnable JAR file

3.2、运行client

这里可以看到zk下根节点server下面是没有东西的

3.3、启动一个Server并取名为testServer01

启动后查看zk控制台

这里可以看到已经有了一个节点了,再看一下client控制台是否能感知到

ok,已经感知到了testServer01上线

关于服务离线检测时间问题:服务离线后并不会像上线一样立即感知,而是基于zk设置的心跳时间来检测。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DannyHoo的专栏

XML解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

16820
来自专栏walterlv - 吕毅的博客

使用 Task.Wait()?立刻死锁(deadlock)

发布于 2017-10-27 15:54 更新于 2018-04...

12210
来自专栏编程心路

一文读懂SpringMVC中的文件上传与下载

这两天研究了一下 SpringMVC 中文件上传与下载,也遇到了一些坑,这里做个总结。

42740
来自专栏Java3y

WebService就是这么简单

WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧…. 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那...

5.2K150
来自专栏java达人

ThreadLocal与Spring 事务管理

编写线程安全代码的关键是管理程序中的共享可变状态,除了通过synchronized加锁机制防止多个线程同时访问同一段数据外,还有一种方法就是通过ThreadLo...

258100
来自专栏Linux驱动

15.linux-LCD层次分析(详解)

如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口。 什么是...

28460
来自专栏雨过天晴

转 PHP-redis编译成功

18730
来自专栏黑泽君的专栏

SolrCloud搭建 + zookeeper集群搭建 + 搜索功能切换到集群版 + httpclient学习 + 全局异常处理器

索引集合包括两个Shard(Shard1和Shard2),Shard1和Shard2分别由三个Core组成,其中一个Leader两个Replication,L...

22120
来自专栏Vamei实验室

来玩Play框架06 用户验证

用户验证(User Authentification)复合的使用Play框架的数个功能,包括前面已经了解的表单和数据库,以及这篇文章里要提到的加密和会话。根据应...

24170
来自专栏java相关

Mac OS使用brew安装memcached

12910

扫码关注云+社区

领取腾讯云代金券