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