Jetty(一):配置与核心组件

和Tomcat一样,Jetty同样是一个用Java编写的web容器,相对于Tomcat它更加轻量级

  • 从架构上来说,Jetty将功能作为一个个处理组件(即Handler),以插拔的形式集成,整体上高内聚低耦合,扩展性非常好;而Tomcat面向容器,相比之下过于集中,虽然提供的功能非常丰富,但理解及扩展起来并不容易。
  • 除了采用面向Handler的组件设计外,此外与Tomcat的BIO不同,Jetty使用NIO的方式来进一步提高效率,此外还支持异步Servlet、提供了客户端等等。
  • 由于构架的不同,所以使用上Jetty也更加轻便灵活(相比之下Tomcat就很笨重),比如可以很简单的嵌入到应用中。
  • 目前关于Tomcat和Jetty性能方面并没有一个官方的全面测试报告,但由于NIO的特性,Jetty更适应于长连接较多的场景(扩:NIO的两次system call),或者用来部署静态应用,而对于短连接较多的情况下,理论上应该是Tomcat处理效率较高(一次调用)。

配置
启动配置
  
这里启动配置可以分为两类,一个是指Jetty服务器启动配置,位于{home}/start.ini,对该文件的修改在未被覆盖的情况下,影响所有应用,其中--module表示加载给定模块,每个模块都对应一个{home}\modules目录下的*.mod文件。
注:这里的home目录指是的Jetty的安装目录,通过--list-config参数可以查看

E:\jetty-distribution-9.2.24.v20180105\demo-base>java -jar ../start.jar --list-config

Java Environment:
-----------------
 java.home = E:\jdk1.8.0_131\jre
 ...
 user.country = CN

Jetty Environment:
-----------------
 jetty.version = 9.2.24.v20180105
 jetty.home = E:\jetty-distribution-9.2.24.v20180105
 jetty.base = E:\jetty-distribution-9.2.24.v20180105\demo-base
......

  另一个是指应用的启动配置,一般会在该配置中来配置应用启动的特定配置,比如指定加载模板、指定新的端口等。这里以Jetty启动配置为例

# Module: server
--module=server

## Server Threading Configuration
threads.min=10
...
# --------------------------------------- 
# Module: jsp
--module=jsp
...
# --------------------------------------- 
# Module: http
--module=http
### HTTP Connector Configuration

## HTTP port to listen on
jetty.port=8080

## HTTP idle timeout in milliseconds
http.timeout=30000

## HTTP Socket.soLingerTime in seconds. (-1 to disable)
# http.soLingerTime=-1

## Parameters to control the number and priority of acceptors and selectors
# http.selectors=1
# http.acceptors=1
# http.selectorPriorityDelta=0
# http.acceptorPriorityDelta=0

Mod配置
    
Jetty中mod配置文件位于home\modules目录下,这里以http.mod为例:
[depend]:表示当前模块依赖的其它模块
[xml]:表示当前模块对应的POJO配置文件(也就是pojo的xml形式,Jetty根据该文件来实例化对象)
[ini-template]:当前模块的初始化信息

#
# Jetty HTTP Connector
#

[depend]
server

[xml]
etc/jetty-http.xml

[ini-template]
### HTTP Connector Configuration

## HTTP port to listen on
jetty.port=8080

## HTTP idle timeout in milliseconds
http.timeout=30000

## HTTP Socket.soLingerTime in seconds. (-1 to disable)
# http.soLingerTime=-1

## Parameters to control the number and priority of acceptors and selectors
# http.selectors=1
# http.acceptors=1
# http.selectorPriorityDelta=0
# http.acceptorPriorityDelta=0

POJO配置
  pojo配置文件是Java对象的xml表现形式,Jetty根据pojo配置来创建并实例化一些核心组件对象(也是Jetty中IOC容器的实现原理),所以pojo配置也是Jetty组件的核心配置。pojo位于home/etc目录下,同样以上面etc/jetty-http.xml为例:
[Configure]:表示需要配置的对象。有ID的情况下将该对象以ID值为key放到当前上下文中,如果当前上下文已存在该对象,则取出并执行配置操作。
[Call]:表示调用方法。
[Arg]:代表参数
[Ref]:从上下文中取出对象
[New]:创建一个对象,有ID的情况下同样存储到当前上下文中
[Array]:声明一个列表
[Item]:代表一个列表元素
[Set]:设置属性






  
    
      
        
        
        
        
          
            
              
                
              
            
          
        
        
        
        
        
        
        
        
      
    
  

以上配置就相当于代码:
Server server = new Server();
context.put("Server",server);
List list = new ArrayList<>();
list.add(new HttpConnectionFactory(httpConfig);  // httpConfig定义在依赖模块server的pojo配置文件中
ServerConnector sc = new ServerConnector(server,http.acceptors,http.seletcors,list);
sc.setHost("xxx");  
...
server.addConnector(sc);

核心组件
  作为一个Web容器,处理Http请求是最基本的功能,针对Http的处理Jetty最核心的组件主要有几个:Server、Connector、ThreadPool、HttpConnection、Handler

  • Server:Jetty服务器中的中央协调对象,为所有其他组件提供服务和生命周期管理,对应的pojo文件为etc/jetty.xml,定义了诸如线程池、处理器、httpConfig等对象及其它一系列配置。
  • Connector:连接器,用于处理客户端发起的连接,针对不同连接分发给不同的连接解析程序,比如针对http协议则生成HttpConnection,并交由其去处理。在Jetty9之前针对不同的协议提供了不同的连接处理器,而在Jetty9之后只提供了统一的基于NIO的ServerConnector连接器,但可以使用连接工厂来处理一个或多个协议。连接器提供了诸名主机、端口、空闲超时、待处理连接积压的大小等配置。
  • HttpConnection:用来解析http协议,提供Request及Response对象,一般由Connector创建。
  • Handler:处理器,用来处理请求及响应数据,和Servler中的service类似,它对应一个Handler接口,其中定义了public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)。

Jetty启动流程简介
  从server.mod对应pojo配置文件etc/jetty.xml,及http.mod对应的jetty-http.xml其实已经可以看出大概的启动流程







    
      
      
      
      false
    

    
    
    
    
      
        
      
    

  
    
      https
      
      
      
      
      
      
      
      512
      
      
    

   
    
      
        
         
           
             
           
           
             
           
         
        
      
    

   
    true
    5000
    
    


首先创建一个Server对象(并存储到上下文中),接下来创建并为Server注入一个ThreadPool对象,一个ServerConnector对象,及相关Handler对象等等,最终组成一个完整的Server对象。

Jetty请求流程简介
  Connector接收到请求后,先从ThreadPool中取出线程交由其处理,并创建一个HttpConnection,由其解析http协议,最终将请求包装成Handler需要的Request和Response,最后再通过Server 调用相应Handler程序处理。
 

你可能感兴趣的:(Jetty(一):配置与核心组件)