利用ZooKeeper开发分布式应用系统案例--服务端与客户端实现

本文主要是介绍利用ZooKeeper开发分布式应用系统案例--服务端与客户端实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用ZooKeeper开发分布式应用系统案例--服务端与客户端实现

服务端代码:

package cn.edu360.zk.distributesystem;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;
import org.apache.zookeeper.data.Stat;public class TimeQueryServer {ZooKeeper zk = null;//启动zk客户端连接public void connectZK() throws Exception {zk = new ZooKeeper("hadoop1:2181,hadoop2:2181,hadoop3:2181", 2000, null);}//注册服务器信息public void registerServerInfo(String hostname,String port) throws Exception, InterruptedException {/** 先判断注册节点是否存在,如果不存在,则创建*/Stat stat = zk.exists("/servers", false);if(stat == null) {zk.create("/servers", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}//注册服务器数据到zk的约定注册节点下String create = zk.create("/servers/server", (hostname + ":" + port).getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname + "服务器向zk注册信息成功,注册的节点为:" + create);}//启动业务线程开始处理业务public static void main(String[] args) throws Exception, Exception {TimeQueryServer timeQueryServer = new TimeQueryServer();//启动zk客户端连接timeQueryServer.connectZK();//注册服务器信息timeQueryServer.registerServerInfo(args[0], args[1]);//启动业务线程开始处理业务new TimeQueryService(Integer.parseInt(args[1])).start();}}

服务端线程代码:

package cn.edu360.zk.distributesystem;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 TimeQueryService extends Thread{int port = 0;public TimeQueryService(int port) {this.port = port;}@Overridepublic void run() {try {ServerSocket ss = new ServerSocket(port);System.out.println("业务线程已绑定端口"+ port + "准备接受消费端请求了...");while(true) {Socket sc = ss.accept();InputStream inputStream = sc.getInputStream();OutputStream outputStream = sc.getOutputStream();outputStream.write(new Date().toString().getBytes());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

客户端代码:

package cn.edu360.zk.distributesystem;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;public class Consumer {//定义一个list用于存放最新的在线服务器列表private volatile ArrayList<String> onlineServers = new ArrayList<String>();//构造zk连接对象ZooKeeper zk = null;public void connectZK() throws Exception {zk = new ZooKeeper("hadoop1:2181,hadoop2:2181,hadoop3:2181", 2000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged) {try {//事件回调逻辑中,再次查询zk上的在线服务器节点即可,查询逻辑中又再次注册子节点事件监听。getOnlineServers();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}});}//查询在线服务器列表public void getOnlineServers() throws Exception, InterruptedException {List<String> children = zk.getChildren("/servers", true);ArrayList<String> list = new ArrayList<String>();for (String child : children) {byte[] data = zk.getData("/servers/"+child, false, null);String serverInfo = new String(data);list.add(serverInfo);}onlineServers = list;System.out.println("查询了一次zk,当前在线的服务器有:"+list);}public void sendRequest() throws Exception {Random random = new Random();while(true) {try {//挑选一台当前在线的服务器	int nextInt = random.nextInt(onlineServers.size());String server = onlineServers.get(nextInt);String hostname = server.split(":")[0];int port = Integer.parseInt(server.split(":")[1]);System.out.println("本次请求挑选的服务器为:" + server);Socket socket = new Socket(hostname, port);OutputStream outputStream = socket.getOutputStream();outputStream.write("haha".getBytes());outputStream.flush();InputStream inputStream = socket.getInputStream();byte[] buf = new byte[256];int read = inputStream.read(buf);System.out.println("服务器相应的时间为" + new String(buf,0,read));outputStream.close();inputStream.close();socket.close();Thread.sleep(2000);}catch(Exception e) {e.printStackTrace();}}}public static void main(String[] args) throws Exception {Consumer consumer = new Consumer();//构造zk连接对象consumer.connectZK();//查询在线服务器列表consumer.getOnlineServers();//处理业务(向一台服务器发送时间查询请求)consumer.sendRequest();}}

这篇关于利用ZooKeeper开发分布式应用系统案例--服务端与客户端实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176901

相关文章

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os