以前很少写blog 的 一来公司项目忙 二是自己觉得文字表达能力表达有限 也就没写了 但是写blog 是个很好记录自己学习的习惯方式 这种习惯要好好的保持下去 和大家分享自己的所学 共同进步 话不多说 正文开始。
公司的java服务都是分模块服务的 一个系统拆开成很多的子模块 各个模块做自己业务的事情 这些服务都部署了几套 放在不同的服务器上,服务之间存在互相的调用 现在市面上rpc服务框架很多 如 阿里的dubbo Facebook的thrift 很多很多 我就不说了 我们公司采用的esb 即tlv协议进行服务之间的通信。
但唯一的遗憾 虽然系统服务拆成了很具体的模块 但公司的负载均衡一直采用第三方的服务 由于服务都是挂在UCloud 或者阿里云服务上 由于这两家运营商都提供了现成了负载均衡服务 阿里云的SLB负载均衡算法 UCloud也有。最近我们想自己做一个自己的服务 提供这种的分布式服务。监控各个服务的状态,看了dubbo ZK 最后选择了zk作为我们本身的分布式服务框架。
看了Zookeeper官网 zkClient可以支持很多的语言 相对比较成熟 C Python java 都支持。
参照他们提供的例子 自己试着写了几个例子 写下来 so simple
/** * zk 客户端 连接方法 * @param host * @return */ public ZooKeeper connect(String host) { try { zk = new ZooKeeper(host,3000,new Watcher() { public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState() == Event.KeeperState.SyncConnected) { countSingal.countDown(); } } }); countSingal.await(); return zk; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 创建节点 * @param path * @param data */ public void createNode(String path,byte[] data) { try { zk.create(path,data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 修改节点数据 * */ public void updateNode(String path,byte[] data) { try { zk.setData(path,data,zk.exists(path,true).getVersion()); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 删除节点数据 */ public void deleteNode(String path) { try { zk.delete(path,zk.exists(path,true).getVersion()); } catch (InterruptedException e) { e.printStackTrace(); } catch (KeeperException e) { e.printStackTrace(); } } /** * 获取节点数据 */ public byte[] getData(String path) { try { return zk.getData(path,true,zk.exists(path,true)); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return null; }
此时获取zk连接 增加znode 修改znode 删除znode方法已经结束
在main方法中 调用如下 即可看到相关的数据
try { ZKConnect zc = new ZKConnect(); ZooKeeper zooKeeper = zc.connect("127.0.0.1:2181"); //获取ZK连接 //获取节点数据 List<String> allNodes = zooKeeper.getChildren("/",true); for(String node:allNodes) { System.out.println("根节点为:"+node); } //创建节点 String createNode = "/second"; String createData = "second-data"; zc.createNode(createNode,createData.getBytes()); //修改节点数据 String updateNode = "/second"; String updateData = "second-updateData"; zc.updateNode(updateNode,updateData.getBytes()); //删除节点 String deleteNode = "/second"; // zc.deleteNode(deleteNode); } catch (KeeperException e) { e.getMessage(); } catch (InterruptedException e) { e.getMessage(); }
此时一个simple 的zk 例子就完成了 本人表达不好 请见谅
本人只给了一个简简单单的zk例子 没有具体介绍zk的结构和概念 安装 具体的代码 等等 后续会慢慢的给大家介绍 这是我也是从官网上一步一步来的
最后 吐槽一下 由于本人英文确实不好 只过了个四级 看英文确实吃力 很多专业单词不认识 得加强英文了