Jetty9源码剖析 - 总体架构

转载自ph0ly:http://www.ph0ly.com

一、概述

Jetty作为高性能Web服务器,它的架构相比于Tomcat要简单很多,组件抽象更简洁,接下来我们就来看下

二、架构

Jetty总体架构图

上图中,绿色部分是Jetty开放给开发者使用的;浅橙色表示JDK或Servlet规范定义的(或开发者实现的),不属于Jetty自身实现;蓝色部分表示Jetty内部实现的一些组件,不对外暴露

上图基本展示了数据交互的整体流向,我们下面从组件的生命周期来分析这些操作的交互

1. 启动

我们首先看下Jetty官方给我们的例子

ExampleServer

开发者首先创建一个Server,然后创建ServerConnector作为通信层,并关联到Server,再创建ServletContextHandler作为Handler来处理业务,可以看到这里加了2个Servlet,然后把这2个Servlet放到一个集合传给Server,最后调用Server.start启动服务器

可以看到所有的组件最终都被关联到了Server,其实Server就是一个大容器,将容器内的所有具有生命周期的组件全部逐层启动(start),另一些不具有生命周期的组件仍然可以把Server看成一个IOC容器,后续可以直接获取到实例对象

从架构图中可以看到Server触发Connector、Handler组件启动,而Connector又会触发SelectorManager、ManagedSelector启动,这样其实是逐级启动,Server是一个大容器,而Handler也可能是一个大容器(例如WebAppContext,感兴趣的读者可以跳到后续文章),这个启动过程其实是LifeCycle组件定义的,如果这里不明白,可以看下后续LifeCycle的文章

2. 连接

当client与Jetty服务器建立连接时,连接会直接打到SelectorManager提供的ServerSocketChannel,accept后,拿到这个client对应的SocketChannel后,会选择一个ManagedSelector来执行IO事件检测,并创建好这条连接对应的EndPoint以及Connection

3. 请求

当client向刚才建立的连接中写入请求数据时,ManagedSelector对应的事件检测循环(感兴趣的读者可以跳到后续Connector组件阅读)会探测到读事件,会触发SelectChannelEndPoint触发读回调,从而调用到HttpConnection.onFillable,onFillable里面借助于ByteBufferPool、HttpParser完成数据读取及解析,将解析后的元数据放入Request,直接触发HttpChannel.handle,这会打到Server.handle方法,Server会找到之前关联到自身的Handler,执行这个Handler的handle方法,这样就开启了Handler执行链(感兴趣的读者可以提前跳到Handler组件阅读),层层调用,最后调用到应用层Filter、Servlet,完成业务操作

4. 响应

当应用层完成业务操作后,调用Response.getWriter或Response.getOutputStream,最终会调用到HttpOutput.write方法,触发数据回写,这时调用到HttpChannel.write,这里会触发HttpConnection.send,而HttpConnection会利用HttpGenerator生成响应报文,然后触发SelectChannelEndPoint向SocketChannel刷数据,这样就完成了响应(当然真实的细节还有很多,例如一次刷不完,下一次哪里刷?感兴趣的读者可以跳到后续Connection阅读)

猜你喜欢

转载自blog.csdn.net/qq_41084324/article/details/83343130
今日推荐