实现分布式应用的(主节点HA)及客户端动态更新主节点状态
2018-01-22 15:11
281 查看
实现分布式应用的(主节点HA)及客户端动态更新主节点状态
某分布式系统中,主节点可以有多台,可以动态上下线任意一台客户端都能实时感知到主节点服务器的上下线
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(); } } // 有问题的话,欢迎提问 |
相关文章推荐
- Zookeeper应用案例-实现分布式应用的(主节点HA)及客户端动态更新主节点状态
- (JavaScript)实现在客户端动态改变Treeview节点的选中状态
- 利用ASP和XML实现客户端多表单域数据动态更新
- 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字
- -[Up,every,day] 之 №2_.NET Socket 简单的应用,实现服务器与客户端 实时更新对话.!
- SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)
- [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连
- 实现桌面应用图标的动态隐藏和显示,触发事件为SIM卡的状态
- 【Android应用实例之四】计时器之通过Service&BroadcastReceiver实现UI动态更新
- zookeeper实现分布式应用系统服务器上下线动态感知程序、监听机制与守护线程
- 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字
- 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字
- 分布式Web应用----基于Socket+动态代理实现简单RPC 生产者消费者模型
- 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连
- 用Socket类实现HTTP协议客户端应用
- 用临时表代替游标实现多条数据的动态更新
- POI解析Excel之应用反射等技术实现动态读取
- ecshop后台实现用ajax动态修改/更新用户评论的时间
- Heighcharts ajax 动态更新链接状态图
- 【Android增量升级系列_01】 浅谈Android增量更新客户端的实现方法