您的位置:首页 > 运维架构 > Tomcat

【Tomcat】学习笔记:tomcat容器基本实现原理

2012-10-21 13:46 405 查看
推荐大家阅读 how tomcat works,这本书对tomcat原理做了详细的讲解

index
一个servlet容器是一个复杂的系统,但是实现一个请求,servlet容器需要做最基本的三件事:
1.构建一个带有参数,请求头,cookie,url等信息的请求对象
这个对象可以是javax.servlet.ServletRequest interface or the javax.servlet.http.ServletRequest interface 的实例

2.构建一个响应对象返回给客户端,这个响应对象可以是
javax.servlet.ServletResponse interface or the javax.servlet.http.ServletResponse interface 的实例

3.servlet调用服务方法传递请求及响应对象

总体来看,tomcat的Catalina servlet 容器包含两个部分
connector 和container

[align=left]简单的说,connector构建request和response对象传给container[/align]
[align=left]container调用servlet服务[/align]

[align=left]A Simple Web Server [/align]

[align=left]index[/align]
[align=left]客户端与服务端直接的通信,是通过HTTP协议进行通信的[/align]
[align=left]客户端发送HTTP request请求[/align]
[align=left]服务端返回HTTP response响应[/align]

[align=left]这个请求响应遵循HTTP协议的格式,都大致包含三个部分[/align]

[align=left]HTTP请求:[/align]
Method—Uniform Resource Identifier (URI)—Protocol/Version
· Request headers
[align=left]· Entity body [/align]

[align=left]HTTP响应:[/align]

Protocol—Status code—Description
· Response headers
[align=left]· Entity body [/align]

[align=left]HTTP通信,也是基于TCP连接的通信[/align]
[align=left]这个TCP的连接的构建需要socket的协助[/align]
[align=left]通过构建的TCP socket连接,对HTTP请求及响应进行解析[/align]
[align=left]然后进行数据的传输[/align]

[align=left]Connector [/align]

[align=left]构建一个稍复杂的web服务器[/align]
[align=left]1.bootstart程序,用以启动主程序[/align]
[align=left]2.connector。主要是构建TCP socket连接,进行侦听连接[/align]
[align=left] 对于每个HTTP请求进行处理,构建HttpProcessor实例进行处理[/align]
[align=left] HttpProcessor对HttpRequest进行处理,包括分析请求行,请求头,具体的cookie,uri,参数等均在此进行解析处理[/align]
[align=left] 构建HttpRequest和HttpResponse实例[/align]
[align=left]3.核心部件。[/align]
[align=left] 构建classloader加载servlet[/align]
[align=left] servlet业务处理代码[/align]

[align=left]tomcat 的default connector 里会维护一个HttpProcessor的线程池,以减少创建删除对象的开销[/align]
[align=left]同时以char序列的操作来替换string操作,来减少string操作的高昂开销[/align]

Servlet Container



[align=left]构建一个servlet的容器,需要构建一个servlet的处理类[/align]
[align=left]他的主要功能为:[/align]
[align=left]1.构建容器所需要的classloader,用来加载所需的servlet[/align]
[align=left]2.通过加载的servlet类,创建该servlet的实例,并调用其service方法[/align]

[align=left]container有4种:engine,host,context,wrapper[/align]
[align=left]engine代表了整个servlet engine [/align]
[align=left]host代表一个虚拟host,里面有大量的context[/align]
[align=left]context代表了一个web应用程序,包含一个或多个wrapper[/align]
[align=left]wrapper代表了一个独立的servlet[/align]

[align=left]container里运用了一种新的的运行机制pipeline Tasks[/align]
[align=left]一个pipeline包含了container会调用的task[/align]

[align=left]pipeline task 概念里包含有4个概念:Pipeline,Value,ValueContext,contained[/align]
[align=left]一个value代表一个特定的task[/align]

[align=left]container调用invoke方法的时候就会把处理交给pipeline,然后pipeline会依次调用每个Value[/align]
[align=left]pipeline其实跟filter chain相似,每个value就如同filter一样[/align]

[align=left]application[/align]
[align=left]执行过程分析:[/align]
[align=left]在只有一个简单的servlet下,即只对一个请求进行处理的简单程序下[/align]
[align=left]这个container的部件包含这些:[/align]

[align=left]一个 wrapper 代表一个处理请求的 container[/align]
[align=left]wrapper 设置其需要加载 servlet 的类名和 进行加载操作的 loader[/align]
[align=left]wrapper 添加需要进行操作的 value ,如日志打印value[/align]
[align=left]wrapper 里的基本value 即对请求进行处理的 servlet[/align]

[align=left]wrapper 里的处理过程通过 pipeline 进行处理[/align]
[align=left]整个调用过程 是调用 value 进行处理的过程[/align]

[align=left]最终这个处理请求的 wrapper 作为 container 设置给 connector [/align]

[align=left]在web应用程序中,通常需要处理多种请求[/align]
[align=left]因此就需要有一个 context 里面包含多个 处理不同请求的 wrapper了[/align]
[align=left]另外有可能需要对不同的 传输协议进行处理,如http和https,则就可能需要多个 mapper[/align]
[align=left]由其选择合适的 wrapper 进行处理[/align]

[align=left]这种情况下,作为container 设置给 connector 的就是 context了[/align]
[align=left]而多个wrapper 则作为context的 child container [/align]

[align=left]http请求的处理大致流程:[/align]
[align=left]connector 会调用context的invoke方法,当请求过来的时候[/align]

[align=left]1 context里含有pipeline ,pipeline会调用其invoke方法[/align]
[align=left]2 pipeline 的invoke方法会调用所有 value ,这些value是添加到context里的[/align]
[align=left] 最后会调用 basic value[/align]
[align=left]3 在一个wrapper里,basic value 代表着装载这个相关处理类的servlet[/align]
[align=left]4 context里会有多个child container,basic value 会使用mapper 来找到处理相关请求的child container[/align]
[align=left] 如果找到则会调用这个child container的invoke方法,最后会返回第一步[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: