利用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 条评论
登录 后参与评论

相关文章

来自专栏Jaycekon

Spring-boot:5分钟整合Dubbo构建分布式服务

概述:   Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服...

5159
来自专栏IT综合技术分享

使用Dropwizard搭建一个Hello World

官方例子中main方法写在Application类中,我这里将其提出来了,方便大家理解。

1013
来自专栏SpringBoot 核心技术

第二十八章:SpringBoot使用AutoConfiguration自定义Starter

1637
来自专栏无题

Spring Boot核心原理-自动配置

为什么spring boot能够如此简单的让我们迅速上手。 之前在公司内部推行spring boot时,有同事跟我提到过,感觉换到spring boot这个框...

3634
来自专栏开发技术

spring-boot-2.0.3不一样系列之shiro - 搭建篇

       上一篇:spring-boot-2.0.3不一样系列之国际化,讲了如何实现国际化,实际上我工作用的模版引擎是freemaker,而不是thymel...

1801
来自专栏菩提树下的杨过

spring cloud:Edgware.RELEASE版本中zuul回退方法的变化

Edgware.RELEASE以前的版本中,zuul网关中有一个ZuulFallbackProvider接口,代码如下: public interface Zu...

2126
来自专栏大数据和云计算技术

hdfs auditlog(审计日志)

hdfs审计日志(Auditlog)记录了用户针对hdfs的所有操作,详细信息包括操作成功与否、用户名称、客户机地址、操作命令、操作的目录等。对于用户的每一个...

723
来自专栏菩提树下的杨过

ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表

zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机...

5386
来自专栏Hadoop实操

如何通过Livy的RESTful API接口向Kerberos环境的CDH集群提交作业

在前面的文章Fayson介绍了《Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs》、《如何编译Livy并在非Kerber...

71511
来自专栏Ryan Miao

Spring Boot文档阅读

原因之初 最初习惯百度各种博客教程,然后跟着操作,因为觉得跟着别人走过的路走可以少走很多弯路,省时间。然而,很多博客的内容并不够完整,甚至错误,看多了的博客甚至...

4117

扫码关注云+社区