package com.github.ltsopensource.core.registry; import com.github.ltsopensource.core.cluster.Node; import com.github.ltsopensource.core.cluster.NodeType; import com.github.ltsopensource.core.commons.utils.StringUtils; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; /** * @author Robert HG (254963746@qq.com) on 5/11/15. * <p/> * /LTS/{集群名字}/NODES/TASK_TRACKER/TASK_TRACKER:\\192.168.0.150:8888?group=TASK_TRACKER&threads=8&identity=85750db6-e854-4eb3-a595-9227a5f2c8f6&createTime=1408189898185&isAvailable=true&listenNodeTypes=CLIENT,TASK_TRACKER * /LTS/{集群名字}/NODES/JOB_CLIENT/JOB_CLIENT:\\192.168.0.150:8888?group=JOB_CLIENT&threads=8&identity=85750db6-e854-4eb3-a595-9227a5f2c8f6&createTime=1408189898185&isAvailable=true&listenNodeTypes=CLIENT,TASK_TRACKER * /LTS/{集群名字}/NODES/JOB_TRACKER/JOB_TRACKER:\\192.168.0.150:8888?group=JOB_TRACKER&threads=8&identity=85750db6-e854-4eb3-a595-9227a5f2c8f6&createTime=1408189898185&isAvailable=true&listenNodeTypes=CLIENT,TASK_TRACKER * /LTS/{集群名字}/NODES/MONITOR/MONITOR:\\192.168.0.150:8888?group=JOB_TRACKER&threads=8&identity=85750db6-e854-4eb3-a595-9227a5f2c8f6&createTime=1408189898185&isAvailable=true * <p/> */ public class NodeRegistryUtils { private static final Logger LOGGER = LoggerFactory.getLogger(NodeRegistryUtils.class); public static String getRootPath(String clusterName) { return "/LTS/" + clusterName + "/NODES"; } public static String getNodeTypePath(String clusterName, NodeType nodeType) { return NodeRegistryUtils.getRootPath(clusterName) + "/" + nodeType; } public static Node parse(String fullPath) { try { Node node = new Node(); String[] nodeDir = fullPath.split("/"); NodeType nodeType = NodeType.valueOf(nodeDir[4]); node.setNodeType(nodeType); String url = nodeDir[5]; url = url.substring(nodeType.name().length() + 3); String address = url.split("\\?")[0]; String ip = address.split(":")[0]; node.setIp(ip); if (address.contains(":")) { String port = address.split(":")[1]; if (port != null && !"".equals(port.trim())) { node.setPort(Integer.valueOf(port)); } } String params = url.split("\\?")[1]; String[] paramArr = params.split("&"); for (String paramEntry : paramArr) { if (StringUtils.isEmpty(paramEntry)) { continue; } String key = paramEntry.split("=")[0]; String value = paramEntry.split("=")[1]; if ("clusterName".equals(key)) { node.setClusterName(value); } else if ("group".equals(key)) { node.setGroup(value); } else if ("threads".equals(key)) { node.setThreads(Integer.valueOf(value)); } else if ("identity".equals(key)) { node.setIdentity(value); } else if ("createTime".equals(key)) { node.setCreateTime(Long.valueOf(value)); } else if ("isAvailable".equals(key)) { node.setAvailable(Boolean.valueOf(value)); } else if ("hostName".equals(key)) { node.setHostName(value); } else if ("httpCmdPort".equals(key)) { node.setHttpCmdPort(Integer.valueOf(value)); } } return node; } catch (RuntimeException e) { LOGGER.error("Error parse node , path:" + fullPath); throw e; } } public static String getFullPath(Node node) { StringBuilder path = new StringBuilder(); path.append(getRootPath(node.getClusterName())) .append("/") .append(node.getNodeType()) .append("/") .append(node.getNodeType()) .append(":\\\\") .append(node.getIp()); if (node.getPort() != null && node.getPort() != 0) { path.append(":").append(node.getPort()); } path.append("?") .append("group=") .append(node.getGroup()) .append("&clusterName=") .append(node.getClusterName()); if (node.getThreads() != 0) { path.append("&threads=") .append(node.getThreads()); } path.append("&identity=") .append(node.getIdentity()) .append("&createTime=") .append(node.getCreateTime()) .append("&isAvailable=") .append(node.isAvailable()) .append("&hostName=") .append(node.getHostName()); if (node.getHttpCmdPort() != null) { path.append("&httpCmdPort=").append(node.getHttpCmdPort()); } return path.toString(); } public static String getRealRegistryAddress(String registryAddress) { if (StringUtils.isEmpty(registryAddress)) { throw new IllegalArgumentException("registryAddress is null!"); } if (registryAddress.startsWith("zookeeper://")) { return registryAddress.replace("zookeeper://", ""); } else if (registryAddress.startsWith("redis://")) { return registryAddress.replace("redis://", ""); } else if (registryAddress.startsWith("multicast://")) { return registryAddress.replace("multicast://", ""); } throw new IllegalArgumentException("Illegal registry protocol"); } }