这节我们来看看Spiderman中的Fetcher模块的设计和实现。
从这个模块开始就可以很明显的体现出Spiderman本身的微内核+插件化的总体设计思想,纵观Spiderman的源码设计,我们可以总结出,所谓的微内核,其本质上就是抽象出业务系统中不变的东西,例如:通用的配置,通用的业务框架,另外就是从变得东西中总结出不变的,再将这些东西转换成面向对象设计的类,用设计模式加以组织,就可以作为一个系统中底层和框架性的东西,从而使之具有高度的可扩展性和生命力,对于一个普通的工程师来讲,要能很好的具备这方面的能力,必须要经过反复的实践,总结,再实践,在这个螺旋式上升的过程中始终坚守设计模式的七大基本原则(哪七大原则?大家都回想一下,呵呵),只有这样,才能由量变到质变,最终才能在通往卓越的架构师之路上更进一步,有点跑题了,言归正传,下面我们就具体来看看Fetcher模块是如何做到微内核+插件化的。
在Spiderman的core包的fetcher包中,可以看到关于Fetcher的类并不多也不复杂,总共就这几个类FetchRequest,FetchResult,Page,PageFetcher,SpiderConfig,Status。不多不少刚刚好,这些类基本覆盖了Fetcher模块所有的共性和不变的东西,例如:FetchRequest定义了fetcher的输入,FetchResult定义了输出,Page保存了下载下来的页面,由于一个页面有很多自身的属性,因此把页面单独作为一个类是合理的,PageFetcher则定义了所有具体的Fetcher类要遵守的接口,SpiderConfig则包含了下载页面时会用到的一些基本参数设置,而且这些参数基本上都是可以在每个Site的配置文件可配的。另外在core包的plugin包中提供了FetchPoint接口,由于这些类的定义都比较通俗易懂,在这里不在累述。
可以看出没有具体的负责fetch的类,而在plugin包的util包中,提供了各式各样的fetche实现类,他们分别基于不同的开源包,有:基于htmlunit的HtmlUnitDownloader,基于httpclient的HttpClientDownloade