// Path: redant-cluster/src/main/java/com/redant/cluster/node/Node.java
// public class Node {
// 
//     private static final String DEFAULT_HOST = GenericsUtil.getLocalIpV4();
// 
//     private static final int DEFAULT_PORT = 8088;
// 
//     public static final Node DEFAULT_PORT_NODE = new Node(DEFAULT_HOST,DEFAULT_PORT);
// 
//     private String id;
// 
//     private String host;
// 
//     private int port;
// 
//     public Node(int port){
//         this(DEFAULT_HOST,port);
//     }
// 
//     public Node(String host, int port){
//         this(SecureUtil.md5(host+"&"+port),host,port);
//     }
// 
//     public Node(String id, String host, int port){
//         this.id = id;
//         this.host = host;
//         this.port = port;
//     }
// 
//     public static Node getNodeWithArgs(String[] args){
//         Node node = Node.DEFAULT_PORT_NODE;
//         if(args.length>1 && NumberUtil.isInteger(args[1])){
//             node = new Node(Integer.parseInt(args[1]));
//         }
//         return node;
//     }
// 
//     /**
//      * 从JsonObject中解析出SlaveNode
//      * @param object 对象
//      * @return 节点
//      */
//     public static Node parse(JSONObject object){
//         if(object==null){
//             return null;
//         }
//         String host = object.getString("host");
//         int port = object.getIntValue("port");
//         String id = object.getString("id");
//         return new Node(id,host,port);
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public void setPort(int port) {
//         this.port = port;
//     }
// 
//     public String getId(){
//         return id;
//     }
// 
//     @Override
//     public String toString() {
//         return JSON.toJSONString(this);
//     }
// 
// }
// 
// Path: redant-cluster/src/main/java/com/redant/cluster/zk/ZkClient.java
// public class ZkClient {
// 
//     /**
//      * 节点的session超时时间，当Slave服务停掉后，
//      * curator客户端需要等待该节点超时后才会触发CHILD_REMOVED事件
//      */
//     private static final int DEFAULT_SESSION_TIMEOUT_MS = 5000;
// 
//     private static final int DEFAULT_CONNECTION_TIMEOUT_MS = 15000;
// 
//     /**
//      * 操作ZK的客户端
//      */
//     private static Map<String,CuratorFramework> clients;
// 
//     private static Lock lock;
// 
//     static{
//         clients = new ConcurrentHashMap<>();
//         lock = new ReentrantLock();
//     }
// 
//     /**
//      * 获取ZK客户端
//      * @param zkAddress zk服务端地址
//      * @return zk客户端
//      */
//     public static CuratorFramework getClient(String zkAddress){
//         if(zkAddress == null || zkAddress.trim().length() == 0){
//             return null;
//         }
//         CuratorFramework client = clients.get(zkAddress);
//         if(client==null){
//             lock.lock();
//             try {
//                 if(!clients.containsKey(zkAddress)) {
//                     client = CuratorFrameworkFactory.newClient(
//                             zkAddress,
//                             DEFAULT_SESSION_TIMEOUT_MS,
//                             DEFAULT_CONNECTION_TIMEOUT_MS,
//                             new RetryNTimes(10, 5000)
//                     );
//                     client.start();
//                     clients.putIfAbsent(zkAddress,client);
//                 }else{
//                     client = clients.get(zkAddress);
//                 }
//             }finally {
//                 lock.unlock();
//             }
//         }
//         return client;
//     }
// 
// }
// 
// Path: redant-cluster/src/main/java/com/redant/cluster/zk/ZkNode.java
// public class ZkNode {
// 
//     /**
//      * 根节点
//      */
//     public static final String ROOT_NODE_PATH = "/redant";
// 
//     /**
//      * SlaveNode注册的节点
//      */
//     public static final String SLAVE_NODE_PATH = ROOT_NODE_PATH+"/slave";
// 
// 
// 
// }


import cn.hutool.core.util.StrUtil;
import com.redant.cluster.node.Node;
import com.redant.cluster.zk.ZkClient;
import com.redant.cluster.zk.ZkNode;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package com.redant.cluster.service.register;


/**
 * @author houyi.wh
 * @date 2017/11/21
 **/
public class ZkServiceRegister implements ServiceRegister {

    private static final Logger LOGGER = LoggerFactory.getLogger(ZkServiceRegister.class);

    private CuratorFramework client;

    private static ZkServiceRegister register;

    private ZkServiceRegister(){

    }

// Path: redant-cluster/src/main/java/com/redant/cluster/node/Node.java
// public class Node {
// 
//     private static final String DEFAULT_HOST = GenericsUtil.getLocalIpV4();
// 
//     private static final int DEFAULT_PORT = 8088;
// 
//     public static final Node DEFAULT_PORT_NODE = new Node(DEFAULT_HOST,DEFAULT_PORT);
// 
//     private String id;
// 
//     private String host;
// 
//     private int port;
// 
//     public Node(int port){
//         this(DEFAULT_HOST,port);
//     }
// 
//     public Node(String host, int port){
//         this(SecureUtil.md5(host+"&"+port),host,port);
//     }
// 
//     public Node(String id, String host, int port){
//         this.id = id;
//         this.host = host;
//         this.port = port;
//     }
// 
//     public static Node getNodeWithArgs(String[] args){
//         Node node = Node.DEFAULT_PORT_NODE;
//         if(args.length>1 && NumberUtil.isInteger(args[1])){
//             node = new Node(Integer.parseInt(args[1]));
//         }
//         return node;
//     }
// 
//     /**
//      * 从JsonObject中解析出SlaveNode
//      * @param object 对象
//      * @return 节点
//      */
//     public static Node parse(JSONObject object){
//         if(object==null){
//             return null;
//         }
//         String host = object.getString("host");
//         int port = object.getIntValue("port");
//         String id = object.getString("id");
//         return new Node(id,host,port);
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public void setPort(int port) {
//         this.port = port;
//     }
// 
//     public String getId(){
//         return id;
//     }
// 
//     @Override
//     public String toString() {
//         return JSON.toJSONString(this);
//     }
// 
// }
// 
// Path: redant-cluster/src/main/java/com/redant/cluster/zk/ZkClient.java
// public class ZkClient {
// 
//     /**
//      * 节点的session超时时间，当Slave服务停掉后，
//      * curator客户端需要等待该节点超时后才会触发CHILD_REMOVED事件
//      */
//     private static final int DEFAULT_SESSION_TIMEOUT_MS = 5000;
// 
//     private static final int DEFAULT_CONNECTION_TIMEOUT_MS = 15000;
// 
//     /**
//      * 操作ZK的客户端
//      */
//     private static Map<String,CuratorFramework> clients;
// 
//     private static Lock lock;
// 
//     static{
//         clients = new ConcurrentHashMap<>();
//         lock = new ReentrantLock();
//     }
// 
//     /**
//      * 获取ZK客户端
//      * @param zkAddress zk服务端地址
//      * @return zk客户端
//      */
//     public static CuratorFramework getClient(String zkAddress){
//         if(zkAddress == null || zkAddress.trim().length() == 0){
//             return null;
//         }
//         CuratorFramework client = clients.get(zkAddress);
//         if(client==null){
//             lock.lock();
//             try {
//                 if(!clients.containsKey(zkAddress)) {
//                     client = CuratorFrameworkFactory.newClient(
//                             zkAddress,
//                             DEFAULT_SESSION_TIMEOUT_MS,
//                             DEFAULT_CONNECTION_TIMEOUT_MS,
//                             new RetryNTimes(10, 5000)
//                     );
//                     client.start();
//                     clients.putIfAbsent(zkAddress,client);
//                 }else{
//                     client = clients.get(zkAddress);
//                 }
//             }finally {
//                 lock.unlock();
//             }
//         }
//         return client;
//     }
// 
// }
// 
// Path: redant-cluster/src/main/java/com/redant/cluster/zk/ZkNode.java
// public class ZkNode {
// 
//     /**
//      * 根节点
//      */
//     public static final String ROOT_NODE_PATH = "/redant";
// 
//     /**
//      * SlaveNode注册的节点
//      */
//     public static final String SLAVE_NODE_PATH = ROOT_NODE_PATH+"/slave";
// 
// 
// 
// }


// Path: redant-cluster/src/main/java/com/redant/cluster/service/register/ZkServiceRegister.java
import cn.hutool.core.util.StrUtil;
import com.redant.cluster.node.Node;
import com.redant.cluster.zk.ZkClient;
import com.redant.cluster.zk.ZkNode;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

package com.redant.cluster.service.register;


/**
 * @author houyi.wh
 * @date 2017/11/21
 **/
public class ZkServiceRegister implements ServiceRegister {

    private static final Logger LOGGER = LoggerFactory.getLogger(ZkServiceRegister.class);

    private CuratorFramework client;

    private static ZkServiceRegister register;

    private ZkServiceRegister(){

    }

    private ZkServiceRegister(String zkAddress){