文档章节

Zookeeper动态上下线感应(代码演示)

伤了心的蜻蜓在唱歌
 伤了心的蜻蜓在唱歌
发布于 2017/03/29 17:14
字数 638
阅读 12
收藏 0

客户端:

package com.dd171290.zk.line;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper.States;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;

/**
 * 用于模拟客户端的启动操作
 * @author root
 *
 */
public class Client {
	private static final String CONNECTSTRING="sf-node1.hadoop.com:2181,sf-node2.hadoop.com:2181,sf-node3.hadoop.com:2181";
	private static final int SESSION_TIME_OUT=2000;
	private static final String SERVER_PATH="/servers";
	//使用volalite关键字时为了确保多线程在进行共享该变量操作时,都能够正确访问数据。
	//但是该关键字并不能确保线程安全,只有当该变量进行的是原子操作时,线程是安全的。
	private volatile List<String> serverList=new ArrayList<String>();
	private static ZooKeeper zk;
	static CountDownLatch latch=new CountDownLatch(1);
	public Client() {
		try {
			zk=new ZooKeeper(CONNECTSTRING, SESSION_TIME_OUT, new Watcher(){
				public void process(WatchedEvent event) {
					//获取服务器列表,并再次注册监听
					try {
						if(event.getState()==KeeperState.SyncConnected){
							latch.countDown();
						}
						getServerList();
						doBussiness();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取已经注册服务器列表
	 * @throws Exception
	 */
	public void getServerList() throws Exception{
		//获取子节点,并监听该节点的变化,当该节点的子节点有增加或者删除时,触发监听
		List<String> children=zk.getChildren(SERVER_PATH, true);
		List<String> servers=new ArrayList<String>();
		for (String child : children) {
			//获取子节点存取的数据
			byte[] server=zk.getData(SERVER_PATH+"/"+child, false, null);
			servers.add(new String(server));
		}
		serverList=servers;
	}
	
	public void doBussiness(){
		System.out.println("client:"+serverList);
	}
	
	public static void main(String[] args) throws Exception {
		//实例化时已经建立zk连接
		Client client=new Client();
		if(States.CONNECTING==zk.getState()){
			latch.await();
		}
		//获取服务武器列表,并注册监听
		client.getServerList();
		//多个线程开始处理业务
		client.doBussiness();
		Thread.sleep(Long.MAX_VALUE);
		
	}
}

服务器端:

package com.dd171290.zk.line;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
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.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper.States;

public class Server {
	private static final String CONNECTSTRING="sf-node1.hadoop.com:2181,sf-node2.hadoop.com:2181,sf-node3.hadoop.com:2181";
	private static final int SESSION_TIME_OUT=2000;
	private static final String SERVER_PATH="/servers";
	private static ZooKeeper zk;
	static CountDownLatch latch=new CountDownLatch(1);
	public Server() {
		try {
			//获取zk连接
			zk=new ZooKeeper(CONNECTSTRING, SESSION_TIME_OUT, new Watcher(){
				public void process(WatchedEvent event) {
					if(event.getState()==KeeperState.SyncConnected){
						latch.countDown();
					}
				}
			});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void doBussiness(String hostname){
		System.out.println(hostname+" starts working....");
	}
	public static void main(String[] args) {
		Server server=new Server();
		if(args.length!=1){
			System.out.println("服务器参数名未指定!");
			System.exit(-1);
		}
		String hostname=args[0];
		try {
			//判断节点是否是否存在,不存在返回null值,并且创建该节点。这里容易出现错误: KeeperErrorCode = ConnectionLoss for /servers
			//原因在于此时正在与zookeeper服务集群连接,即zk的状态时CONNECTING,并没有真正的建立连接
			//就解决办法:CountDownLatch 倒数计数
			
			if(States.CONNECTING==zk.getState()){
				latch.await();
			}
			if(zk.exists(SERVER_PATH, false) == null){
				zk.create(SERVER_PATH, "server".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			}
			String path=zk.create(SERVER_PATH+"/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
			System.out.println("服务器注册的路径是:"+path);
			Thread.sleep(Integer.MAX_VALUE);
		} catch (KeeperException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

 

© 著作权归作者所有

伤了心的蜻蜓在唱歌
粉丝 0
博文 9
码字总数 9841
作品 0
开封
私信 提问
大数据教程(3.9):zookeeper分布式应用系统服务器上下线动态感知程序开发_

之前在zookeeper介绍时,有提到过zookeeper的应用场景有服务器上下线动态感知、分布式共享锁等等。本节博主将为大家提供一个分布式服务动态感知的事例,在后期博主的开源项目中的自己开发远程...

em_aaron
2018/08/05
24
0
大数据教程(3.3):zookeeper简介

一、概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功...

em_aaron
2018/07/28
75
0
RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

  序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果。服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用。然我们自己动手从0开始写一个...

刘洋intsmaze
2016/11/13
0
0
【分布式协调服务】-- zookeeper 出现背景

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/88421263 集群服务的问题: 协议地址的维护 一个服务分别部署在多个服务器上,每个...

杨晓慧_Hepburn
03/12
0
0
linux下zookeeper的集群搭建

第一次写博客 写的不好不要骂┗|`O′|┛ 嗷~~ 首先说一下Zookeeper的概念: Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务 A、zookeeper是为别的分布式程序服务的...

zhaobocan
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0
jar 更新部分文件

C:\Program Files (x86)\Java\jdk1.8.0_102\bin>jar -hIllegal option: hUsage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...Options: -c c......

圣洁之子
今天
9
0
OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @胖达panda:分享歌词: 我有一只小毛驴我从来也不骑,有一天我心血来潮骑着去赶集,我手里拿着小皮鞭我心里正得意,不知怎么哗啦啦,我摔了一...

小小编辑
今天
2.6K
13
DDD(四)

1,引言 软件开发者大多趋向于将关注点放在数据上,而不是领域上。这对于刚入门的DDD的新手而言也是如此。以我目前的思考方式,数据库依然占据主要的地位。开发一个功能,首先我就会考虑我会...

MrYuZixian
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部