内容简介:[源码阅读]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的命令行方式
之前一直习惯使用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的两个主要步骤:
- StatsHolder
- StatsPrinter
接下来会先看看TableStatsHolder,再看看TableStatsPrinter
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
3. StatsHolder 是一个接口, TableStatsHolder 面向接口编程
从前一副图也可以看到,等号左边的是StatsHolder, 等号右边是TableStatsHolder.
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
4. TableStatsHolder 有个NodeProbe
字面意思: 节点探针
上面的解释可以看到,这是JMX相关的操作,而JMX就是用来看Cassandra相关的各种Metric的。从下面的代码可以简要看出:
具体就不深究了~
这个NodeProbe 定义在 package org.apache.cassandra.tools; 正常情况下,cassandra client 代码是无法引用到的。
5. 到TableStatsPrinter看看
- 先看看from方法。 毕竟在TableStats 之中看到的是:
TableStatsPrinter.from(xxxx)
在这里,我们终于可以看到json/yaml的相关输出了
注意: 在JDK8 之中,switch已经支持String类型了。 - 然后发现 DefaultPrinter 其实是一个内部静态类 我不是非常理解,为什么这帮人这么喜欢使用各种内部类,静态的、非静态的。。。
内部类有什么好处吗? 不能使用方法吗? 这是个人风格问题? - 再复习一下泛型
个人理解,泛型的主要作用就是让编译器能做类型检查。
6. JsonPrinter
从上一幅图可以看到,最终的json输出,用的是json-simple, 居然不是大名鼎鼎的Gson/FastJson之类的。 惊讶
同时注意: 这个JsonPrinter 又是一个内部类~ OMG, 我需要回去补充一下内部类的使用了。
使用Eclipse的代码搜索,我们看到,还有其他几个都有调用到JsonPrinter:
原文链接: http://www.flyml.net/2017/01/06/cassandra-nodetool-how-to-output-json/
7. YamlPrinter
我用的不多,看看就好:
主要是基于org.yaml.snakeyaml.*的实现
总结:
Nodetool输出Json,首先在实现了StatsHolder接口的TableStatsHolder使用NodeProbe探针,把相关Metric抽取出来,放到一个Map之中,然后调用TableStatsPrinter之中的JsonPrinter这个内部类的打印方法,使用simple json 将一个map直接输出成json
后记:
第一次写源码阅读的文章,经验不足,还请大神指点
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的?
- Log4Qt快速入门——Log4Qt日志输出重定向源码解析
- 2. Python中的基本输入、输出、格式化输出
- console 输出对象
- 多种格式数据输出
- Java输入输出挂
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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 格式化工具
HSV CMYK 转换工具
HSV CMYK互换工具