作为专栏最后一个模块的答疑文章,我想是时候总结一下 Tomcat 和 Jetty 的区别了。专栏里也有同学给我留言,询问有关 Tomcat 和 Jetty 在系统选型时需要考虑的地方,今天我也会通过一个实战案例来比较一下 Tomcat 和 Jetty 在实际场景下的表现,帮你在做选型时有更深的理解。
我先来概括一下 Tomcat 和 Jetty 两者最大的区别。大体来说,Tomcat 的核心竞争力是成熟稳定,因为它经过了多年的市场考验,应用也相当广泛,对于比较复杂的企业级应用支持得更加全面。也因为如此,Tomcat 在整体结构上比 Jetty 更加复杂,功能扩展方面可能不如 Jetty 那么方便。
而 Jetty 比较年轻,设计上更加简洁小巧,配置也比较简单,功能也支持方便地扩展和裁剪,比如我们可以把 Jetty 的 SessionHandler 去掉,以节省内存资源,因此 Jetty 还可以运行在小型的嵌入式设备中,比如手机和机顶盒。当然,我们也可以自己开发一个 Handler,加入 Handler 链中用来扩展 Jetty 的功能。值得一提的是,Hadoop 和 Solr 都嵌入了 Jetty 作为 Web 服务器。
从设计的角度来看,Tomcat 的架构基于一种多级容器的模式,这些容器组件具有父子关系,所有组件依附于这个骨架,而且这个骨架是不变的,我们在扩展 Tomcat 的功能时也需要基于这个骨架,因此 Tomcat 在设计上相对来说比较复杂。当然 Tomcat 也提供了较好的扩展机制,比如我们可以自定义一个 Valve,但相对来说学习成本还是比较大的。而 Jetty 采用 Handler 责任链模式。由于 Handler 之间的关系比较松散,Jetty 提供 HandlerCollection 可以帮助开发者方便地构建一个 Handler 链,同时也提供了 ScopeHandler 帮助开发者控制 Handler 链的访问顺序。关于这部分内容,你可以回忆一下专栏里讲的回溯方式的责任链模式。