分布式处理中,总会存在多个服务节点同时工作,并且节点数量会随着网络规模的变化而动态增减,服务节点也有可能发生宕机与恢复。面对着动态增减的服务节点,我们如何保证客户请求被服务器正确处理呢。我们可以通过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使用实例——服务节点管理的更多相关文章

  1. 【Zookeeper】分布式服务框架 Zookeeper -- 管理分布式环境中的数据

    Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...

  2. IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例

    概述 首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习.本位主要结合zookeeper和dubbo做个简单实例.目前来说,一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越 ...

  3. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  4. React 深入系列1:React 中的元素、组件、实例和节点

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...

  5. dubbo+zookeeper+spring实例

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  6. 使用 WLST 和节点管理器来管理服务器

    使用节点管理器启动计算机上的服务器 WLST 可以连接至在任何计算机上运行的节点管理器,并能够在此计算机上启动一个或多个 WebLogic Server 实例.要通过此技术使用 WLST 和节点管理器 ...

  7. ZooKeeper 分布式协调服务介绍

    0. 说明 从自己的独立博客迁移,该部分为 Zookeeper分布式协调服务介绍 原文链接  ZooKeeper 指南 1. ZooKeeper 简介 [官方介绍] ZooKeeper 是一种集中式服 ...

  8. Zookeeper 应用实例

    配置管理 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难.好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用 ...

  9. oracle数据库没有监听服务与实例服务(OracleServicesXX)的解决方法

    不知道为什么,可能是因为更新系统的原因,过了一段时间,想打开oracle服务,发现居然没有任何oracle有关的服务了,但以前的数据库文件什么的都在,心想肯定是可以复原的,应该只是注册表的问题罢了.在 ...

随机推荐

  1. zookeeper学习资料汇总

    zookeeper入门介绍   (1) zookeeper入门介绍     (2) zookeeper应用场景介绍 (淘宝团队)   (3) 分布式服务框架 Zookeeper -- 管理分布式环境中 ...

  2. easyui---基础组件:dialog

    依赖下面两个组件 window linkbutton linbutton组件:就是超链接变成按钮 $(function(){ $("#linkbuttonid").linkbutt ...

  3. 天梯赛 大区赛 L3-014.周游世界 (Dijkstra)

    L3-014. 周游世界 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世 ...

  4. Pandas的loc方法

    当你读取到DataFrame的数据时,想去定位某一个数据项,可以使用loc方法进行查找,之后你可以赋值给他. import pandas as pd df = pd.read_csv('file_na ...

  5. deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods

    1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...

  6. 币安Binance API Websocket

    本文介绍币安Binance API Websocket General WSS information The base endpoint is: wss://stream.binance.com:9 ...

  7. CF989C A Mist of Florescence 构造

    正解:构造 解题报告: 先放传送门yep! 然后构造题我就都直接港正解了QwQ没什么可扯的QwQ 这题的话,首先这么想吼 如果我现在构造的是个4*4的 举个栗子 AABB ACBB AADB DBCA ...

  8. virtualenv 使用

    一.安装 pip install virtualenv 因为我已经安装了pip,那么就直接用pip来安装了,简单方便. 其它的安装方式请参考官方网站:http://www.virtualenv.org ...

  9. IO流(6)获取功能

    获取功能: * public String getAbsolutePath():获取绝对路径 * public String getPath():获取相对路径 * public String getN ...

  10. 前端 HTML 注释

    单行注释 <!--注释内容--> <!DOCTYPE html> <!-- 页面根节点开始--> <html lang="en"> ...