1、Zookeeper 应用案例(上下线动态感知)

8.1 案例1——服务器上下线动态感知

8.1.1 需求描述

某分布式系统中,主节点可以有多台,可以动态上下线

任意一台客户端都能实时感知到主节点服务器的上下线

8.1.2 设计思路

8.1.3 代码开发

1、客户端实现

package cn.com.toto.zkonlineoroffline;

import java.util.ArrayList;

import java.util.List;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

public class DistributedClient {

private static final String connectString = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

private static final int sessionTimeout = 2000;

private static final String parentNode = "/servers";

// 注意:加volatile的意义何在?

private volatile List<String> serverList;

private ZooKeeper zk = null;

/**

* 创建到zk的客户端连接

*

* @throws Exception

*/

public void getConnect() throws Exception {

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

@Override

public void process(WatchedEvent event) {

// 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)

try {

//重新更新服务器列表,并且注册了监听

getServerList();

} catch (Exception e) {

}

}

});

}

/**

* 获取服务器信息列表

*

* @throws Exception

*/

public void getServerList() throws Exception {

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

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

// 先创建一个局部的list来存服务器信息

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

for (String child : children) {

// child只是子节点的节点名

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

servers.add(new String(data));

}

// 把servers赋值给成员变量serverList,已提供给各业务线程使用

serverList = servers;

//打印服务器列表

System.out.println(serverList);

}

/**

* 业务功能

*

* @throws InterruptedException

*/

public void handleBussiness() throws InterruptedException {

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

Thread.sleep(Long.MAX_VALUE);

}

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

// 获取zk连接

DistributedClient client = new DistributedClient();

client.getConnect();

// 获取servers的子节点信息(并监听),从中获取服务器信息列表

client.getServerList();

// 业务线程启动

client.handleBussiness();

}

}

2、服务器端实现

package cn.com.toto.zkonlineoroffline;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.data.Stat;

public class DistributedServer {

private static final String CONNECT_STRING = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

private static final int SESSION_TIME_OUT = 2000;

private static final String PARENT_NODE = "/servers";

private ZooKeeper zk = null;

CountDownLatch countDownLatch = new CountDownLatch(1);

/**

* 创建到zk的客户端连接

*

* @throws Exception

*/

public void getConnect() throws Exception {

zk = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, new Watcher() {

@Override

public void process(WatchedEvent event) {

if(event.getState()==KeeperState.SyncConnected){

countDownLatch.countDown();

}

}

});

countDownLatch.await();

}

/**

* 向zk集群注册服务器信息

*

* @param hostname

* @throws Exception

*/

public void registerServer(String hostname) throws Exception {

Stat exists = zk.exists(PARENT_NODE, false);

if(exists==null) zk.create(PARENT_NODE, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

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

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

}

/**

* 业务功能

*

* @throws InterruptedException

*/

public void handleBussiness(String hostname) throws InterruptedException {

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

Thread.sleep(Long.MAX_VALUE);

}

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

DistributedServer server = new DistributedServer();

// 获取zk连接

server.getConnect();

// 利用zk连接注册服务器信息(主机名)

server.registerServer(args[0]);

// 启动业务功能

server.handleBussiness(args[0]);

}

}

学习笔记:Zookeeper 应用案例(上下线动态感知)的更多相关文章

  1. c++学习笔记之封装篇(上)

    title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...

  2. Spark学习笔记2——RDD(上)

    目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...

  3. [原创]java WEB学习笔记50:文件上传案例

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. 深度学习笔记 (二) 在TensorFlow上训练一个多层卷积神经网络

    上一篇笔记主要介绍了卷积神经网络相关的基础知识.在本篇笔记中,将参考TensorFlow官方文档使用mnist数据集,在TensorFlow上训练一个多层卷积神经网络. 下载并导入mnist数据集 首 ...

  6. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

  7. python学习笔记六 初识面向对象上(基础篇)

    python面向对象   面向对象编程(Object-Oriented Programming )介绍   对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...

  8. PHP学习笔记--文件目录操作(文件上传实例)

    文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...

  9. 十四、Hadoop学习笔记————Zookeeper概述与基本概念

    顺序一致性:严格按照顺序在zookeeper上执行 原子性:所有事物请求的结果,在整个集群的应用情况一致 单一视图:无论从哪个服务器进入集群,看到的东西都是一致的 可靠性:服务端成功响应后,状态会 一 ...

随机推荐

  1. CWMP开源代码研究——cwmp移植

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  2. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  3. Python系列之 - 线程基础

    一.什么是线程 线程:顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才 ...

  4. PyQT5 helloworld教程(转载)

    转载节选自该博客地址:http://blog.csdn.net/u013401853/article/details/54581512,博主的步骤写的很详细,感谢! QT Creator安装 因为我们 ...

  5. Python获取会议部分的信息内容(不断完善中)

    这是一个用于获取物理师会议报告的简单爬虫,数据库表结构正在不断完善中 爬虫信息: # -*- coding:utf-8 -*- import urllib.request import pymysql ...

  6. 基于vfs实现自己的文件系统

    1.Linux 文件系统组成结构 linux文件系统有两个重要的特点:一个是文件系统抽象出了一个通用文件表示层--虚拟文件系统或称做VFS.另外一个重要特点就是它的文件系统支持动态安装(或说挂载等), ...

  7. ●BZOJ 1272 [BeiJingWc2008]Gate Of Babylon

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1272 题解: 容斥,Lucas定理本题的容斥考虑类似 [BZOJ 1042 [HAOI200 ...

  8. hdu 4609 (FFT求解三角形)

    Problem Description King OMeGa catched three men who had been streaking in the street. Looking as id ...

  9. LCT模板(BZOJ2631)

    用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和. #include <cstdio> #include <algorithm> #define l(x) ...

  10. 后缀自动机模板(SPOJ1811)

    用后缀自动机实现求两个串的最长公共子串. #include <cstdio> #include <algorithm> ; char s[N]; ]; int main() { ...