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. 史上最全TensorFlow学习资源汇总

    来源 | 悦动智能(公众号ID:aibbtcom) 本篇文章将为大家总结TensorFlow纯干货学习资源,非常适合新手学习,建议大家收藏. ▌一 .TensorFlow教程资源 1)适合初学者的Te ...

  2. scrapy中response.body 与 response.text区别

    scrapy中response.body 与 response.text区别 body http响应正文, byte类型 text 文本形式的http正文,str类型,它是response.body经 ...

  3. view-xpath

    https://addons.mozilla.org/en-US/firefox/ WebDriver Element Locator

  4. Spring-cloud(四)服务发现与消费:ribbon的使用

    说明: ribbon是spring-cloud中作为服务消费者的一种角色,客户端可以通过它来对服务提供者的服务进行消费, 比如本例中是服务提供者注册到注册中心,服务提供者提供了一个服务接口,返回一个h ...

  5. 规约模式(Specification Pattern)

    一.引言 最近在看一个项目的源码时(DDD),对里面的一些设计思想和设计思路有了一些疑问.当看到(Repository层)中使用了 spec.SatisfiedBy() 时,感觉有点懵.于是在项目中搜 ...

  6. [NOI 2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...

  7. HDU 3094 A tree game

    Problem Description Alice and Bob want to play an interesting game on a tree.Given is a tree on N ve ...

  8. [ZJOI2010]排列计数

    题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...

  9. 51nod 1179 最大的最大公约数

    1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出N个正整数,找出N个数两两之间最大公约数的最大值.例如:N = ...

  10. 2015 多校联赛 ——HDU5319(模拟)

    Painter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...