Zookeeper应用案例-实现分布式应用的(主节点HA)及客户端动态更新主节点状态
2017-09-20 09:22
501 查看
需求分析:
某分布式系统中,主节点可以有多台,可以动态上下线
任意一台客户端都能实时感知到主节点服务器的上下线
A.客户端实现
B.服务端实现
某分布式系统中,主节点可以有多台,可以动态上下线
任意一台客户端都能实时感知到主节点服务器的上下线
A.客户端实现
public class AppClient { private String groupNode = "sgroup"; private ZooKeeper zk; private Stat stat = new Stat(); private volatile List<String> serverList; /** * 连接zookeeper */ public void connectZookeeper() throws Exception { zk = new ZooKeeper("localhost:4180,localhost:4181,localhost:4182", 5000, new Watcher() { public void process(WatchedEvent event) { // 如果发生了"/sgroup"节点下的子节点变化事件, 更新server列表, 并重新注册监听 if (event.getType() == EventType.NodeChildrenChanged && ("/" + groupNode).equals(event.getPath())) { try { updateServerList(); } catch (Exception e) { e.printStackTrace(); } } } }); updateServerList(); } /** * 更新server列表 */ private void updateServerList() throws Exception { List<String> newServerList = new ArrayList<String>(); // 获取并监听groupNode的子节点变化 // watch参数为true, 表示监听子节点变化事件. // 每次都需要重新注册监听, 因为一次注册, 只能监听一次事件, 如果还想继续保持监听, 必须重新注册 List<String> subList = zk.getChildren("/" + groupNode, true); for (String subNode : subList) { // 获取每个子节点下关联的server地址 byte[] data = zk.getData("/" + groupNode + "/" + subNode, false, stat); newServerList.add(new String(data, "utf-8")); } // 替换server列表 serverList = newServerList; System.out.println("server list updated: " + serverList); } /** * client的工作逻辑写在这个方法中 * 此处不做任何处理, 只让client sleep */ public void handle() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } public static void main(String[] args) throws Exception { AppClient ac = new AppClient(); ac.connectZookeeper(); ac.handle(); } }
B.服务端实现
public class AppServer { private String groupNode = "sgroup"; private String subNode = "sub"; /** * 连接zookeeper * @param address server的地址 */ public void connectZookeeper(String address) throws Exception { ZooKeeper zk = new ZooKeeper( "localhost:4180,localhost:4181,localhost:4182", 5000, new Watcher() { public void process(WatchedEvent event) { // 不做处理 } }); // 在"/sgroup"下创建子节点 // 子节点的类型设置为EPHEMERAL_SEQUENTIAL, 表明这是一个临时节点, 且在子节点的名称后面加上一串数字后缀 // 将server的地址数据关联到新创建的子节点上 String createdPath = zk.create("/" + groupNode + "/" + subNode, address.getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("create: " + createdPath); } /** * server的工作逻辑写在这个方法中 * 此处不做任何处理, 只让server sleep */ public void handle() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } public static void main(String[] args) throws Exception { // 在参数中指定server的地址 if (args.length == 0) { System.err.println("The first argument must be server address"); System.exit(1); } AppServer as = new AppServer(); as.connectZookeeper(args[0]); as.handle(); } }
相关文章推荐
- 实现分布式应用的(主节点HA)及客户端动态更新主节点状态
- (JavaScript)实现在客户端动态改变Treeview节点的选中状态
- zookeeper实现分布式应用系统服务器上下线动态感知程序、监听机制与守护线程
- Zookeeper应用案例-分布式共享锁的简单实现
- zookeeper应用案例——服务器列表动态更新
- 实现采用客户/服务器通信模式,基于TCP网络通信协议的多客户端简单应用之案例分析
- [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- 大数据教程(3.9):zookeeper分布式应用系统服务器上下线动态感知程序开发_
- 巧用zookeeper实现分布式并行计算 - J2EE企业应用 顾问/咨询 Java传教士 -H.E.'s Blog
- Dubbo基于Zookeeper实现分布式服务:Dubbo+Zookeeper+Spring整合应用
- Zookeeper系列四:Zookeeper在大型分布式系统中的应用、Zookeeper实现分布式锁
- Zookeeper客户端基本操作java实现——创建连接、创建节点、添加修改节点内容、获取子节点、获取节点数据、删除节点
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
- 一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)
- -[Up,every,day] 之 №2_.NET Socket 简单的应用,实现服务器与客户端 实时更新对话.!
- Zookeeper集群部署及分布式应用系统服务器上下线动态感知