[源码阅读]Cassandra Nodetool 是如何输出json格式的?

栏目: 数据库 · 发布时间: 6年前

内容简介:[源码阅读]Cassandra Nodetool 是如何输出json格式的?

本篇文章的目的就是尝试来阅读以下具体实现的源码。

从哪里入手?

首先 https://issues.apache.org/jira/browse/CASSANDRA-5977 。在这个issue之中,附带了patch的实现。从path之中,可以看到commitor首先修改了TableStats的代码。

将Cassandra的代码从github clone下来之后,用Eclipse来看。

PS: 用Eclipse的话,会遇到找不到“net.nicoulaj”的编译错误,这个应该是Cassandra的作者都是用idea来写的吧~ 暂时可以不管它。 不影响我们阅读代码

原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/

1. TableStats: Annotation的命令行方式

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

之前一直习惯使用Apache commin-line, 这次看到了新东西:通过Annotation的方式的command line。

不说哪种更好吧,至少是看到新东西了。借助的是io.airlift.command.*;

Github: https://github.com/airlift/airline

原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/

2.TableStats的两个主要步骤:

  1. StatsHolder
  2. StatsPrinter

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

接下来会先看看TableStatsHolder,再看看TableStatsPrinter

原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/

3. StatsHolder 是一个接口, TableStatsHolder 面向接口编程

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

从前一副图也可以看到,等号左边的是StatsHolder, 等号右边是TableStatsHolder.

原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/

4. TableStatsHolder 有个NodeProbe

字面意思: 节点探针

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

上面的解释可以看到,这是JMX相关的操作,而JMX就是用来看Cassandra相关的各种Metric的。从下面的代码可以简要看出:

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

具体就不深究了~

这个NodeProbe 定义在 package org.apache.cassandra.tools; 正常情况下,cassandra client 代码是无法引用到的。

5. 到TableStatsPrinter看看

  1. 先看看from方法。 毕竟在TableStats 之中看到的是:
    TableStatsPrinter.from(xxxx)
    
    [源码阅读]Cassandra Nodetool 是如何输出json格式的? 在这里,我们终于可以看到json/yaml的相关输出了
    注意: 在JDK8 之中,switch已经支持String类型了。
  2.  然后发现 DefaultPrinter 其实是一个内部静态类 [源码阅读]Cassandra Nodetool 是如何输出json格式的? 我不是非常理解,为什么这帮人这么喜欢使用各种内部类,静态的、非静态的。。。
    内部类有什么好处吗? 不能使用方法吗? 这是个人风格问题?
  3. 再复习一下泛型
    [源码阅读]Cassandra Nodetool 是如何输出json格式的? 个人理解,泛型的主要作用就是让编译器能做类型检查。

6. JsonPrinter

从上一幅图可以看到,最终的json输出,用的是json-simple, 居然不是大名鼎鼎的Gson/FastJson之类的。 惊讶

同时注意: 这个JsonPrinter 又是一个内部类~ OMG, 我需要回去补充一下内部类的使用了。

使用Eclipse的代码搜索,我们看到,还有其他几个都有调用到JsonPrinter:

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/

7. YamlPrinter

我用的不多,看看就好:

[源码阅读]Cassandra Nodetool 是如何输出json格式的?

主要是基于org.yaml.snakeyaml.*的实现

总结:

Nodetool输出Json,首先在实现了StatsHolder接口的TableStatsHolder使用NodeProbe探针,把相关Metric抽取出来,放到一个Map之中,然后调用TableStatsPrinter之中的JsonPrinter这个内部类的打印方法,使用simple json 将一个map直接输出成json

后记:

第一次写源码阅读的文章,经验不足,还请大神指点


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精益创业

精益创业

[美] 埃里克·莱斯 / 吴彤 / 中信出版社 / 2012-8 / 49.00元

《精益创业:新创企业的成长思维》内容简介:我们正处在一个空前的全球创业兴盛时代,但无数创业公司都黯然收场,以失败告终。精益创业代表了一种不断形成创新的新方法,它源于“精益生产”的理念,提倡企业进行“验证性学习”,先向市场推出极简的原型产品,然后在不断地试验和学习中,以最小的成本和有效的方式验证产品是否符合用户需求,灵活调整方向。如果产品不符合市场需求,最好能“快速地失败、廉价地失败”,而不要“昂贵......一起来看看 《精益创业》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换