3.2 Servlet容器
通俗点说,所谓容器,就是放东西的地方。Servlet容器自然就是放Servlet的地方。在Servlet开发中,我们需要按照Servlet的规范写代码,那么这样的代码就能在Servlet容器中运行。容器会按照规则加载类,并运行它。
Servlet容器的作用是负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。
Servlet容器可以嵌入宿主的Web服务器中,或者通过Web务器的本地扩展API单独作为附加组件安装。Servelt容器也可能内嵌或安装到启用Web功能的应用服务器中。
所有的Servlet容器必须支持HTTP协议以处理请求和响应,但额外的基于请求/响应的协议,如HTTPS(HTTP over SSL)的支持是可选的。对于HTTP规范需要的版本,容器必须支持HTTP/1.1和HTTP/2。
在支持HTTP/2时,Servlet容器必须支持h2和h2c协议标识符,这意味着所有Servlet容器都必须支持ALPN。因为容器可能有缓存,它可以在将它们传递给Servlet之前修改来自客户端的请求,可以在将Servlet发送到客户端之前修改响应,或者可以响应请求而不将它们传递给Servlet。
Java SE 8是与Servlet 4.0一起使用的最低Java平台版本。
3.2.1 常用Servlet容器
市面上,常见的Servlet容器有闭源的,也有开源的,包括Tomcat、Jetty、Oracle Application Server、Oracle Weblogic Server、JBoss Application Server等。其中,Tomcat、Jetty在开源界比较有名,且在市场上占有率比较高。
下面就Tomcat和Jetty的异同点进行比较。
3.2.2 Tomcat和Jetty的相同点
Tomcat和Jetty都是Servlet引擎,它们都支持标准的Servlet规范和Java EE的规范。
它们都是开源的,免费使用。
3.2.3 Tomcat和Jetty的不同点
在架构上,Jetty比Tomcat更为简单。其中:
- Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。
- Tomcat的架构是基于容器设计的,进行扩展时需要了解Tomcat的整体设计结构,不易扩展。
在性能上,Jetty和Tomcat差异不大。其中:
- Jetty可以同时处理大量连接,而且可以长时间保持连接,适合Web聊天应用等。
- Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少服务器内存开销,从而提高服务器性能。
- Jetty默认采用NIO,因此在处理I/O请求上更占优势,在处理静态资源时性能较高。
- Tomcat适合处理少数非常繁忙的连接,也就是说链接生命周期短的话,Tomcat的总体性能更高。
- Tomcat默认采用BIO处理I/O请求,在处理静态资源时性能较差。
在其他方面:
- Jetty的应用更加快速,修改简单,对新Servlet规范的支持较好。
- Tomcat目前应用比较广泛,对Java EE和Servlet的支持更加全面,很多特性会直接集成进来。
3.2.4 总结
Jetty的主要特性是易用性、可扩展性及易嵌入性。可以把Jetty理解为一个嵌入式的Web服务器,Jetty的运行速度较快,而且是轻量级的。Jetty的轻量级也使其在处理高并发细粒度请求的场景下显得更快速高效。
Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web服务器。
Tomcat支持的规范更全面,功能也更多,但也显得更加“重量级”。所以,当需要大规模企业级应用时,Jetty也许便需要扩展,在这场景下使用Tomcat会更加方便。
Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。
综上所述,轻量级Java EE技术框架很适合基于Jetty或者Tomcat来实现内嵌容器。在本书的后续章节中,还会对Jetty、Tomcat进行深入探讨。欲了解更多有关Servlet方面的内容,可以参阅笔者所著的开源电子书《Java Servlet 3.1规范》。