Tomcat核心源码阅读笔记总结备课讲稿_第1页
Tomcat核心源码阅读笔记总结备课讲稿_第2页
Tomcat核心源码阅读笔记总结备课讲稿_第3页
Tomcat核心源码阅读笔记总结备课讲稿_第4页
Tomcat核心源码阅读笔记总结备课讲稿_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。Tomcat核心源码阅读笔记总结Tomcat6核心源码阅读笔记2012-8-15Calvin.chen此次源码阅读基于tomcat6,官方svn地址:/repos/asf/tomcat/tc6.0.x/trunkTOCo1-3hzuHYPERLINKl_Toc332964929Tomcat6核心源码阅读笔记PAGEREF_Toc332964929h1HYPERLINKl_Toc3329649301、tomcat6整体结构PAGEREF_Toc332964930h2HYPERLINKl_Toc332964

2、9312、tomcat6主要组件PAGEREF_Toc332964931h2HYPERLINKl_Toc3329649322.1ServerPAGEREF_Toc332964932h2HYPERLINKl_Toc3329649332.2ServicPAGEREF_Toc332964933h2HYPERLINKl_Toc3329649342.3ConnectorPAGEREF_Toc332964934h3HYPERLINKl_Toc3329649352.4ContainerPAGEREF_Toc332964935h3HYPERLINKl_Toc3329649363、tomcat6核心类结构分析P

3、AGEREF_Toc332964936h6HYPERLINKl_Toc3329649373.1核心类结构图PAGEREF_Toc332964937h6HYPERLINKl_Toc3329649383.2tomcat启动过程主线图PAGEREF_Toc332964938h7HYPERLINKl_Toc3329649393.3请求处理类结构图PAGEREF_Toc332964939h8HYPERLINKl_Toc3329649403.4Container类结构图PAGEREF_Toc332964940h9HYPERLINKl_Toc3329649413.5Valve类结构图PAGEREF_Toc3

4、32964941h10HYPERLINKl_Toc3329649423.6Pipeline和valvePAGEREF_Toc332964942h11HYPERLINKl_Toc3329649434、tomcat6如何实现多线程处理PAGEREF_Toc332964943h12HYPERLINKl_Toc3329649444.1多线程处理简图PAGEREF_Toc332964944h12HYPERLINKl_Toc3329649454.2多线程处理详图PAGEREF_Toc332964945h13HYPERLINKl_Toc3329649464.3多线程处理过程中几个比较重要的方法PAGEREF

5、_Toc332964946h14HYPERLINKl_Toc3329649474.4多线程小结PAGEREF_Toc332964947h16HYPERLINKl_Toc3329649485、tomcat6处理一次请求的完整过程PAGEREF_Toc332964948h18HYPERLINKl_Toc3329649496、Tomcat6中的设计模式PAGEREF_Toc332964949h19HYPERLINKl_Toc3329649506.1链式设计PAGEREF_Toc332964950h19HYPERLINKl_Toc3329649516.2观察者模式PAGEREF_Toc33296495

6、1h19tomcat6整体结构2、tomcat6主要组件2.1ServerTomcatserver实例,需提供接口让其它程序能够访问到其中Service集合,同时要维护它所包含的所有Service的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的Service。2.2ServicService只是在Connector和Container外面多包一层,把它们组合在一起,向外面提供服务,同时通过lifecycle接口管理下属组件(Connector和Engine)的生命周期。一个Service可以设置多个Connector,但是只能有一个Container(可以是Engine、Host

7、或者Context、Wrapper)。2.3ConnectorConnector组件是Tomcat两个核心组件之一,它的主要任务是负责接收浏览器的发过来的tcp连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事了。2.4ContainerContainer是容器的父接口,所有子容器都必须实现这个接口,Container还有一个抽象实现类ContainerBase,Engine、Host、Context、Wrapp

8、er的默认实现都继承了这个类。Container容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。通常一个Servletclass对应一个Wrapper,如果有多个Servlet就可以定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container了,如Context。Context还可以定义在父容器Host中,Host不是必须的,但是要运行war程序,就必须要Host,因为war中必有w

9、eb.xml文件,这个文件的解析就需要Host。如果要有多个Host就要定义一个top容器Engine。而Engine没有父容器了,一个Engine代表一个完整的Servlet引擎。总之保证一个Service只有一个topcontainer(这个topcontainer里面可以有多个子container)。2.4.1Engine比较简单的一个容器,主要分负责管理子容器的周期。2.4.2HostHost是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是Context

10、,它除了关联子容器外,还有就是保存一个主机应该有的信息。关于Host中name属性和Engine中defaultHost的作用:如果有个host的name=localhost,那么Tomcat会将此host设置为默认访问的Host。即:如果出现下图中的情况,则client最终会去访问name=localhost的host,而不是defaultHost值定义的host(即不会去访问02)Tomcat产生的server实例ServiceConnectorsHost_BName=02EnginedefaultHost=02Host_AName=01Client访问03由于没有103对应的host,所

11、以就会访问EnginedefaultHost属性值,即:022.4.3ContextContext代表Servlet的Context,它具备了Servlet运行的基本环境,理论上只要有Context就能运行Servlet了。简单的Tomcat可以没有Engine和Host。Context最重要的功能就是管理它里面的Servlet实例,Servlet实例在Context中是以Wrapper出现的。Context如何才能找到正确的Servlet并执行它:在请求处理过程中,会调用CoyoteAdapter.postParseRequest()方法封装request,其中就包含这样一行代码:conne

12、ctor.getMapper().map(serverName,decodedURI,request.getMappingData();这行代码会封装request中MappingDatas属性的值,而MappingDatas中就包含的host、context、wrapper及其path的信息。(在connector的mapper对象中已经记录了该connector对应的engine中的所有host,在mapper.map()方法中会通过解析request的url字符串,逐步得到host、context、wrapper)。封装完MappingDatas之后,就会调用下面这行代码,绑定reque

13、st和Wrapper对象:request.setWrapper(Wrapper)request.getMappingData().wrapper);最后在StandardWrappValve.invoke()方法中调用StandardWrappValve所属Container(即:Wrapper)的allocate(),即调用Wrapper.allocate()得到对应的servlet对象。2.4.4WrapperWrapper代表一个Servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,它没有子容器了,所以调用它的a

14、ddChild将会报错。Wrapper的实现类是StandardWrapper,StandardWrapper实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWrapper将直接和Servlet的各种信息打交道。StandardWrapperFacade:Wrapper的一个重要属性,对Wrapper做了一次封装,和Wrapper一样实现了ServletConfig。Wrapper中的重要方法:loadServlet(),该方法包含对servlet的基本操作,包括调用init()和service()方法。3、tomcat6核心类结构分析3.1核心类结

15、构图3.2tomcat启动过程主线图Tomcat中,几乎所有组件都实现了Lifecycle接口,父组件并通过Lifecycle接口管理子组件的生周期。从下图可以看出,在Engine、Host、Context和Wrapper四个组件才是Tomcat中真正的容器(实现了Container接口),而Server和Service只是在它们上做的一层封装而已。3.3请求处理类结构图3.4Container类结构图3.5Valve类结构图3.6Pipeline和valve4、tomcat6如何实现多线程处理4.1多线程处理简图4.2多线程处理详图tomcat6提供了两种方式来处理多线程:tomcat6自己

16、写代码维护多线程处理(上图分析采用的方式)tomcat6也提供了通过executor处理多线程的方式从代码上看:第2种是完全将线程调度交给executor来做,会简单很多。从学习和可维护性来说:第1种给我展示一个很好的处理多线程场景的学习案例,而且根据一些网上测试结果看,两种方式性能相差不大,默认情况下tomcat6也不使用executor。4.3多线程处理过程中几个比较重要的方法4.4多线程小结对Tomcat多线程处理机制可以简单的概括为:两个线程池+线程切换调度+线程开关+线程回收。对于开发人员来说,可以通过配置文件(server.xml)来进行调优,使服务器效率达到最佳。但参数并不是越大

17、越好,过大反而会导致线程阻塞,甚至内存溢出,因为每个请求对于服务器来说都一个单独的线程,大量的请求就导致线程并发,而线程并发对于服务器来说要靠CPU来进行大量线程切换调度或新增,而每次线程切换或新增JVM要去保存当前线程内容、申请内存、初始化内存等非常消耗CPU、内存和时间操作,导致服务器效率降低,所以还是的根据服务器的实际硬件配置进行调优。我想这也是为什么tomcat会对线程进行回收的原因。(如果XmsJVM堆初始化大小设置的比较小时,大并发导致使用内存超过该值(但没有达到XmxJVM堆最大内存值),这时JVM就需要频繁的向操作系统申请内存来扩大堆容量,而JVM向操作系统负申请内存空间将会非

18、常耗CPU和内存,这也是为什么在大并发应用中会把Xms和Xmx设置成一样或相近,但如果堆内存达到Xmx值,那么JVM就会进行垃圾回收,来获得内存空间。另外需要注意的是,虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度,调整堆大小的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。堆越大,垃圾回收扫描的内存空间就越大,cpu和内存消耗也就越大,如果系统花费很多的时间收集垃圾,可以减小堆大小。从网上一些资料来看:完全一次垃圾收集应该不超过3-5秒,一般说来使用物理内存的80%作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。)有一种情况需要注意:当tomcat线程数增大,但没有超过最大线程数时,平均响应时间会增大,但这不意味着tomcat在线程增多时响应速度变慢可能是由于线程数增多,在请求时需要排队,导致一部分请求会一直排队,随着线程数的增多,排队等待的最大时间也会越来越大,而这些大数据才是导致平均响应时间变大的原因下面是几个配置项的说明:Server.xml中的几个配置项说明.maxThreadsTomcat处理请求的最大线程数,也决定了tomcat的最大并发数,默认为200个。如果connector使用了executor执行处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论