前言:

       什么是monkey ? 英语里面试猴子,但程序里面我们称之为 补丁.  用过python gevent的朋友应该很熟悉这个monkey补丁字眼吧。 对的,这里golang的monkey实现的功能跟gevent monkey是一样的,都是为了粗暴直接的替换标准库。

该文章后续仍在不断更新中, 请移步到原文地址  http://xiaorui.cc/?p=5128


       我这里的场景很简单,就是想替换一些第三方库的json模块,像logrus就提供了优雅的jsonFormat接口,但其他的第三方库就没这么方便了,多少有些费劲的。 如果想批量替换标准库的一些方法,不外乎几种方法,一种是直接修改vendor源代码。,另一种是通过reflect和unsafe来实现monkey的逻辑。 这里离用的是bouk写的monkey库,github地址在这里  https://github.com/bouk/monkey


下面是我写的go monkey测试代码,  代码逻辑很简单,就是尝试用滴滴陶文的json-iterator替换encoding/json库。  这里多说一嘴,json-iterator在序列化struct的时候性能要比encoding/json高, map他俩半斤八两的。 json-iterator内部大量的使用sync.pool,一定程度上减少了对象的malloc创建。 还使用了缓存reflect技术,避免每次都去valueOf, typeOf …   


下面是monkey patch的实现的主要逻辑.


总结:

    monkey相关的逻辑放在main方法里就可以了,整个runtime时期只需要替换一次就ok了。golang monkey的方法虽然可以替换标准库和第三方库,但不管怎么说,还是显得有些粗暴了。还有就是 打入monkey后,pprof 和trace 显得有些异常,但业务没有影响。

   最后说一点,大家可能因为性能问题更换第三方库的时候,请一定要做好go test benchmark,压力测试的逻辑尽量贴合自己的业务。先前我们就因为golang nuts或者是社区的推荐,直接更换的库,但事实说明这不是很靠谱。 通过一次次的pprof分析,一次次的打脸。


END.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品

评论已关闭。