轻量级Java EE企业应用开发实战
上QQ阅读APP看书,第一时间看更新

3.12 Jetty服务器概述

本节将介绍另一款轻量级的Servlet容器——Jetty。Jetty具有开源、轻量级、高性能、可拔插等特点,深受互联网公司喜爱。

Jetty实现了Java EE规范的各个方面,主要是Servlet规范。最近发布的Java EE平台引入了Web Profile,虽然Jetty本身并不提供所有Web Profile技术,但Jetty架构可以插入第三方实现,以生成根据用户确切需求定制的容器。

3.12.1 高性能Servlet容器

Jetty作为一款高性能的Web容器,非常适合大量链接和高并发的场景。其中,Jetty使用NIO(非阻塞IO)模式,在某种程度上是Jetty作为高性能服务器的有力支点。

Jetty NIO组件由以下基本内容组成:

  • EndPoint:网络上进行相互通信的对端实体抽象。
  • Connection:网络实体通信链接的抽象。
  • ByteBufferPool:缓冲区对象池。
  • SelectChannelEndPoint:基于NIO模型描述的EndPoint封装。
  • SelectorManager:选择器管理器。

整个Jetty NIO组件架构是基于Reactor模型的,并采用异步处理方式来模拟Proactor模式。基于Proactor或者伪Proactor模型可以使得网络连接的处理具备极高的扩展性和响应性。

3.12.2 可拔插

Jetty通过可以插件化的方式来增强或者简化应用。Jetty官方支持以下插件:

  • Proxy Servlet
  • Balancer Servlet
  • CGI Servlet
  • Quality of Service Filter
  • Denial of Service Filter
  • Header Filter
  • Gzip Handler
  • Cross Origin Filter
  • Resource Handler
  • Debug Handler
  • Statistics Handler
  • IP Access Handler
  • Moved Context Handler
  • Shutdown Handler
  • Default Handler
  • Error Handler
  • Rewrite Handler

使用这些插件非常简单。比如,想使用Proxy Servlet插件,只需要在应用中添加如下依赖即可:

3.12.3 Jetty常用配置

Jetty常用配置总结如下:

1.httpConnector

该配置是可选配置。如果没有设置,Jetty就会创建ServerConnector实例来监听8080端口。

可以在命令行上使用系统属性jetty.http.port来修改默认的端口配置,例如:

    mvn -Djetty.http.port=9999 jetty:run

当然,也可以通过配置下面的属性来配置ServerConnector。可以配置的属性如下:

  • port:连接监听的端口,默认为8080。
  • host:监听的主机,默认监听所有主机,即所有主机都可以访问。
  • name:连接器的名称,在配置指定连接器来处理指定请求时有用。
  • idleTimeout:连接超时时间。
  • soLinger:socket连接时间。

同样,可以在一个标准的Jetty的XML配置文件中配置连接,并把配置文件的路径赋值给jettyXml参数。

2.jettyXml

该配置是可选配置。通常,可以把以逗号分隔的Jetty XML配置文件的地址字符串增加到任何插件的配置参数中。如果有另一个Web应用、处理器,特别是连接器,就可以使用它,但是若有另一个Jetty对象,则不能通过插件得到配置信息。

3.scanIntervalSeconds

自动扫描文件改变并进行热部署的时间间隔,单位为秒。默认值为0,这代表着禁用扫描并热部署,只有一个大于0的配置可以使它生效。

4.reload

重新加载选项,默认值是automatic(自动),一般用来和配置不为0的scanIntervalSeconds一同使用。默认配置下,当发现有文件改变会自动进行热部署。如果设置为manual(手动),部署就会通过插件被手动触发,这在频繁改动文件时比较有用,这样会忽略你的改动,直到做完所有改变。

5.dumpOnStart

可选择的配置,默认为false,如果设置为true,那么Jetty会在启动时打印出server的结构。

6.loginServices

可选择的配置,是一系列org.eclipse.jetty.security.LoginService的实现类。注意,没有指定默认的域,如果需要在web.xml中配置域,就可以配置一个统一的域。当然,也可以在Jetty的XML里面进行配置,并把配置文件的地址增加到jettyXml中。

7.requestLog

可选择的配置,一个实现了org.eclipse.jetty.server.RequestLog接口的请求日志记录。有3种方式配置请求日志:

  • 配置在Jetty XML配置文件的jettyXml中。
  • 配置在Context XML配置文件的contextXml中。
  • 配置在webAPP元素中。

8.server

可选择配置,可以配置org.eclipse.jetty.server.Server实例用来支持插件的使用,然而通常是不需要配置的,因为插件会自动为你配置。特别是在使用jettyXml的时候通常不愿意使用这个元素。

9.stopPort

可选择配置,一个用来监听停止命令的端口。

10.stopKey

可选择的配置,和stopPort结合使用。

11.systemProperties

可选择的配置,允许你为了执行插件而配置系统参数。

12.systemPropertiesFile

可选择的配置,一个包含执行插件系统参数的文件。默认情况下,在文件中设置的参数不会覆盖在命令行中写的参数,无论通过JVM还是通过POM的systemProperties。

13.skip

默认为false。如果为true的话,插件的执行就会退出。该配置等同于使用命令-Djetty.skip进行设置。这在测试中,可以通过配置取消执行时非常有用。

14.jetty.xml

设置org.eclipse.jetty.server.Server实例的各种属性。以下是配置示例:

当然,针对org.eclipse.jetty.server.HttpConfiguration元素,我们也可以使用一个子XML文件来配置它。

15.jetty-ssl.xml

为HTTPS连接配置SSL。下面的jetty-ssl.xml例子来自jetty-distribution: