5.zookeeper应用案例之分布式服务器动态上下线感知

zookeeper应用案例之分布式服务器动态上下线感知,当服务器上线和下线时候客户端都能感知到,还有哪些机器在线.并对zookeeper管理的服务器进行节点的监听;

代码实现:客户端

每当服务端有服务器上线或下线 在客户端都能通过监听感知到

package org.zookeeper.anli;

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;

public class ZookeeperClient {

	private volatile List<String> servers = null;
	private ZooKeeper zk = null;

	// 获取zk连接
	private void getZkClient() throws Exception {

		zk = new ZooKeeper(GlobalConstants.zkhosts, GlobalConstants.sessionTimeout, 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(GlobalConstants.parentZnodePath, true);

		ArrayList<String> serverList = new ArrayList<String>();

		for (String child : children) {

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

			serverList.add(new String(data));

		}

		// 如果客户端是一个多线程程序,而且各个线程都会竞争访问servers列表,所以,在成员中用volatile修饰了一个servers变量
		// 而在更新服务器信息的这个方法中,是用一个临时List变量来进行更新
		servers = serverList;

		// 将更新之后的服务器列表信息打印在控制台观察一下
		for (String server : servers) {

			System.out.println(server);
		}

	}

	/**
	 * 业务逻辑
	 * 
	 * @throws InterruptedException
	 */
	private void requestService() throws InterruptedException {
		Thread.sleep(Long.MAX_VALUE);

	}

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

		ZookeeperClient client = new ZookeeperClient();

		// 先构造一个zk的连接
		client.getZkClient();

		// 获取服务器列表
		client.updateServers();

		// 客户端进入业务流程,请求服务器的服务
		client.requestService();

	}

}

代码实现:服务端

package org.zookeeper.anli;

import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ZookeeperServer {

	private ZooKeeper zk = null;
	private volatile List<String> servers = null;

	private void getZkClient() throws Exception{

		//服务器在需求中并不需要做任何监听
		zk = new ZooKeeper(GlobalConstants.zkhosts, GlobalConstants.sessionTimeout,null);

	}

	/**
	 * 向zookeeper中的/servers下创建子节点
	 * @throws InterruptedException 
	 * @throws KeeperException 
	 */
	private void connectZK(String serverName,String port) throws Exception{

		//先创建出父节点
		if(zk.exists(GlobalConstants.parentZnodePath, false) == null){
			zk.create(GlobalConstants.parentZnodePath, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
		}

		//连接zk创建znode
		zk.create(GlobalConstants.parentZnodePath+"/", (serverName+":"+port).getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println("server " + serverName + " is online ......");

	}

	//服务器的具体业务处理功能
	private void handle(String serverName) throws Exception {
		System.out.println("server " + serverName + " is waiting for task process......");
		Thread.sleep(Long.MAX_VALUE);

	}

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

		ZookeeperServer server = new ZookeeperServer();

		//获取与zookeeper通信的客户端连接
		server.getZkClient();

		//一启动就去zookeeper上注册服务器信息,参数1: 服务器的主机名    参数2:服务器的监听端口
		//模拟 在servers节点下创建一个服务器 server01 1212 代表一台服务器上线
		server.connectZK(args[0],args[1]);

		//进入业务逻辑处理流程
		server.handle(args[0]);
	}
}

所需要用到的jar包:

测试方法,将server端打成一个jar包 client打成一个jar包 将server丢到服务器上 反复执行该jar包

在windows中执行client.jar包 查看服务器上下线感知

时间: 2024-10-21 19:08:38

5.zookeeper应用案例之分布式服务器动态上下线感知的相关文章

ZooKeeper之服务器动态上下线案例

需求 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. 需求分析 具体实现 先在集群上创建/servers节点 create /servers "servers" 一些依赖 pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&q

基于Nginx dyups模块的站点动态上下线

简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一定的轮询策略,将请求路由到后端一台指定的服务器上. 这样的架构是没有问题的, 但是我们这里考虑几个问题, 1. 网站上下线问题:我们网站平时更新站点的时候是直接覆盖文件,然后重启, 那这样会造成一些请求中断,如果是非核心逻辑那还好, 如果是核心逻辑,那请求中断,会影响一些数据一致性,比如资金, 交易

动态上下线集群详解

动态上下线集群的一些配置: 1.namenode中 hdfs-site.xml 配置 <property> <name>dfs.hosts</name> <value>/ddmap/hadoop-1.0.4/conf/hdfs_include</value> </property> <property> <name>dfs.hosts.exclude</name> <value>/ddm

基于外部ZooKeeper的GlusterFS作为分布式文件系统的完全分布式HBase集群安装指南

(WJW)基于外部ZooKeeper的GlusterFS作为分布式文件系统的完全分布式HBase集群安装指南 [X] 前提条件 服务器列表: 192.168.1.84 hbase84 #hbase-master 192.168.1.85 hbase85 #hbase-regionserver,zookeeper 192.168.1.86 hbase86 #hbase-regionserver,zookeeper 192.168.1.87 hbase87 #hbase-regionserver,z

Zookeeper是如何实现分布式锁的

Zookeeper是如何实现分布式锁的 标签 : Zookeeper 分布式 实现分布式锁要考虑的重要问题 1. 三个核心要素 加锁, 解锁, 锁超时 2. 三个问题 要保证原子性操作, 加锁和锁超时的操作要一次性执行完毕 防止误删锁 在误删的基础上, 加一个守护线程, 为锁续命. 什么是临时顺序节点 Zookeeper的数据存储结构就像是一棵树, 这棵树由节点组成, 这种节点叫做Znode. Znode分为四种类型. 1. 持久节点(Persistent) 默认的节点类型, 创建节点的客户端和

ZooKeeper 3.5.0 分布式配置问题

ZooKeeper 3.5.0 分布式配置好后,执行./zkServer.sh start 命令启动,报如下错误: 2015-07-02 21:06:01,671 [myid:] - INFO [main:[email protected]] - Reading configuration from: /usr/zookeeper/bin/../conf/zoo.cfg2015-07-02 21:06:01,682 [myid:] - ERROR [main:[email protected]]

legend分布式服务器集群逻辑计算处理压力测试

(如果图小,可以Ctrl+鼠标滚轮给缩放) 基于上次<legend分布式服务器集群并发登陆上线游戏压测结果>之后做了逻辑处理压力测试,仍然只配置了单个网关与单个逻辑服在集群中,结果如下: 测试用例: 第一步:上线一万个玩家,然后每10秒钟让每个玩家都往网关服务器发送一个逻辑计算请求,网关服务器转发请求给逻辑服务器处理,逻辑服务器进行一百万次浮点运算,然后将结果再返回给网关服务器,最后由网关服务器转发计算结果给玩家客户端,如图: 先分10个机器人,每个上线1000个,如图: 可以看出,从最先上线

设计模式-单例模式下对多例的思考(案例:Server服务器)

前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象(原版的)和备份数据库,也就是至少要两个对象,因为有可能服务器对象会垮掉,所以要用备份的,所以这里要考虑调用时候,应该返回哪个服务器对象,还有当服务器对象垮掉后,应该怎么处理,保证用户的使用.老师说,两个对象是基本要求,如果能够控制多个对象,分数更高哦. 我觉得蛮有意思的题目,如果只考虑两个对象,无非

分布式服务器集群架构方案思考

nginx-reverse-proxy-conf 研究了一套完整的分布式服务器集群架构方案. 0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Cluster),负载均衡集群(Load Balance Cluster,nginx即可实现),科学计算集群(High Performance Computing Cluster). 分布式是指将不同的业务分布在