monkeysocks开发日志--动机

monkeysocks的目标是为开发以及测试提供一个稳定的环境。html

前几天据说公司的测试团队在鼓捣数据固化的东西,说白了就是在测试启动时构建一个临时性的数据库,操做完以后再销毁,这样的好处是不形成测试反作用,同时屏蔽环境的差别。java

可是目前公司内部SOA用的太多了,仅仅靠数据库固化明显不现实,公司的架构团队作了一个将全部remote service放到本地启动的东西,可是这样子启动开销有点难以接受。有没有更可行的方案?git

以前也有人作过一个单测的东西,能够将全部RPC调用的结果序列化成文本文件,下次调用时再序列化出来,这样其实就屏蔽了远程调用。可是Java语言层面的机制致使要把千奇八怪的对象序列化下来,原本就是不可完成的任务(有些对象自己就不是POJO,还有在getter、setter写逻辑的)。github

因而我有一个大胆的设想:其实Java的外部依赖无非是网络IO,就是TCP/UDP包嘛,那我能不能作一个工具,录制一个稳定环境的网络流量,而后固化下来,最终在调用时进行重放,岂不是一劳永逸?数据库

可是TCP/UDP毕竟是系统底层的东西,并且我想对每一个Java进程单独作重放,因此只能从Java内部机制入手了。网络

有两个方法:架构

用cglib改写全部网络IO相关的接口,改用固化调用。oracle

设置Java全局socks代理,并启动socks server,在socks server里作代理。maven

显然第二种方法更简单,有四两拨千斤的感受!ide

找到一个Java socks server,jsocks,最第一版本比较老,google code上有一个改进版,用的是ant,由于之后要集成确定要用maven,因而就作了点maven化的处理,考虑之后单独作成一个项目,如今先改了测试下可行性吧。https://github.com/code4craft/jsocks

Java里面设置全局socksProxy的方法见http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

鼓捣一下,成功启动起来,明天先对公司的项目进行试用。