4 种 持久和临时 无序和有序
若创建它的客户端断开连接后(和zkServer 断开),则节点会自动删除
/** * 临时节点,若创建它的客户端断开连接,则自动死掉 * 使用多一点 */ public static void createEm() { zkClient.createEphemeral("/test"); try { System.out.println("挂起jvm,线程在此一致等待"); System.in.read(); } catch (IOException e) { e.printStackTrace(); } // zkClient.close(); } // 创建一个临时的顺序节点 使用少 public static void createEmSeq() { zkClient.createEphemeralSequential("/test1", "test"); }服务消费者每次调用时,都有从zk 上获取一次数据
在高并发调用,每次去获取远程的服务列表,是个性能问题 若每次拉取服务要2 s -0s 远程需要1 s =3s->1s
查询数据:管理员的菜单
缓存里面的时间和数据源里面的数据不一致导致 Eg: 现在有个服务挂了,zk 上会自动删除它,但是缓存列表里面还有它
若:zk 上节点有变化,能修改我的缓存(订阅的功能)
/** * 1 第一次从zk 上面拉取 ? * 2 拉取之后保存起来 * 3 以后的获取数据都从缓存里面找 * * @param serverName * @return */ public static List<String>fetchServerListCache(String serverName){ if(serverList.containsKey(serverName)) { // 代表之前获取过该服务的列表 System.out.println("从缓存里面获取"); List<String> list = serverList.get(serverName); return list; } List<String> fetchServerList = fetchServerList(serverName); //不包含,说明之前没有拉取过,我先拉取到,保存起来 serverList.put(serverName, fetchServerList); // 拉取成功后,我开始关注这个节点,若该节点有变化,我修改缓存里面的数据 zkClient.subscribeChildChanges("/"+serverName, new IZkChildListener() { @Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { System.out.println("有服务死机或上线,需要更新服务的列表"); System.out.println("缓存里面的服务列表为"+serverList.get(serverName)); System.out.println("最新的为"+currentChilds); System.out.println("开始更新"); serverList.put(serverName, currentChilds); System.out.println("修改成功"); } }); return fetchServerList; }