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. Selenium_java coding

    1)public class HelloWorld { // class 是类的意思 // 类名指的是class后面这个词,这个词是我们起的名 public static void main(Stri ...

  2. Unity3D input.GetAxis

    input.GetAxis用法:(GetAxis("Mouse X"),GetAxis("Mouse Y"),GetAxis("Mouse Scrol ...

  3. java中的多态案例

    多态性实际上有两种: 1.方法的多态性: 1.1方法重载:相同的方法名,会根据传入的参数的类型和个数不同执行不同的方法 1.2方法覆写:同一个方法名称,会根据子类的不同实现不同的功能 2.对象的多态性 ...

  4. 使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我 ...

  5. 用DotTrace 来分析.NET-Core程序

    1. 前言   看园子里面讲dotTrace 的文章不多,最近也有这方面的需要,于是去搜索了一下,.NET 性能分析方面的工具.目的呢,主要是想发现我的代码中,哪些代码占用了最多时间,来进行优化.主要 ...

  6. no zuo no die

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; name ...

  7. 51nod 1682 中位数计数

    1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均 ...

  8. ●BZOJ 3894 文理分科

    题链: https://vijos.org/d/ljt12138/p/58c696b8d3d8a16c62a248d4 (要权限号啊...用这个交吧) 题解: 题目大意:    N*M的矩阵,每个位置 ...

  9. [NOI2012]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 一天一套noi 简直了.... 昨天勉强做完了noi2011 今天教练又丢出来一套noi2012  去掉提答还有5题 勉强做了3题  先占个坑 ...

  10. centos7安装nginx必要环境

    安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行 , 在安装nginx前还要安装以下的环境包 一. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc ...