tomcat源码分析

上传人:xh****66 文档编号:61935973 上传时间:2018-12-15 格式:PPT 页数:58 大小:5MB
返回 下载 相关 举报
tomcat源码分析_第1页
第1页 / 共58页
tomcat源码分析_第2页
第2页 / 共58页
tomcat源码分析_第3页
第3页 / 共58页
tomcat源码分析_第4页
第4页 / 共58页
tomcat源码分析_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《tomcat源码分析》由会员分享,可在线阅读,更多相关《tomcat源码分析(58页珍藏版)》请在金锄头文库上搜索。

1、Tomcat源码分析,如何构建一个web应用服务器,Tomcat整体架构,1,创建一个简单的Http Server,2,核心组件介绍:Connector , Container,3,其它组件介绍:Lifecycle etc,4,Tomcat用到的设计模式,5,Tomcat源码分析,Tomcat整体架构,Tomcat整体架构,1,创建一个简单的Http Server,2,核心组件介绍:Connector , Container,3,其它组件介绍:Lifecycle etc,4,Tomcat用到的设计模式,5,Tomcat源码分析,A Simple Http Server,问题:通过浏览器请求一个

2、html文件 输入:http:/127.0.0.1:8080/A.html,A Simple Http Server,A Simple Http Server,过程: HttpServer:创建一个ServerSocket用来监听http的请求。 Request:将请求封装为Request对象,Request对象对http请求进行解析,提供getUrl方法来获取客户请求的文件名称(A.html) Response:根据request中的文件路径去本地目录下读取A.html,将文件内容返回给请求的浏览器。,Http Reqeust 报文,GET /servlet/SHost: 127.0.0.1

3、:8080 Connection: keep-alive Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q

4、=0.8 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3howDateServlet HTTP/1.1,A Simple Sevlet Server,问题:通过浏览器请求一个servlet,servlet返回当前时间 输入:http:/127.0.0.1:8080/ShowDateServlet,A Simple Sevlet Server,A Simple Sevlet Server,过程: ShowDateServlet:实现javax.servlet.Servlet,重写service方法 Request:实现javax.servlet.ServletRe

5、quest Response:实现javax.servlet.ServletResponse ServletProcessor:根据请求的servlet名称,通过反射获得servlet的类,实例化后调用service方法。 StaticResourceProcessor:获取静态资源 HttpServer:创建一个ServerSocket用来监听http的请求。获得http请求创建Reqeust和Response,根据请求的路径来选择Processor进行处理。,Tomcat整体架构,1,创建一个简单的Http Server,2,核心组件介绍:Connector , Container,3,其

6、它组件介绍:Lifecycle etc,4,Tomcat用到的设计模式,5,Tomcat源码分析,Simple Connector and Container,1,Tomcat Default Connector,2,Tomcat Container,3,4,5,核心组件介绍,Tomcat StandardWrapper,Tomcat StandardContext,Simple Connector And Container,问题:抽象,模块化。 Connector:负责接收客户端的请求。 Container:处理并响应请求。,Simple Connector And Container,S

7、imple Connector And Container,过程: SimpleConnector:长驻线程。启动ServerSocke监听http请求,获得请求后创建HttpProcessor,并触发proccess方法 HttpProcessor:接受socket,并创建Request和Response,调用connector中已经注入的container,并调用其invoke方法 SimpleContainer:invoke方法被触发,根据Request的请求路径加载sevlet并触发sevlet的service方法,或者加载静态文件。返回给浏览器。 Bootstrap:启动类,创建Co

8、nnector和Container,将Container注入到Connector中,启动Connector。,Connector and Connector,Simple Connector and Container,1,Tomcat Default Connector,2,Tomcat Container,3,4,5,核心组件介绍,Tomcat StandardWrapper,Tomcat StandardContext,Tomcat Default Connector,问题:如何实现多线程处理客户请求?,Tomcat Default Connector,接口: org.apache.ca

9、talina. Connector 核心方法: getContainer setContainer(Container) createRequest createResponse Initialize,Tomcat Default Connector,Tomcat Default Connector,Tomcat Default Connector,HttpConnector:实现 org.apache.catalina. Connector 过程: HttpConnector创建多个HttpProcessor。 HttpConnector创建一个类型为Vector的属性created,目的是

10、缓存创建的HttpProcessor。 HttpConnector创建一个类型为Stack的属性processors,目的是缓存空闲的HttpProcessor。 HttpConnector接受到每个客户端请求,从processors中获取一个空闲的HttpProcessor,将请求分配给此HttpProcessor,如果没有空闲的HttpProcessor则根据最大线程数限制,来创建新的HttpProcessor或者等待出现回收的HttpProcessor。 HttpProcessor触发HttpConnector关联的Container去处理请求。完成处理后进行自身回收,重新进入HttpC

11、onnector的Stack,Simple Connector and Container,1,Tomcat Default Connector,2,Tomcat Container,3,4,5,核心组件介绍,Tomcat StandardWrapper,Tomcat StandardContext,Tomcat Container,问题:如何让Container层级化?,Tomcat Container,接口: org.apache.catalina.Container 核心方法: invoke(Request, Response) setParent(Container) getParen

12、t():Container addChild(Container) removeChild(Container) map(Request):Container,Wapper,Wapper:将一个Sevlet抽象为Wapper,Context,Context:将一个web工程抽象为Context,Host,Host:将一个Tomcat虚拟机抽象为Host,Engine,Engine:实现多个虚拟Host共享一个Connector,Tomcat Container,Simple Connector and Container,1,Tomcat Default Connector,2,Tomcat

13、Container,3,4,5,核心组件介绍,Tomcat StandardWrapper,Tomcat StandardContext,Tomcat StandardWrapper,Tomcat StandardWrapper,Tomcat StandardWrapper,问题:如何实现servlet的线程安全?,Tomcat StandardWrapper,Servlet实现javax.servlet.SingleThreadModel Servlet instance = ; if (servlet implementing SingleThreadModel) synchronized

14、 (instance) instance.service(request, response); else instance.service(request, response); ,Tomcat StandardWrapper,将servlet实例注入到instancePool对象池 private Stack instancePool ; private int maxInstances = 20; private int nInstances = 0; synchronized (instancePool) if (nInstances maxInstances) instancePoo

15、l.push(loadServlet(); nInstances+; else instancePool.wait(); ,Simple Connector and Container,1,Tomcat Default Connector,2,Tomcat Container,3,4,5,核心组件介绍,Tomcat StandardWrapper,Tomcat StandardContext,Tomcat StandardContext,Tomcat StandardContext,Tomcat整体架构,1,创建一个简单的Http Server,2,核心组件介绍:Connector , Con

16、tainer,3,其它组件介绍:Lifecycle etc,4,Tomcat用到的设计模式,5,Tomcat源码分析,Lifecycle,问题: 1.管理组件的生命周期,启动和停止Tomcat中的组件 2.获得指定组件启停的事件(例如创建一个消息发送类,当connector停止的时候,要发信息给管理者),Lifecycle,Lifecycle组成: Lifecycle:定义组件生命的接口 LifecycleEvent:封装事件数据 LifecycleListener:定义监听者的接口 LifecycleSupport:封装所有监听者 LifecycleException:异常,Lifecycle,Lifecycle: start():启动生命周期 stop():停止生命周期 addLifecycleListener(listener) removeLifecycleListener(listener) findLifecycleListeners

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号