ZooKeeper简单案例-客户端请求,服务器响应

Zookeeper C客户端解析 Zookeeper客户端主要有以下几个核心组件组成: Zookeeper句柄:保存默认Watcher、Zookeeper服务器地址列表等; Adaptor:包含两个线程:I/O线程和Completion线程,其中,I/O线程负责客户端与服务端之间的I/O通信;Completion线 程负责处理异步接口的Completion回调。 1、客户端初始化 Zookeeper客户端的初始化其实就是Zoo... 阅读详情

程序思路逻辑:
A.服务器代码:(可多线程同时上线多台服务器)
主函数
1.连接zookeeper
2.注册服务器
3.开始提供业务(无论请求是什么,都返回当前时间)
B.服务逻辑代码-实现-无论请求是什么,都返回当前时间
C.客户端
主函数
1.new一个自己的对象(客户端)
2.构造zk连接对象
3.查询在线服务器列表
4.处理业务(向一台服务器发送时间查询请求)

  1. 服务器代码
package cn.edu360.zk.gwtest;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import cn.edu360.zk.distributesystem.TimeQueryService;
public class TimerQuServer {
	ZooKeeper  zk = null;
	//连接zookeeper的方法
	public void getConnectZK() throws Exception{
		zk = new ZooKeeper("hdp01:2181,hdp02:2182,hdp03:2181", 2000, null);
	}
	
	//注册服务器的方法
	public void createServer(String hostname,String port) throws Exception{
		//判断当前服务器总目录,是否存在,如果不存在则创建
		Stat exists = zk.exists("/Servers", false);
		if(exists==null){
			zk.create("/Servers", "服务器总目录".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
		}
		//注册子服务器
			String server = zk.create("/Servers/Server", (hostname+":"+port).getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		
			System.out.println("注册服务器成功,服务器地址:"+server);
		
	}
	
	
	
	//主函数
	//	1.连接zookeeper
	//  2.注册服务器
	//  3.开始提供业务
	public static void main(String[] args) {
		TimerQuServer timerQuServer = new TimerQuServer();
		
		try {
			timerQuServer.getConnectZK();
			timerQuServer.createServer(args[0], args[1]);		

			// 启动业务线程开始处理业务
			new TimeQueryService(Integer.parseInt(args[1])).start();
			
			
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}
  1. 服务逻辑代码
package cn.edu360.zk.gwtest;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class TimerQuService extends Thread {
	//1 需要一个端口号 构造函数直接传
	int port = 0;

	public TimerQuService(int port) {
		this.port = port;
	}

	//重新run方法
	@Override
	public void run() {
		// TODO Auto-generated method stub

		try {
			//创建一个服务器对象
			ServerSocket socket = new ServerSocket(port);
			System.out.println("业务线程已绑定端口:"+port+"准备接受客户端请求");
			while(true){
				//等待接收客户端请求
				Socket accept = socket.accept();
				//获取客户端的情况
				InputStream in = accept.getInputStream();
				//发出给客户端的响应
				OutputStream out = accept.getOutputStream();
				//把当前时间转成byte写入响应
				out.write(new Date().toString().getBytes());		
				
			}			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
	
	
}

  1. 客户端代码
package cn.edu360.zk.gwtest;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

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

public class Client {
	//定义一个list 存放正在运行的服务器
	private volatile ArrayList<String> onlineServers = new ArrayList<String>();
	
	private ZooKeeper zk =null;
	
	//获取 zookeeper的连接
	public void getZKConn() throws Exception{
		zk = new ZooKeeper("hdp01:2181,hdp02:2181,hdp03:2181", 2000, new Watcher() {
			//重新监听进程
			@Override
			public void process(WatchedEvent event) {
				// TODO Auto-generated method stub
				//如果事件的状态=连接 且 事件的类型= 子节点变化 则重新或者online服务器
				
				
				
				
				
				
				
			   if (event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged) {
						//调用 更新 onlineServers
					try {
						System.out.println("*******************检查到服务器更新*********************");
						getOnlineServers();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
	}
	
	
	//查询在线服务器列表
	public void getOnlineServers() throws Exception{
		//获取 servers下的所有child
		List<String> childrens = zk.getChildren("/Servers", true);
		//这里需要新 new 一个list,然后复制后再覆盖 onlineServers
		ArrayList<String> servers = new ArrayList<String>();
		//循环所有child节点,
		for (String child : childrens) {
			//把服务器信息写入 onlineServers 中
			byte[] data = zk.getData("/Servers/"+child, false, null);
			
			servers.add(new String(data));	
			System.out.println("onlineServer更新"+new String(data));
		}
		onlineServers = servers;
	}
	
	
	
	//客户端请求方法
	@SuppressWarnings("resource")
	public void sendRequest() throws Exception{
		//随机挑选一台服务器
		Random random = new Random();
		while(true){
			
		
		int nextInt = random.nextInt(onlineServers.size());
		String targetServer = onlineServers.get(nextInt);
		
		System.out.println("本次的幸运儿服务器是:"+targetServer);
		
		//获取服务器端 和 口号
		String hostname = targetServer.split(":")[0];
		String port = targetServer.split(":")[1];
		
		//new 一个客户端
		Socket socket = new Socket(hostname,Integer.parseInt(port));
		
		//获取客户端的输入流与输出流
		OutputStream outputStream = socket.getOutputStream();
		InputStream inputStream = socket.getInputStream();
		
		//客户端发送输出流 给服务器
		outputStream.write("哥来发送请求了!".getBytes());
		outputStream.flush();
		
		//客户端获取服务器的输入流
		byte[] buf = new byte[256];//定一个字符
		int result = inputStream.read(buf);//把字符放到 buf  返回的 int对象为 读inputStream的结果
		System.out.println("服务器响应状态:+"+ result +" 服务器响应的时间为:" + new String(buf, 0, result));
		
		//一系列关闭
		outputStream.close();
		inputStream.close();
		socket.close();

		Thread.sleep(3000);
		}
	}
	
	
	
	//主函数
	public static void main(String[] args) throws Exception {
		
		//new一个自己的对象(客户端)
		Client client = new Client();
		
		// 构造zk连接对象
		client.getZKConn();
		
		// 查询在线服务器列表
		client.getOnlineServers();
		
		// 处理业务(向一台服务器发送时间查询请求)
		client.sendRequest();
		
	}
	
}
zookeeper源码(13)客户端 通过阅读zookeeper源码深入了解客户端原理 阅读详情

相关推荐

ddr3ip核心_DDR3 IP 核配置

DDR3 控制器 IP 核2.DDR3 IP核配置点击 Flow Navigator 面板下的“Project Manager -->IP Catalog”。 在“Memories & Storage Elements -->Memory Interface Generators”分类展开后,可以看到名为“Memory Interface Generator (MIG 7 ...

weixin_33049919的博客 2935

【分布式】Zookeeper请求处理

一、前言   在前面学习了Zookeeper中服务器的三种角色及其之间的通信,接着学习对于客户端的一次请求,Zookeeper是如何进行处理的。 二、请求处理   2.1 会话创建请求   Zookeeper服务端对于会话创建的处理,大体可以分为请求接收、会话创建、预处理、事务处理、事务应用和会话响应六大环节,其大体流程如   1. 请求接收   (1) I/O层接收来自客户端的请求。...

weixin_33778544的博客 311

STM32F103新手必看:0.96寸OLED屏幕从接线到动态显示全攻略(附IIC避坑指南)

本文为STM32F103新手提供了0.96寸OLED屏幕从硬件接线到软件驱动的完整实战指南。重点解析了IIC通信的时序、设备地址(0x78/0x7A)的常见陷阱,并详细演示了如何实现字符显示与平滑滚动显示等动态效果,帮助开发者快速上手并避开常见调试难题。

stone的博客 552

zookeeper之客户端和服务端的区别

客户端是集群外的访问,服务端才是集群上的提供服务的。   使用bin/zkServer.sh start开启的zookeeper上的一个服务端,而使用bin/zkCli.sh是将客户端连到服务端上。 客户端可以通过服务端创建znode,删除znode,写znode,读znode,设置监视等等。 其中zookeeper提供的master选举选的是客户端的master,根据他们登录后在Grou...

qq_37385726的博客 5135

模糊综合评价模型

一.引子 1.数学归纳法:同高中知识 2.秃子悖论:秃子悖论 这俩个例子都是类似于“量变引起质变”的道理,而在数学中我们把这类问题的性质叫做“模糊性”,在生活中我们也经常能遇到一些模糊的概念,比如年轻、帅、很少很多… 二.概述 模糊综合评价法是一种基于模糊数学的综合评价方法。该综合评价法根据模糊数学的隶属度理论把定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决。——来自百度百

The__Tyche的博客 2万+

esp32 python开发环境搭建_eclipse esp32开发环境搭建

安装方法基本是按照官网提供的方法来操作https://github.com/espressif/idf-eclipse-plugin#GettingStarted但是官网的方法安装之后还是不能编译成功的,第一次编译会出现一下问题问题1:Building in: E:\eclipse-workspace\helloworlk\buildcmake -G Ninja -DCMAKE_TOOLCHAIN...

weixin_39978276的博客 1263

OpenClaw-遇到的问题- FailoverError: Model context window too small (4096 tokens). Minimum is 16000

摘要:OpenClaw配置文件中deepseek-reasoner模型的上下文窗口被默认设置为4096 tokens(实际支持128K),导致系统报错"Model context window too small"。解决方案是删除配置文件中的contextWindow和maxTokens字段,让系统自动获取模型真实能力,并重启OpenClaw服务。配置文件通常位于用户目录下的.openclaw/openclaw.json中。

直到世界的尽头 4157

Zookeeper_Zookeeper客户端连接(含集群方式)

zookeeper 连接地址,zookeeper 的连接方式多种多样,这里展示3种连接方式 1.命令行连接 2.jar程序连接 3.IDE 插件 一、zkCli.sh / zookeeper-client 连接方式 命令行连接 zookeeper-client -server cdh-manager:2181,cdh-node1:2181,cdh-node2:2181 连接后的信息 [root@cdh-manager /]# zookeeper-client -serve...

迎难而上 9307

上位机 寻边器 通讯实战

寻边器通讯接口实现 本文介绍了上位机与盖泽(Gazer)和JEL品牌寻边器的通讯接口实现方案。主要内容包括: 接口定义:创建了IAlignerOperation接口,定义了获取状态、控制运动、真空吸附等核心功能。 具体实现: 盖泽寻边器(GazerAlignerCjh):通过串口通讯,实现了回零、校准、移动位置等操作 JEL寻边器(JelAligner):同样基于串口通讯,包含错误处理、状态查询等功能 工厂模式:通过AlignerFactory工厂类根据设备品牌创建对应的实现对象。 设备加载:展示了如何在系

StevenChen的博客 375

C#实现Socket通信同时监听多客户端(附完整源码)

C#实现Socket通信同时监听多客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 427

Dubbo学习笔记:注册到zookeeper并实现远程调用

我们选择zookeeper作为注册中心。 一、首先要下载zookeeper,把程序解压,进入conf,把zoo_sample.cfg修改为zoo.cfg。进入bin文件夹,在这里打开命令行,输入zkserver.cmd,这样就启动了zookeeper。 可以看出,zookeeper注册中心监听的是2181端口。 二、创建服务提供者工程。 1. 创建一个springboot项目,在p

宝华的小岛 8871

十七、SAP-采购订单(STO)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 2067

Zookeeper(10) Zookeeper请求处理

一、前言 在前面学习了Zookeeper中服务器的三种角色及其之间的通信,接着学习对于客户端的一次请求,Zookeeper是如何进行处理的。 二、请求处理 2.1 会话创建请求 Zookeeper服务端对于会话创建的处理,大体可以分为请求接收、会话创建、预处理、事务处理、事务应用和会话响应六大环节,其大体流程如   1. 请求接收 (1) I/O层接收来自客户端的请求。NIOServerCnxn...

cowbin2012的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Zookeeper(5) Zookeeper的客户端

出处:http://www.cnblogs.com/leesf456/ 一、前言 前篇博客分析了Zookeeper的序列化和通信协议,接着继续学习客户端,客户端是开发人员使用Zookeeper最主要的途径,很有必要弄懂客户端是如何与服务端通信的。 二、客户端 2.1 客户端组成 Zookeeper客户端主要由如下核心部件构成。 1. Zookeeper实例,客户端入口。 2. ClientWa...

cowbin2012的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ZooKeeper技术细节_zookeeper and 服务器 and 客户端 and 数据节点

工作内容:事务请求的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各服务器的调度者;ZooKeeper使用责任链模式来处理客户端请求PrepRequestProcessor是Leader服务器的请求预处理器,在ZK中,将创建删除节点/更新数据/创建会话等会改变服务器状态的请求称为事务请求,对于事务请求,预处理器会进行一系列预处理,如创建请求事务头、事务体、会话检查、ACL检查和版本检查。

2401_84185145的博客 1148

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ZooKeeper请求处理流程详细

1. 会话创建请求 Zookeeper服务端对于会话创建的处理,大体可以分为请求接收、会话创建、预处理、事务处理、事务应用和会话响应六大环节,其大体流程如下 1.1 请求接收 I/O层接收来自客户端的请求。NIOServerCnxn维护每一个客户端连接,客户端与服务器端的所有通信都是由NIOServerCnxn负责,其负责统一接收来自客户端的所有请求,并将请求内容从底层网络I/O中完整地...

傅红雪的专栏 1899

zookeeper 客户端的实现

zookeeper 客户端的实现主要由以下三个类完成: org.apache.zookeeper.ZooKeeperorg.apache.zookeeper.ClientCnxnorg.apache.zookeeper.ClientCnxnSocketNIO org.apache.zookeeper.ZooKeeper主要是一层api的封装,客户端程序用到一个Zookeeper实例就可以进

tycoon的专栏 2346

ZooKeeper 事务请求处理难题全解:Leader 各阶段深度分析

ZooKeeper 事务请求处理难题全解:Leader 各阶段深度分析

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 1282

Zookeeper客户端

Zookeeper客户端 一,Zookeeper客户端的主要组件 Zookeeper客户端主要由以下几个核心部分组成: 1,Zookeeper实例:客户端入口。 通过调用Zookeeper构造方法生成客户端实例。 2,ClientWatchManager:客户端Watcher管理器。 3,HostProvider:客户端地址列表管理器。 4,Client...

reggergdsg的博客 330

聊聊Zookeeper技术内幕之客户端与SetData请求处理

从客户端会话创建到网络连接、请求处理,简单的叙述下流程与逻辑。

Gefangenes的博客 274

Zookeeper的Rust客户端

1.背景介绍 1. 背景介绍 Zookeeper是一个开源的分布式协调服务,用于构建分布式应用程序。它提供了一种可靠的、高性能的方法来管理分布式应用程序的配置、同步数据和提供原子性操作。Zookeeper的客户端可以是Java、C、C++、Python等多种编程语言。 Rust是一种新兴的系统编程语言,它具有高性能、安全性和并发性。随着Rust的发展,越来越多的开发者希望使用Rust编写Zo...

AI天才研究院 1123

zookeeper源码解析-单机处理客户端请求

1.引入 zk单机服务端虽然在实际生产使用中不可能碰到,但是用于接下来分析zk集群服务端有很大用处,我们秉承循序渐进的方式,先介绍一下单机服务端的启动和处理流程 2.单机服务器启动 在单机启动过程中,会创建服务端连接对象,用于处理客户端的请求。其处理过程,可以从以下代码开始介绍。 ZooKeeperServerMain.java ------------------------- publ...

missv5的博客 499
上一篇: liunx下:zookeeper客户端常用行命令
下一篇: hadoop中HA集群搭建示意图
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值