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

本文是关于Tomcat的学习笔记,主要探讨Tomcat作为Servlet容器的基本工作原理,包括URI处理、请求头、协议状态码以及响应头等关键环节。
摘要由CSDN通过智能技术生成
推荐大家阅读 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

简单的说,connector构建request和response对象传给container
container调用servlet服务


A Simple Web Server 

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

这个请求响应遵循HTTP协议的格式,都大致包含三个部分

HTTP请求:

Method—Uniform Resource Identifier (URI)—Protocol/Version

· Request headers

·  Entity body 

HTTP响应:

Protocol—Status code—Description

· Response headers

·  Entity body 


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


Connector 

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

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



Servlet Container

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

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

container里运用了一种新的的运行机制pipeline Tasks
一个pipeline包含了container会调用的task

pipeline task 概念里包含有4个概念:Pipeline,Value,ValueContext,contained
一个value代表一个特定的task

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



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

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

wrapper 里的处理过程通过 pipeline 进行处理
整个调用过程 是调用 value 进行处理的过程

最终这个处理请求的 wrapper 作为 container 设置给 connector 


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

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

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

1 context里含有pipeline ,pipeline会调用其invoke方法
2 pipeline 的invoke方法会调用所有 value ,这些value是添加到context里的
     最后会调用 basic value
3 在一个wrapper里,basic value 代表着装载这个相关处理类的servlet
4 context里会有多个child container,basic value 会使用mapper 来找到处理相关请求的child container
     如果找到则会调用这个child container的invoke方法,最后会返回第一步



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值