ZooKeeper源码(2)cli,client,common,jmx,version包
来源:互联网 发布:高频数据分析 编辑:程序博客网 时间:2024/05/23 00:00
jmx包
从ComonNames文件中知道,org.apache.ZooKeeperService很重要
//CommonNames.javapublic class CommonNames { public static final String DOMAIN="org.apache.ZooKeeperService"; public static final String DATA_TREE_KEY="DataTree"; public static final String STANDALONE_SERVER_KEY="StandaloneServer";}//ManagedUtil.java//配置log4j//MBeanRegistry.java//不懂JMX,看不懂//ZKMBeabInfo.java//ZooKeeper要监控的bean的接口public interface ZKMBeanInfo { public String getName(); public boolean isHidden();}
cli包
这个包是解析zk-cli的命令的,所有命令的就是继承自CliCommand类。看到这么命名的,就基本知道是命令模式了。
abstract public class CliCommand { protected ZooKeeper zk; //要自己设置 protected PrintStream out; //默认System.out protected PrintStream err; //默认System.err private String cmdStr; //这个是子类传入的,如"create" private String optionStr; //这个也是子类传入的,如"[-s] [-e] [-c] [-t ttl] path [data] [acl]" public void addToMap(Map<String, CliCommand> cmdMap) { //记录下命令 .3 cmdMap.put(cmdStr, this); } abstract public CliCommand parse(String cmdArgs[]) throws CliParseException; abstract public boolean exec() throws CliException;
看一下CreateCommand的实现,结果发现比3.4.10还多了一些选项
public class CreateCommand extends CliCommand { private static Options options = new Options(); private String[] args; private CommandLine cl; static { options.addOption(new Option("e", false, "ephemeral")); options.addOption(new Option("s", false, "sequential")); options.addOption(new Option("c", false, "container")); options.addOption(new Option("t", true, "ttl")); } public CreateCommand() { super("create", "[-s] [-e] [-c] [-t ttl] path [data] [acl]"); }} //用于解析输入的命令 public CliCommand parse(String[] cmdArgs){ ... } //用于执行解析的命令 //委派给父类的ZooKeeper来执行 public boolean exec() throws CliException { //... String newPath = hasT ? zk.create(path, data, acl, flags, new Stat(), ttl) : zk.create(path, data, acl, flags); //... }
来,那就看看全部的命令吧
//e->ephemeral, s->sequential//c->container, t->ttlpublic class CreateCommand extends CliCommand { public CreateCommand() { super("create", "[-s] [-e] [-c] [-t ttl] path [data] [acl]"); }}//v->versionpublic class DeleteCommand extends CliCommand { public DeleteCommand() { super("delete", "[-v version] path"); }}public class DeleteAllCommand extends CliCommand { public DeleteAllCommand() { this("deleteall"); }}//s->stats, w->watchpublic class GetCommand extends CliCommand { private static Options options = new Options(); public GetCommand() { super("get", "[-s] [-w] path"); }}//s->stats, v->versionpublic class SetCommand extends CliCommand { public SetCommand() { super("set", "[-s] [-v version] path data"); }}public class Ls2Command extends CliCommand { public Ls2Command() { super("ls2", "path [watch]"); }}//ls ? ->help//s->stat, w->watch, r->recursepublic class LsCommand extends CliCommand { public LsCommand() { super("ls", "[-s] [-w] [-R] path"); }}//b->bytes quota, n->num quotapublic class SetQuotaCommand extends CliCommand { public SetQuotaCommand() { super("setquota", "-n|-b val path"); }}public class ListQuotaCommand extends CliCommand { public ListQuotaCommand() { super("listquota", "path"); }}//b->bytes quota, n->num quotapublic class DelQuotaCommand extends CliCommand { public DelQuotaCommand() { super("delquota", "[-n|-b] path"); }}//s->statspublic class GetAclCommand extends CliCommand { public GetAclCommand() { super("getAcl", "[-s] path"); }}//s->stats, v->versionpublic class SetAclCommand extends CliCommand { public SetAclCommand() { super("setAcl", "[-s] [-v version] path acl"); }}public class AddAuthCommand extends CliCommand { public AddAuthCommand() { super("addauth", "scheme auth"); }}public class CloseCommand extends CliCommand { public CloseCommand() { super("close", ""); }}//s->stats, w->watch//c->client connection stringpublic class GetConfigCommand extends CliCommand { private static Options options = new Options(); public GetConfigCommand() { super("config", "[-c] [-w] [-s]"); }}//s->stats//v->required current config version//file->path of config file to parse for membership//members->comma-separated list of config strings for non-incremental reconfig//add->comma-separated list of config strings for new servers//remove->comma-separated list of server IDs to removepublic class ReconfigCommand extends CliCommand { public ReconfigCommand() { super("reconfig", "[-s] " + "[-v version] " + "[[-file path] | " + "[-members serverID=host:port1:port2;port3[,...]*]] | " + "[-add serverId=host:port1:port2;port3[,...]]* " + "[-remove serverId[,...]*]"); }}//c->child watcher type//d->data watcher type//a->any watcher type//l->remove locally when there is no server connectionpublic class RemoveWatchesCommand extends CliCommand { public RemoveWatchesCommand() { super("removewatches", "path [-c|-d|-a] [-l]"); }}//w->watchpublic class StatCommand extends CliCommand { public StatCommand() { super("stat", "[-w] path"); }}public class SyncCommand extends CliCommand { public SyncCommand() { super("sync", "path"); }}
client包
//ConnectStringParser//解析localhost:2181,localhost:2182这种//全部加入一个Listpublic final class ConnectStringParser { private static final int DEFAULT_PORT = 2181; private final String chrootPath; private final ArrayList<InetSocketAddress> serverAddresses = new ArrayList<InetSocketAddress>();}//FourLetterWordMain//四字命令的客户端吧//只是为了便于测试,使用了SSLSocket//HostProvider//StaticHostProvider//cli连接时,是可以传入多个地址的,这里的作用就是随机分配一个地址,也算负载均衡吧//没错,还有篇论文,这里用的将服务器打乱随机选一个。https://issues.apache.org/jira/browse/ZOOKEEPER-1355//ZKClientConfig//配置文件//ZooKeeperSaslClient//SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。
common包
AtomicFileOutputStream: 但是没有看出哪里原子了…这个类是从HDFS直接弄过来的
public class AtomicFileOutputStream extends FilterOutputStream { private static final String TMP_EXTENSION = ".tmp"; private final File origFile; private final File tmpFile; public AtomicFileOutputStream(File f) throws FileNotFoundException { // Code unfortunately must be duplicated below since we can't assign // anything // before calling super super(new FileOutputStream(new File(f.getParentFile(), f.getName() + TMP_EXTENSION))); origFile = f.getAbsoluteFile(); tmpFile = new File(f.getParentFile(), f.getName() + TMP_EXTENSION) .getAbsoluteFile(); }
AtomicFileWritingIdiom:为了提供文件的原子写入,Based on the org.apache.zookeeper.server.quorum.QuorumPeer.writeLongToFile(…) idiom ,using the HDFS AtomicFileOutputStream class.
public class AtomicFileWritingIdiom { public static interface OutputStreamStatement { public void write(OutputStream os) throws IOException; } public static interface WriterStatement { public void write(Writer os) throws IOException; } public AtomicFileWritingIdiom(File targetFile, OutputStreamStatement osStmt) throws IOException { this(targetFile, osStmt, null); } public AtomicFileWritingIdiom(File targetFile, WriterStatement wStmt) throws IOException { this(targetFile, null, wStmt); } private AtomicFileWritingIdiom(File targetFile, OutputStreamStatement osStmt, WriterStatement wStmt) throws IOException { AtomicFileOutputStream out = null; boolean error = true; try { out = new AtomicFileOutputStream(targetFile); if (wStmt == null) { // execute output stream operation osStmt.write(out); } else { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); // execute writer operation and flush wStmt.write(bw); bw.flush(); } out.flush(); // everything went ok error = false; } finally { // nothing interesting to do if out == null if (out != null) { if (error) { // worst case here the tmp file/resources(fd) are not cleaned up // and the caller will be notified (IOException) out.abort(); } else { // if the close operation (rename) fails we'll get notified. // worst case the tmp file may still exist IOUtils.closeStream(out); } } } }}
IOUtil
closeStream(Closeable stream)cleanup(Logger log, Closeable... closeables)copyBytes(InputStream in, OutputStream out,int buffSize, boolean close) copyBytes(InputStream in, OutputStream out, int buffSize)
PathTrie:有空好好研究,这东西是一个单词树
PathUtil: 验证路径没有错, 和Window里面的//进行转换
public static void validatePath(String path, boolean isSequential) public static void validatePath(String path)public static String normalizeFileSystemPath(String path)
StringUtil: 分割和拼接字符串,默认是分割成String[],这里改进为列表
public static List<String> split(String value, String separator)public static String joinStrings(List<String> list, String delim)
Time: 时间,略过
X509Util和ZKConfig大多属性标记废弃了,X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。
version包
就一个VerGen类,输出当前ZooKeeper版本信息
阅读全文
0 0
- ZooKeeper源码(2)cli,client,common,jmx,version包
- Apache-common包之common-cli笔记
- Apache-common 包之 common-cli 笔记
- zookeeper源码分析-client分析
- Common CLI
- 通过JMX监控Zookeeper
- 使用jmx 监控zookeeper
- 通过 JMX 监控Zookeeper
- Zookeeper client
- Zookeeper client
- Common - CLI MiniCluster
- Zookeeper-Zookeeper client
- Zookeeper-Zookeeper client
- Zookeeper-Zookeeper client
- Zookeeper-Zookeeper client
- ZooKeeper源码学习笔记(1)--client端解析
- ZooKeeper源码解析(四):client如何和server连接
- 源码-spark client(2)
- ZigBee CC2530 Z-Stack 25 基于系统时钟的多功能按键2-指示灯
- 【LeetNode2-1-2】Remove duplicates from sorted array II--C++源代码(VS2015)
- SSH整合开发的小Demo--网上银行系统之普通用户模块开发
- kafka_2.11-1.0.0单机和集群的安装和配置
- 替换空格【C++实现】
- ZooKeeper源码(2)cli,client,common,jmx,version包
- Matryx——去中心化合作平台
- 韩信点兵
- C++之STL set和map解析(4)---《C++ STL》
- Java-排序算法之冒泡排序算法
- 【loli的胡策】NOIP训练10.5(组合数学+catalan数讲解)
- golang 的指针和非指针方法的见解
- 购买实物金银的常见误区
- 自定义函数标签:实现前台小数据的获取