ZooKeeper之服务器动态上下线案例
需求
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。
需求分析
具体实现
先在集群上创建/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,那么运行后,客户端的控制台会实时显示当前的节点。
点上面那个红框可以切换控制台。
ZooKeeper之服务器动态上下线案例的更多相关文章
- 大数据学习day11------hbase_day01----1. zk的监控机制,2动态感知服务上下线案例 3.HDFS-HA的高可用基本的工作原理 4. HDFS-HA的配置详解 5. HBASE(简介,安装,shell客户端,java客户端)
1. ZK的监控机制 1.1 监听数据的变化 (1)监听一次 public class ChangeDataWacher { public static void main(String[] arg ...
- 基于Nginx dyups模块的站点动态上下线并实现简单服务治理
简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一 ...
- 【zookeeper】4、利用zookeeper,借助观察模式,判断服务器的上下线
首先什么是观察者模式,可以看看我之前的设计模式的文章 https://www.cnblogs.com/cutter-point/p/5249780.html 确定一下,要有观察者,要有被观察者,然后要 ...
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...
- 基于nginx实现上游服务器动态自动上下线——不需reload
网上关于nginx的介绍有很多,这里讲述的是上游服务(如下图的Java1服务)在没有"网关"的情况下,如何通过nginx做到动态上下线. 传统的做法是,手动修改nginx的upst ...
- zookeeper实现动态感知服务器上下线
在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用zook ...
- springcloud优雅停止上下线与熔断
SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ...
- 基于Zookeeper的分步式队列系统集成案例
基于Zookeeper的分步式队列系统集成案例 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, ...
- 自动化运维,远程交互从服务器A上ssh到服务器B上,然后执行服务器B上的命令。
第一种: ftp -v -n 192.168.0.1 21 <<! user ftp ftp123 bay ! 第二种: { echo -e "\n" echo -e ...
随机推荐
- PyQt5-TableWidget 表格视图
基于PyQt5 postgreSQL实现简单的数据插入.数据表格查询. 运行前需要安装psycopg2 模块,配置好postgerSQL. 先看效果图: 第1列为日期时间.第2列为自增1的编号.第3到 ...
- spark Streaming与kafka的集成消费
Spark 2.3.3 Kafka 2.11-1.0.2 Java jdk1.8.0_191 Hbase 1.2.11 from pyspark impo ...
- /usr/lib/python2.7/subprocess.py", line 1239, in _execute_child
Traceback (most recent call last):File "/home/eping/bin/repo", line 685, in main(sys.argv[ ...
- Jenkins之插件Publish HTML reports的使用
前提: 下载插件HTML Publisher plugin 一.安装 安装好HTML Publisher plugin之后,会在新建或者编辑项目时,在[增加构建后操作步骤]出现[Publish HTM ...
- jwt揭秘(含源码示例和视频)
JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 在项 ...
- 遗传算法求解旅行商(TSP)问题 -- python
参考资料: 遗传算法解决TSP旅行商问题(附:Python实现) 遗传算法详解(GA)(个人觉得很形象,很适合初学者) from itertools import permutations impor ...
- CF1225B2 TV Subscriptions (Hard Version)
CF1225B2 TV Subscriptions (Hard Version) 洛谷评测传送门 题目描述 The only difference between easy and hard vers ...
- CF1249F Maximum Weight Subset
CF1249F Maximum Weight Subset 洛谷评测传送门 题目描述 You are given a tree, which consists of nn vertices. Reca ...
- Python进阶-XVII 非python的接口类、多态、python自己的封装
1.python模拟java中的接口类 python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念 java : 面向对象编程 设计模式 —— 接口 接口类 : ...
- Codeforces Round #554 (Div. 2) C 数论
https://codeforces.com/contest/1152/problem/C 题意 a和b,找到k,使得lcm(a+k,b+k)最小(a,b:1e9) 题解 设gcd=gcd(a+k,b ...