project node-http2 bird eye view
协议是灰色的,代码之树常青。
所以我选择了node-http2,它是一个http/2的实现。并把它作为http/2协议研究过程中的伴侣。
在研究前期,我folk了node-http2 ,在那会儿实现的http/2 还在draft 16(第16草稿),如今已经是h2 final了。
node-http并非是唯一的选择(那是当然),c,c++,java也都有,完整的列表在这里 (https://github.com/http2/http2-spec/wiki/Implementations), 由 Mark Nottingham维护管理。
选择node-http2的原因是,我希望把之前对javascript的关注,转为为采纳为工作中的一部。而刚好这个工程还有不错的测试用例,以及运行日志(logger支持),依我看,一门动态语言,本来就缺乏IDE和DEBUGGER的支持,倘若没有testcase,logger,无论是阅读理解,还是修改进步,都是非常困难的,原始的开发者也是缺少质量意识的,因此是不值得认真关注的。
案例
在nodehttp2/example内有服务器和客户端的代码案例。跑起来也比较容易。
服务器段:node server.js
客户端:node client.js https://localhost:8080/server.js
客户端会下载server.js源代码,并且得到服务器推送(server push)过来的client.js代码到push0文件内
测试用例
说到测试用例,node-http2采纳的是mocha,一个BDD的框架。运行起来的方式非常简单。
$ npm install
$ npm install -g mocha
$ mocha
然后可以看到一堆黑白的输出,很多绿色的 √ 。看着身心舒畅。
compressor.js
HuffmanTable
method encode(buffer)
√ should return the Huffman encoded version of the input buffer
method decode(buffer)
√ should return the Huffman decoded version of the input buffer
...
logger
分析js写的代码,咋一看简单。可是,面对浓眉大眼、貌似忠良的家伙,可贵之处在于应该保持一分警惕之心。
确实如此,语言的妖艳,必然导致库的灵活,惯用法的泛滥。流程跳转的灵活,完全超出想象。
且,node缺乏一个良好的,集成的调试工具,尽管并非毫无希望。这样logger即变得不可或缺(即便有高级的调试工具,logger也不可或缺,特别是对服务器应用)。
node-http2使用了bunyan,启用并看到bunyan的输出,只要设置一个环境变量
$set HTTP2_LOG=debug
代码中有不少我的标注,其中有赞赏,有愤恨,有恍然大悟,也有行走于CallStack中的艰辛。那是我的感情,和它们融为一起。
惯用法
关于惯用法,这次集中的遇到的区域,正是Node的Stream。
node-http2大量的使用stream。Deplux,Passthrough,Transform竞相登场。各种相似却用途迥异的方法(嗯,还是分个组):
read,_read,_send ,
write,_write,_receive,
push,_push,_parentPush
和调用交织起来,Brain Fucker 。很多次,我有时候分析到7-8层堆栈后,发现自己在代码的森林中迷路了。几度想要放弃,查看那个http implements 清单,想要从一门比较刻板的语言重新开始。终于我知道,我需要恶补下node stream的知识。
bunyan 本意应该取自bunyan,作家,作品为<天路历程>。回到作为logger的bunyan,官方文档就很简单,我做了一个更加简单的小抄
有了这样的基础又基础的知识,阅读node-http2可以减少些许痛苦。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。