码迷,mamicode.com
首页 > 其他好文 > 详细

Jetty - Connector源码分析

时间:2018-01-27 19:10:18      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:jetty   for   dex   executors   nts   能力   bean   而且   私有   

1. 描述

基于Jetty-9.4.8.v20171121。

Connector接受远程机器的连接和数据,允许应用向远程机器发送数据。

1.2 类图

从类图看出AbstractConnector继承ContainerLifeCycle,所以具有Container和LifeCycle特性。

此外有一个ServerConnector,这个是整个Jetty中很重要的连接器,目前该连接器负责HTTP和HTTPS协议等连接。

ConnectionFactory负责为连接器创建连接对象,不同的连接(HTTP)创建不同的连接对象。

技术分享图片

1.3 API能力

主要都是一些getter方法,获取该连接器相关的信息。

@ManagedObject("Connector Interface")
public interface Connector extends LifeCycle, Container, Graceful
{
    // 与这个连接器关联的服务器
    public Server getServer();

    // 返回执行任务的执行器
    public Executor getExecutor();

    // 返回调度任务的调度器
    public Scheduler getScheduler();

    // 数据缓冲区
    public ByteBufferPool getByteBufferPool();

    // 返回与协议名称对应的ConnectionFactory对象
    public ConnectionFactory getConnectionFactory(String nextProtocol);
    

    public <T> T getConnectionFactory(Class<T> factoryType);
    
    // 返回默认ConnectionFactory对象
    public ConnectionFactory getDefaultConnectionFactory();
    // 返回所有Connection工厂
    public Collection<ConnectionFactory> getConnectionFactories();
    
    public List<String> getProtocols();
    
    // 返回最大空闲连接时间
    @ManagedAttribute("maximum time a connection can be idle before being closed (in ms)")
    public long getIdleTimeout();

    // 返回这个对象底层的socket,channel,buffer等
    public Object getTransport();
    
    /**
     * @return immutable collection of connected endpoints
     */
    // 返回连接端的不可变集合
    public Collection<EndPoint> getConnectedEndPoints();

    public String getName();
}

2. AbstractConnector

2.1 描述

AbstractConnector利用ConnectionFactory工厂机制为不同协议(HTTP,SSL等)创建Connection实例。  

AbstractConnector管理着连接器必须的几个基本服务:

(1)Executor:Executor服务用于运行该连接器所需的所有活动任务,(例如接受连接,处理HTTP请求),默认使用Server.getThreadPool作为Executor;

(2)Scheduler:调度器服务用于监视所有连接的空闲超时,并且也可用于监控连接时间,例如异步请求超时,默认使用ScheduledExecutorScheduler实例;

(3)ByteBufferPool:ByteBufferPool服务提供给所有连接,用于从池中获取和释放ByteBuffer实例。

这些服务作为bean被Container管理,可以是托管或未托管。

连接器有一个ConnectionFactory集合,每个ConnectionFactory有对应的协议名称。协议名称可以是现实的协议比如https/1.1 或http2,甚至可以是私有协议名称。比如SSL-http/1.1标示SslConnectionFactory,它是由HttpConnectionFactory实例化并且作为HttpConnectionFactory下一个协议。

ConnectionFactory集合可以通过构造函数注入,通过addConnectionFactory,removeConnectionFactory和setConnectionFactories修改。每个协议名称只能对应一个ConnectionFactory实例,如果两个ConnectionFactory对应一个协议名称,那么第二个将替换第一个。

最新ConnectionFactory通过setDefaultProtocol方法设置,或则第一次配置的协议工厂。

每个ConnectionFactory类型负责它所接受的协议配置。为了配置HTTP协议,你需要传递HttpConfiguration实例到HttpConnectionFactory(或者其他支持HTTP的ConnectionFactory);相似地,SslConnectionFactory需要SslContextFactory对象和下一个协议名称。

(1)ConnectionFactory可以简单创建Connection对象去支持特定协议。比如HttpConnectionFactory能创建HttpConnection处理http/1.1,http/1.0和http/0.9;

(2)ConnectionFactory也可以通过其他ConnectionFactory创建一系列Connection对象。比如SslConnectionFactory配置了下一个协议名称,一旦接受了请求创建了SslConnection对象。然后可以通过连接器的getConnectionFactory获取下一个ConnectionFactory,这个ConnectionFactory产生的Connection可以处理从SslConnection获取的未加密的数据。

(3)ConnectionFactory也可以创建一个临时Connection,用于在连接上交换数据,以确定下一个使用的协议。例如,ALPN(Application Layer Protocol Negotiation)协议是SSL的扩展,允许在SSL握手期间指定协议,ALPN用于HTTP2在客户端与服务器之间通信协商协议。接受一个HTTP2连接,连接器会配置SSL-ALPN, h2,http/1.1。一个新接受的连接使用“SSL-ALPN”,它指定一个带有“ALPN”的SSLConnectionFactory作为下一个协议。因此,一个SSL连接实例被链接到一个ALPN连接实例。ALPN然后与客户端协商下一个协议,可能是http2,或则http/1.1。一旦决定了下一个协议,ALPN连接调用getConnectionFactory创建连接实例,然后替换ALPN连接。

连接器在运行中并且重复调用accept(int)方法,acceptor任务运行在一个循环中,

accept方法实现必须满足如下几点:

(1)阻塞等待新连接;

(2)接受连接(比如socket accept);

(3)配置连接;

(4)调用getDefaultConnectionFactory->ConnectionFactory.newConnection去创建一个新Connection。

acceptor默认的数量是1,数量可以是CPU的个数除以8。具有更多的acceptor可以减少服务器延迟而且可以获得一个高速的连接(比如http/1.0没有keepalive)。对于现代持久连接协议(http/1.1,http/2)默认值是足够的。

 

2.2 类图

技术分享图片

 

Jetty - Connector源码分析

标签:jetty   for   dex   executors   nts   能力   bean   而且   私有   

原文地址:https://www.cnblogs.com/lujiango/p/8366553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!