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" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mcq</groupId>
  <artifactId>zookeeper1026</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.8.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.10</version>
		</dependency>
</dependencies>
</project>

在src/main/resources下添加一个file log4j.properties:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

服务器端向 Zookeeper 注册代码

package com.mcq.zookeeper1026;

import java.io.IOException;

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;

public class DistributeServer {
	private String connectString = "hadoop103:2181,hadoop104:2181,hadoop105:2181";
	private int sessionTimeOut = 2000;
	private ZooKeeper zk = null;
	private String parentNode = "/servers";

	public void getConnect() throws IOException {
		zk = new ZooKeeper(connectString, sessionTimeOut, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				// TODO Auto-generated method stub

			}

		});
	}

	// 注册服务器
	public void registServer(String hostname) throws Exception {
		System.out.println(zk);
		String path = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE,
				CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println(hostname + " is online " + path);
	}

	// 业务功能
	public void business(String hostname) throws InterruptedException {
		System.out.println(hostname + " is working ……");
		Thread.sleep(Long.MAX_VALUE);
	}

	public static void main(String[] args) throws Exception {
		// 1.获取zk连接
		DistributeServer server = new DistributeServer();
		server.getConnect();
		// 2.利用zk连接注册服务器信息
		server.registServer(args[0]);
		// 3.启动业务功能
		server.business(args[0]);

	}
}

客户端代码

package com.mcq.zookeeper1026;

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

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class DistributeClient {
	public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
		//1.获取zk连接
		DistributeClient client=new DistributeClient();
		client.getConnect();
		//2.获取servers的子节点信息,从中获取服务器信息列表
		client.getServerList();
		//3.业务进程启动
		client.business();
	}

	private void business() throws InterruptedException {
		// TODO Auto-generated method stub
		System.out.println("client is working ……");
		Thread.sleep(Long.MAX_VALUE);
	}

	private String parentNode="/servers";

	private void getServerList() throws KeeperException, InterruptedException {
		// TODO Auto-generated method stub
		//1.获取服务器子节点信息,并且对父节点进行监听
		List<String> children = zk.getChildren(parentNode,true);
		//2.存储服务器信息列表
		ArrayList<String> servers=new ArrayList<>();
		//3.遍历所有节点,获取节点中的主机名称信息
		for(String child:children) {
			byte[] data=zk.getData(parentNode+"/"+child,false,null);
			servers.add(new String(data));
		}
		//4.打印服务器列表信息
		System.out.println(servers);
	}

	private ZooKeeper zk=null;
	private String connectString="hadoop103:2181,hadoop104:2181,hadoop105:2181";
	private int sessionTimeOut=2000;

	private void getConnect() throws IOException {
		// TODO Auto-generated method stub
		//创建到zk的客户端连接
		zk=new ZooKeeper(connectString,sessionTimeOut,new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				// TODO Auto-generated method stub
				try {
					getServerList();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}

		});
	}
}

运行程序

先运行客户端

在xshell上登录客户端(bin/zkCli.sh),进行一些操作,可以看到eclipse的控制台会实时输出有哪些节点。

然后运行服务器端,记得先在run configuration里设置一下参数,比如设成hadoop103,那么运行后,客户端的控制台会实时显示当前的节点。

点上面那个红框可以切换控制台。

原文地址:https://www.cnblogs.com/mcq1999/p/11743939.html

时间: 2024-08-14 10:00:54

ZooKeeper之服务器动态上下线案例的相关文章

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

zookeeper应用案例之分布式服务器动态上下线感知,当服务器上线和下线时候客户端都能感知到,还有哪些机器在线.并对zookeeper管理的服务器进行节点的监听; 代码实现:客户端 每当服务端有服务器上线或下线 在客户端都能通过监听感知到 package org.zookeeper.anli; import java.util.ArrayList; import java.util.List; import org.apache.zookeeper.WatchedEvent; import o

基于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做独立服务器运行(上)

ZooKeeper做独立服务器运行(上) 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.ZooKeeper安装及配置 版本:ZooKeeper v3.4.6稳定版 要设置ZooKeeper以单独服务器的模式运行是非常直接的.服务器包含在单个的JAR文件内,因此安装就只需创建一个配置文件. 一旦下载了ZooKeeper稳定版,那么解压它,并进入ZooKeeper的根目录. $ wgethttp://mirror.bit.edu.cn/apache

基于Zookeeper的分步式队列系统集成案例

基于Zookeeper的分步式队列系统集成案例 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等. 从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代

《DDNS服务器的搭建和案例解决方法》

DDNS原理:DNS + DHCP =DDNS DHCP负责ip解析,和分配给客户机ip,ip为随机数. DNS负责域名解析,A记录里记录了每个ip对应的域名. 客户端ip肯定是变化的,不可能一直使用一个ip,所以当客户端的ip变时,使用DDNS服务,同时通知DNS的A记录,使他也同步更新,否则别人访问你的域名时找不到你的这台主机. 测试的环境:建立在DNS加密更新配置完好. DHCP默认安装好软件包是启动不了的. DHCP服务配置文件的有效行: "example.Com"这个域使用的

TCP/IP协议学习(五) 基于C# Socket的Web服务器---动态通讯实现

目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请求处理是web服务器的必要组成部分,现有比较成熟的前端动态技术有CGI,ASP/ASP.net, PHP,原生javascript实现的Ajax技术以及基于HTML5的webSocket通讯,它们每一项都涉及很多相关知识,不过归结到核心都是前后端的数据交互,特别是对于后端来说并没有太大区别.作为动态

呕心沥血的java复杂项目(包括自定义应用层协议、CS多线程、多客户端登录、上下线提醒等等)

建议大家先下源代码,导入到Eclipse,然后运行服务器和多个客户端,这样有个不错的体会.下载地址:http://download.csdn.net/detail/woshiwanghao_hi/7320927. 首先来看下整个系统的文件架构图: 系统是个基于UDP的聊天室,因为不能保持所有用户和聊天室的持续连接.同时为了保持数据传输的可靠性,就需要自定义应用层协议了. 程序大概的一个流程如下: 1.启动服务器,点击"start service",之后服务器及开始监听指定端口. 2.启

多线程 网络编程 文件上传案例多线程

Day13 多线程 3).多线程的好处: 提高程序的运行效率,提高用户的体验度. 创建新的线程: *    定义类继承Thread *    重写方法run *    创建Thread子类的对象 *    调用子类对象的方法 start() * *  为什么继承Thread *    Thread类是线程对象类 *    继承了Thread,子类也是线程对象 * *  为什么重写run *    Sun工程师,不清楚其他人员用线程做什么 *    全部写在run中 * *  为什么调用start