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

相关文章

来自专栏Linux驱动

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

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

2416
来自专栏有趣的django

Django rest framework源码分析(4)----版本

版本  新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models c...

3576
来自专栏DannyHoo的专栏

XML解析

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

1322
来自专栏晓晨的专栏

C#获取根目录的方法集合

1673
来自专栏JavaQ

使用Spring Data Redis实现数据缓存

引言 目前很多系统为了解决数据读写的性能瓶颈,在系统架构设计中使用Redis实现缓存,Spring框架为了让开发人员更加方便快捷的使用Redis实现缓存,对Re...

3646
来自专栏java达人

ThreadLocal与Spring 事务管理

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

21810
来自专栏程序你好

不同的.Net版本客户端软件调用Java Web Service区别

最近的系统中需要.Net开发的离线端软件通过Web Service技术和Java开发的在线系统进行数据交互。

963
来自专栏岑玉海

Hadoop源码系列(一)FairScheduler申请和分配container的过程

1、如何申请资源 1.1 如何启动AM并申请资源 1.1.1 如何启动AM val yarnClient = YarnClient.createYarnClie...

4193
来自专栏YouMeek

一个Java程序员眼中的Mac OS(系列六:终端方案iTerm2 + Zsh)

本文初衷 整理自己脑袋中、收藏中的那些资料,来一次清空,让自己重新开始。 帮助 Mac 后来者,减少他/她入门成本 如果你不是后台开发者,一般不需要用到这个东西...

4438
来自专栏你不就像风一样

Spring boot webSocket从入门到放弃

在构建Spring boot项目时已经提供webSocket依赖的勾选。webSocket是TCP之上的一个非常薄的轻量级层 ,webSocket主要的应用场景...

1123

扫码关注云+社区