Zookeeper使用实例——服务节点管理
分布式处理中,总会存在多个服务节点同时工作,并且节点数量会随着网络规模的变化而动态增减,服务节点也有可能发生宕机与恢复。面对着动态增减的服务节点,我们如何保证客户请求被服务器正确处理呢。我们可以通过zookeeper临时节点创建与自动删除来掌握服务节点的动态增减。
ignite分布式缓存支持使用zookeeper发现ignite节点的增减,这正是zookeeper管理服务节点的一个典型应用场景。我们来看看关键代码
// 关键方法,创建包含自增长id名称的目录,这个方法支持了分布式锁的实现
// 四个参数:
// 1、目录名称 2、目录文本信息
// 3、文件夹权限,Ids.OPEN_ACL_UNSAFE表示所有权限
// 4、目录类型,CreateMode.EPHEMERAL_SEQUENTIAL表示创建临时目录,session断开连接则目录自动删除
String createdPath = zk.create(
"/" + clusterNode + "/" + serverNode,
address.getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
采用CreateMode.EPHEMERAL_SEQUENTIAL模式创建临时节点,可以支持服务节点的实时管理。没错,这个模式和《Zookeeper使用实例——分布式共享锁》中创建有序节点支持分布式共享锁是一致的。EPHEMERAL_SEQUENTIAL表示创建有序的临时目录节点,zookeeper客户端创建临时节点后,只要session断开,该临时节点会自动删除。
所以,服务器在zookeeper上创建一个临时目录节点,通过节点事件监听我们可以知道服务器已经加入到服务网络中,监听到临时目录节点删除事件,我们可以知道该节点对应的服务器已经脱离服务网络。下面我们看看具体代码
1、 服务器启动后在zookeeper创建临时目录
package com.coshaho.learn.zookeeper; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; /**
*
* 服务节点启动后注册到zookeeper
* @author coshaho
*
*/
public class AppServer extends Thread
{
private String clusterNode = "Locks";
private String serverNode = "mylock";
private String serverName;
private long sleepTime; public void run()
{
try
{
connectZookeeper(serverName);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void connectZookeeper(String address) throws Exception
{
ZooKeeper zk = new ZooKeeper("192.168.1.104:12181", 5000, new Watcher()
{
public void process(WatchedEvent event)
{}
}); // 关键方法,创建包含自增长id名称的目录,这个方法支持了分布式锁的实现
// 四个参数:
// 1、目录名称 2、目录文本信息
// 3、文件夹权限,Ids.OPEN_ACL_UNSAFE表示所有权限
// 4、目录类型,CreateMode.EPHEMERAL_SEQUENTIAL表示创建临时目录,session断开连接则目录自动删除
String createdPath = zk.create(
"/" + clusterNode + "/" + serverNode,
address.getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("create: " + createdPath);
Thread.sleep(sleepTime);
} public AppServer(String serverName, long sleepTime)
{
this.serverName = serverName;
this.sleepTime = sleepTime;
}
}
2、 节点管理服务监听zookeeper临时目录节点创建删除事件
package com.coshaho.learn.zookeeper; 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; /**
*
* 客户端注册监听server节点变化
* @author coshaho
*
*/
public class AppMaster
{
private String clusterNode = "Locks";
private ZooKeeper zk;
private volatile List<String> serverList; public void connectZookeeper() throws Exception
{
// 注册全局默认watcher
zk = new ZooKeeper("192.168.1.104:12181", 5000, new Watcher()
{
public void process(WatchedEvent event)
{
if (event.getType() == EventType.NodeChildrenChanged
&& ("/" + clusterNode).equals(event.getPath()))
{
try
{
updateServerList();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}); updateServerList();
} private void updateServerList() throws Exception
{
List<String> newServerList = new ArrayList<String>(); // watcher注册后,只能监听事件一次,参数true表示继续使用默认watcher监听事件
List<String> subList = zk.getChildren("/" + clusterNode, true);
for (String subNode : subList)
{
// 获取节点数据
byte[] data = zk.getData("/" + clusterNode + "/" + subNode, false, null);
newServerList.add(new String(data, "utf-8"));
} serverList = newServerList;
System.out.println("server list updated: " + serverList);
} public static void main(String[] args) throws Exception
{
AppMaster ac = new AppMaster();
ac.connectZookeeper();
Thread.sleep(Long.MAX_VALUE);
}
}
3、 启动两个服务器
package com.coshaho.learn.zookeeper; public class Server1
{
public static void main(String[] args) throws Exception
{
AppServer server1 = new AppServer("Server1", 5000);
server1.start();
}
} package com.coshaho.learn.zookeeper; public class Server2
{
public static void main(String[] args) throws Exception
{
AppServer server1 = new AppServer("Server2", 10000);
server1.start();
}
}
4、 运行结果
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
server list updated: []
server list updated: [Server1]
server list updated: [Server2, Server1]
server list updated: [Server2]
server list updated: []
Zookeeper使用实例——服务节点管理的更多相关文章
- 【Zookeeper】分布式服务框架 Zookeeper -- 管理分布式环境中的数据
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...
- IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例
概述 首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习.本位主要结合zookeeper和dubbo做个简单实例.目前来说,一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越 ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- React 深入系列1:React 中的元素、组件、实例和节点
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
- dubbo+zookeeper+spring实例
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 使用 WLST 和节点管理器来管理服务器
使用节点管理器启动计算机上的服务器 WLST 可以连接至在任何计算机上运行的节点管理器,并能够在此计算机上启动一个或多个 WebLogic Server 实例.要通过此技术使用 WLST 和节点管理器 ...
- ZooKeeper 分布式协调服务介绍
0. 说明 从自己的独立博客迁移,该部分为 Zookeeper分布式协调服务介绍 原文链接 ZooKeeper 指南 1. ZooKeeper 简介 [官方介绍] ZooKeeper 是一种集中式服 ...
- Zookeeper 应用实例
配置管理 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难.好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用 ...
- oracle数据库没有监听服务与实例服务(OracleServicesXX)的解决方法
不知道为什么,可能是因为更新系统的原因,过了一段时间,想打开oracle服务,发现居然没有任何oracle有关的服务了,但以前的数据库文件什么的都在,心想肯定是可以复原的,应该只是注册表的问题罢了.在 ...
随机推荐
- Failed to start LSB: Bring up/down networking.
由于我的虚拟机是从别的机器拷贝过来的,导入新机器后,没有问题,第二天就网络连接不上了,就出现下面的错误 [root@centos ~]# /etc/init.d/network restart Res ...
- Java与JS判断请求来是否来自移动端
Java public boolean JudgeIsMoblie(HttpServletRequest request) { boolean isMoblie = false; //String[] ...
- Docker添加镜像加速器
Docker默认pull连接镜像为国外镜像,速度较慢,注册阿里云可以生成一个镜像加速器 登录阿里云 https://cr.console.aliyun.com获取私有加速地址 修改配置文件/etc/d ...
- java 内存深度解析
java 中的包括以下几大种的内存区域:1.寄存器 2.stack(栈) 3.heap(堆) 4.数据段 5.常量池 那么相应的内存区域中又存放什么东西(主要介绍 stack heap)? 栈: ...
- 【转】C#中的Stream
C# 温故而知新:Stream篇(—) C# 温故而知新:Stream篇(二) C# 温故而知新:Stream篇(三) C# 温故而知新:Stream篇 (四) C# 温故而知新:Stream篇(五) ...
- MyISAM存储引擎
每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件的扩展名是.MYI (MYIn ...
- tcpdump抓包二进制tcp协议详细分析
1.tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0 tcpdump: verbose output suppressed, us ...
- ElasticSearch报 EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@c0efba
ElasticSearch报以下错误的解决办法: "type": "es_rejected_execution_exception", "reason ...
- CentOS7.2配置vsftpd
环境 CentOS7.2 (安装镜像CentOS-7-x86_64-DVD-1611) 本文默认使用root用户操作 目标 实现CentOS7.2上安装vsftpd,使用新创建的ftpuser用户便可 ...
- (c++) int 转 string,char*,const char*和string的相互转换
一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...