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 类图