ZooKeeper(3.4.5) - 原生 API 的简单示例
一、创建会话
1. 创建一个基本的ZooKeeper会话实例
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 创建一个基本的ZooKeeper会话实例* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);/*** ZooKeeper客户端和服务器会话的建立是一个异步的过程* 构造函数在处理完客户端的初始化工作后立即返回,在大多数情况下,并没有真正地建立好会话* 当会话真正创建完毕后,Zookeeper服务器会向客户端发送一个事件通知*/ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});System.out.println("State1: " + zk.getState()); // CONNECTING connectedSignal.await(); System.out.println("State2: " + zk.getState()); // CONNECTED zk.close();System.out.println("State3: " + zk.getState()); // CLOSED }}
2. 创建一个复用sessionId和sessionPasswd的Zookeeper对象示例
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 创建一个复用sessionId和sessionPasswd的ZooKeeper对象示例* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();long sessionId = zk.getSessionId();byte[] passwd = zk.getSessionPasswd();zk.close();final CountDownLatch anotherConnectedSignal = new CountDownLatch(1);ZooKeeper newZk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {anotherConnectedSignal.countDown();}}},sessionId, passwd);anotherConnectedSignal.await();newZk.close();}}
二、创建节点
1. 使用同步API创建一个ZNode节点
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API创建一个ZNode节点* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();String path = zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(path + " is created.");zk.close();}}
2. 使用异步API创建一个ZNode节点
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids;/*** 使用异步API创建一个ZNode节点* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL,new AsyncCallback.StringCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, String name) {// 服务器响应吗System.out.println("ResultCode: " + rc);// 接口调用时传入API的数据节点的路径参数值System.out.println("Znode: " + path);// 接口调用时传入API的ctx参数值System.out.println("Context: " + (String)ctx);// 实际在服务端创建的节点名System.out.println("Real Path: " + name);}},"The Context");zk.close();}}
三、删除节点
1. 使用同API删除一个ZNode节点
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 使用同步API删除一个ZNode节点* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.delete("/zk-huey", -1);zk.close();}}
2. 使用异步API删除一个ZNode节点
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 使用异步API删除一个ZNode节点* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.delete("/zk-huey", -1,new AsyncCallback.VoidCallback() {@Overridepublic void processResult(int rc, String path, Object ctx) {System.out.println("ResultCode: " + rc);System.out.println("Znode: " + path);System.out.println("Context: " + (String)ctx);}},"The Context");zk.close();}}
四、获取子节点列表
1. 使用同步API获取子节点列表
package com.huey.dream.demo;import java.util.List; import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat;/*** 使用同步API获取子节点列表* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);zk.register(new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();} else if (event.getType() == EventType.NodeChildrenChanged) { try {System.out.println("NodeChildrenChanged.");List<String> children = zk.getChildren(event.getPath(), true);System.out.println("Children: " + children);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}});connectedSignal.await();zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Stat stat = new Stat();List<String> children = zk.getChildren("/zk-huey", true, // 注册默认的Watcher,当子节点类别发送变更的话,向客户端发送通知stat // 用于描述节点状态信息 );System.out.println("Stat: " + stat);System.out.println("Children: " + children);zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Thread.sleep(10 * 1000);zk.close();}}
结果输出:
Stat: 4294967436,4294967436,1425201236879,1425201236879,0,2,0,0,4,2,4294967438Children: [node2, node1] NodeChildrenChanged. State: CONNECTED Children: [node2, node3, node1]
2. 使用异步API获取子节点列表
package com.huey.dream.demo;import java.util.List; import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat;/*** 使用异步API获取子节点列表* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);zk.register(new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();} else if (event.getType() == EventType.NodeChildrenChanged) { try {System.out.println("NodeChildrenChanged.");List<String> children = zk.getChildren(event.getPath(), true);System.out.println("Children: " + children);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}});connectedSignal.await();zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.getChildren("/zk-huey", true,new AsyncCallback.Children2Callback() {@Overridepublic void processResult(int rc, String path, Object ctx,List<String> children, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Children: " + children);System.out.println("Stat: " + stat);}},"The Context");zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Thread.sleep(10 * 1000);zk.close();}}
五、获取节点数据内容
1. 使用同步API获取节点数据内容
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API获取节点数据内容* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + new String(nodeData));zk.close();}}
2. 使用异步API获取节点数据内容
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat;/*** 使用异步API获取节点数据内容* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.getData("/zk-huey", false, new AsyncCallback.DataCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, byte[] data,Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("NodeData: " + new String(data));System.out.println("Stat: " + stat);}},"The Context");zk.close();}}
六、更新数据
1. 使用同步API更新节点数据内容
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API更新节点数据内容* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.setData("/zk-huey", "world".getBytes(), -1);nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.close();}}
2. 使用异步API更新节点数据内容
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat;/*** 使用异步API更新节点数据内容* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.setData("/zk-huey", "world".getBytes(), -1,new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Stat: " + stat);}},"The Context");zk.close();}}
七、判断节点是否存在
1. 使用同步API判断节点是否存在
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat;/*** 使用同步API判断节点是否存在* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();Stat stat = zk.exists("/zk-huey", false);if (stat == null) {zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);} else {System.out.println("Stat: " + stat);}zk.close();}}
2. 使用异步API判断节点是否存在
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.data.Stat;/*** 使用异步API判断节点是否存在* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() { @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.exists("/zk-huey", false,new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Stat: " + stat);}},"The Context");zk.close();}}
八、权限控制
package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.ZooDefs.Ids;/*** ZooKeeper权限控制* @author huey* @version 1.0 * @created 2015-3-1*/ public class ZKDemo {public static void main(String[] args) throws Exception {/*** 使用含有权限信息的zookeeper会话创建数据节点*/final CountDownLatch connectedSignal = new CountDownLatch(1);ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {connectedSignal.countDown();}});connectedSignal.await();zk.addAuthInfo("digest", "huey:123".getBytes());zk.create("/zk-huey", "hello".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);zk.close();/*** 使用无权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk1 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk1.getData("/zk-huey", false, null);System.out.println("NodeData: " + new String(zk1.getData("/zk-huey", false, null)));zk1.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}/*** 使用错误权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk2 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk2.addAuthInfo("digest", "huey:abc".getBytes());System.out.println("NodeData: " + new String(zk2.getData("/zk-huey", false, null)));zk2.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}/*** 使用正确权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk3 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk3.addAuthInfo("digest", "huey:123".getBytes());System.out.println("NodeData: " + new String(zk3.getData("/zk-huey", false, null)));zk3.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}}}
结果输出:
Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey NodeData: hello
转载于:https://www.cnblogs.com/huey/p/4307056.html
ZooKeeper(3.4.5) - 原生 API 的简单示例相关推荐
- 原生API编写简单富文本编辑器001
原生API编写简单富文本编辑器001 系列文章快速阅读: 富文本编辑器开发系列-1-基础概念 富文本编辑器开发系列2-document.execCommand 的API 富文本编辑器开发系列3-sel ...
- express 4.x API 及简单示例
express 4.x API express() 创建一个express应用. The express() 函数是一个顶级函数通过express模块导出的. var express = requir ...
- 【Redis】三、Redis安装及简单示例
(四)Redis安装及使用 Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装. 安装完成后,通过r ...
- Zookeeper_原生API操作(二)
在有curator这个框架之前的时候,然后zookeeper怎么去实现分布式锁,就是利用刚才的那种方案,就是可以去实现,你会有各种各样的疑问,你刚才讲的设计是得先get一下,你不如直接create,因 ...
- Zookeeper_原生API操作(一)
讲了zookeeper的简单的介绍,以及环境搭建,还有zkClient的使用,基本上很简单,作为HelloWorld,今天继续往下走,既然已经把简介和环境搭建完了,然后一会来说说配置,配置也没有什么说 ...
- IOS7使用原生API进行二维码和条形码的扫描
使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析 ...
- api怎么写_使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- Java原生API操作XML
使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...
- zookeeper集群搭建和API使用
一.vmware设置虚拟机centeros的ip 1.设置vm属性 先设置NAT模式 点击菜单栏编辑 记录子网网关地址 2.修改linux配置 [1]修改linux ip地址 vi /etc/sysc ...
- H5调用Android原生Api
Android 与H5交互之跳转拦截 Android拦截跳转,实现web调用原生Api 定义变量 在Android代码设置回调事件 前端代码 判断url是否合法 根据不同的type执行不同的操作 An ...
最新文章
- web service
- 音乐处理---H_music.php
- ESXi安装全过程及基本配置
- Chika and Friendly Pairs
- 【Python】忘记登录密码?遍历数字字母组合密码+模拟提交表单
- zoj 3640 概率dp
- 第73课 丑数 函数的应用
- [转帖] 国产x86-海光禅定 2018年营收过亿?
- PHP Socket 深度探索 (一)
- pip 卸载包失败的文件夹处理
- 自适应遗传算法(AGA)《Adaptive Probabilities of Crossover》的剖析
- 推荐3个计算机专业的英文电子书下载网站
- Flutter 微信语音消息播放动画
- DIM抠图网络 Deep Image Matting 论文笔记
- 数字孪生与3D可视化
- 有效的网络推广超级实用方法
- TIA博途下载PLC程序时提示“具有激活的TIS功能防止下载到设备”错误-处理办法
- 数理统计笔记7:分类数据分析-拟合优度检验和列联分析
- ### 通达信数据之实时机构持股数据接口
- qq协议 0825 和 0836 udp 登录包解析