###起因
最近公司在做一个邮件系统的项目,涉及到测试对外发送的环节。开始构思是这样:建立一个接收服务器,并将所有请求导向该服务器。这里面就涉及到一个DNS拦截的问题。这个问题其实在开发和测试环境中很常见,但是单是绑hosts或者使用传统DNS都不太能满足需要(不支持通配符)。
后来调研DNS工具也烦了,于是想自己写一个,实现简单的功能。找到一个Java的开源项目EagleDNS看了下,把UDP连接模块看了看,发现还是比较简单的。于是就构思着开发一个简单的DNS服务器吧!项目托管到了github: https://github.com/code4craft/blackhole
构想功能和研究协议花了一天时间,后来就急不可耐的开始编码了。花了一个上午,做了写死配置,一个拦截所有请求的简单服务器,发现能够work,更加坚定了信心。
下午做了一些开发,参考jetty的思路,实现了handler的结构,基本代码成型。因为不想引入Spring,写了一堆很丑的单例。
晚上回家,引入了Spring,并做了一些bugfix。
引入了一个监控模块wifesays,后来发现Java有个模块JMX就是做这个事的,长见识了!
###心得
这个项目选择相当有挑战,基本上就是自己开发一个服务器。很重要的一个心得:从零开始开发,开始尝试将需要的组件都自己简单实现,后面再引入框架级的东西,可以更好的理解J2EE世界的工具。
比如开始准备实现一个简单的GlobalFactory,做Spring做的事,只是省去繁琐的xml配置(而且印象中Spring启动实在是太慢了)。后来发现,依赖管理是相当复杂的一块,特别是初始化的时候的顺序。后来只好引入了Spring,发现Spring本身启动并不慢,而且使用annotation代替xml之后,也相当容易配置,重构起来也很方便,一改我在公司项目开发中,Spring又慢又笨重的印象。
再比如项目需要做到一个可外部管理应用的东西,当时还得意洋洋的搞了个项目叫wifesays,用的是TCP文本协议。后来才发现,Java有个模块JMX,专门就是用来干这事的。不过之前很难理解JMX,现在发现容易理解很多。