Zookeeper动态更新服务器地址
来源:互联网 发布:胸痛中心数据填报 编辑:程序博客网 时间:2024/05/18 00:23
利用Zookeeper可实现服务发现功能,通过在节点下面创建数据来动态的更新服务地址
当服务地址发生变化时,服务提供者更改子节点下面的数据来更改url,服务消费者Watcher检测节点的变化,就获取节点下面的数据并且更新服务器地址
当服务器中的一个节点宕机或者leader宕机,zookeeper会自动选取领导,然后提供服务,只要宕机的数量小于zookeeper 服务器数量的一半仍然能提供良好的服务
基于Zookeeper的服务注册与发现架构
简单实现代码:
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency>
服务消费者代码
package com.zookeerper.find;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;import org.apache.zookeeper.data.Stat;public class AppClient{ private String groupNode = "sgroup"; private ZooKeeper zk; private Stat stat = new Stat(); private volatile List<String> serverList; private String zookeeperServer = "127.0.0.1:2181,127.0.0.1:2182"; /** * 连接zookeeper */ public void connectZookeeper() throws Exception { zk = new ZooKeeper(zookeeperServer, 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(); }}服务提供者代码:package com.zookeerper.find;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;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("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2182", 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 { AppServer as = new AppServer(); as.connectZookeeper("asdfs3:8080"); as.handle(); } }
0 0
- Zookeeper动态更新服务器地址
- Zookeeper动态更新服务器列表
- zookeeper应用案例——服务器列表动态更新
- zookeeper 服务器动态上下线感知
- 配置DHCP服务器实现动态地址分配
- 免费邮箱:收发服务器动态公网地址
- Python动态更新服务器ip到dnspod
- 服务器热更新(动态加载DLL)
- 通过Zookeeper动态感知服务器上下线[案例]
- SVN 服务器IP地址更改本机如果更新?
- SVN 服务器IP地址变更的话,客户端如何更新?
- Android SDK 在线更新国内镜像服务器地址
- SVN中,SVN服务器地址变更,本地如何更新同步
- git更新服务器地址Mac版sourceTree问题
- 【ZooKeeper Notes 29】 修复“ZooKeeper客户端打印当前连接的服务器地址为null”的Bug问题描述
- zookeeper文章地址
- zookeeper、kafka下载地址
- Zookeeper实现分布式应用的(主节点HA)及客户端动态更新主节点状态
- Android 资源分类详解
- 欢迎使用CSDN-markdown编辑器
- Unity JsonUtility类的用法
- Android service 中的stub类
- 仿iOS的网络请求的加载框
- Zookeeper动态更新服务器地址
- 播放视频
- HibernateTemplate的一些常用方法总结
- Servlet学习笔记-开篇
- thinkcmf在apache中无法启用rewrite的修改办法
- 【HDU 2084】数塔(dp)
- 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法》 笔记1
- iOS 常见错误以及错误分析解决
- 初识Velocity