[源码阅读]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

后记:

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


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

查看所有标签

猜你喜欢:

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

Pro JavaScript Design Patterns

Pro JavaScript Design Patterns

Dustin Diaz、Ross Harmes / Apress / 2007-12-16 / USD 44.99

As a web developer, you’ll already know that JavaScript™ is a powerful language, allowing you to add an impressive array of dynamic functionality to otherwise static web sites. But there is more power......一起来看看 《Pro JavaScript Design Patterns》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具