Tomcat
结构:
Tomcat最顶层容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务,Service主要包含:Connector和Container,前者处理链接并提供Socket与request和response的转换,Container用于封装和管理Servlet,以及具体处理request请求。
一个Tomcat里一个Server,包含多个Service,一个Service只有一个Container,可以有多个Connector。一个Container只有一个Engine,Engine里面可以有多个Host,每个Host(虚拟主机,站点)下可以有多个Context(代表一个应用),每个Context下可以有过个Wrapper(每个封装一个Servlet)。
Tomcat里的server由Catalina来管理,他是Tomcat的管理类,load(调server的init),start(调server的start,下同),stop三个方法管理服务器生命周期。
启动:
正常情况启动Tomcat就是调用Bootstrap的main方法,main,新建bootstrap,执行init初始化,并调用start。init里初始化classloader,由此创建Catalina实例,赋给catalinaDaemon变量。
bootstrap的start调用setAwait(true),load(args),start()三个方法,这三个方法又都调用Catalina的相应方法进行具体执行。在Catalina中,setAwait用于设置await属性的值,服务器启动之后据此判断是否进入启动状态,其load方法根据cong/server.xml创建了Server对象,并赋值给server属性,然后调用Server的init方法。其start方法主要调用了server的start方法去启动服务器。
Server接口中提供addService和removeService,server的init方法和start方法分别循环调用每个Service的init和start方法。 都是类似的一层一层的往下调用的。bootstrap-->Catalina-->Standardserver-->StandService-->Container-->MapperUstener-->Executer-->Connector.
生命周期管理:
Tomacat通过,org.apache.Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口,这个接口做了四件事:
1,定义了13个String类型的常量,用于LifecycleEvent时间的type属性中,作用是区分组件发出 事件时的状态(如初始化前、启动前、启动后等)。
2,定义了三个管理监听器的方法addLifecycleListener,findLifecycleListeners,
removeLifecycleListener,添加,查找和删除。
3,定义了4个生命周期方法:init、start、stop、destroy。
4,定义了获取当前状态的两个方法,getState,getStateName,分别获取当前的状态和String类型的状态的名字。
Container:
Container启动是被Service调用init和start方法;是Tomcat中容器的接口,一共有四个子接口(子容器),Engine、Host,Context,Wrapper和一个默认的实现类ContainerBase,这四个子容器都有一个对应的StandXXX实现类,都继承自ContainerBase,Base又间接继承LifecycleBase。
每个Service一个Container,一个Engine,Engine里面可以有多个Host,每个Host(虚拟主机,站点)下可以有多个Context(代表一个应用),每个Context下可以有过个Wrapper(每个封装一个Servlet)。
4种容器的配置:
Engine和Host都是在conf/server.xml文件中,context有三种方式,可以通过文件(server.xml,conf/engineName/hostName/应用名.xml,conf/context.xml等),还可以自己将war包放到host目录下,还可以将应用的文件夹直接放到Host目录下。
Pipeline-Value管道:
Container处理请求是使用Pipeline-Value管道来处理的:
Pipeline-value是责任链处理模式,责任链模式是指在一个请求的处理过程中有多个处理者依次对请求进行处理,这个是管道模型,和普通的责任链模型又有一点不同:1,每个pipeline都有特定的Value,在管道的最后执行,叫做baseValue,这个baseValue不可删除。2,在上层管道的baseValue中会调用下层容器的管道。类似多层次的快递运输和再分配再运输。
例如:Engine的管道中依次执行Engine的各个value,最后至此那个satandardEngineValue用来调用Host的管道……,知道最后执行wrapper管道中的StandWrapperValue。跟Filter中用到的FilterChain很相似,而Servlet就相当于最后的BaseValue。
Pipe-line管道的实现分为生命周期的实现和处理请求两部分:1,Container中的Pipe-line在抽象类ContainerBase中定义,并在生命周期的startInternal,stopInternal,destoryInternal方法中调用管道的相应的生命周期方法,2,Connector在接收到请求后会调用最顶层容器的Pipeline来处理,Pipeline调用所包含的Value的invoke方法来处理请求,并且在BaseValue中有调用了子容器Pipeline所包含value的invoke方法,直到最后调用了Wrapper的Pipeline所包含的BaseValue-StandWrapperValue,在其中创建Filter-Chain并调用期doFilter方法来处理请求,FilterChain包含着我们配置的请求相匹配的Filter和Servlet,其doFilter方法会一次调用所有的Filter的doFilter方法和Servlet的service方法,进而处理请求。
Connector分析:
Connector用于接受请求并将请求封装成Request和Response来具体处理,最底层使用Socket来进行连接的,Request和Response是按照Http协议来封装的,所以Connector同时实现了TCP/IP协议和http协议,Request和Response封装完之后交给container进行处理,Connector就是Servlet的容器,Container处理完之后返回给Connector,最后Connector使用Socket将处理结果返回给客户端。这样整个请求就完成了。注意这只是Tomcat的处理完成了,在Container内部封装的各个Servlet会进行进一步的处理。
Connector中具体是使用ProtocolHandler来处理请求,不同的ProtocolHandler代表不同的连接类型。ProtocolHandler有三个最为重要的组件:Endpoint,Processor,Adapter;Endpoint用于处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将封装好的Request交给Container进行具体的处理。也就是说:Endpoint用来实现TCP/IP协议,Processor实现HTTP协议,Adapter将请求适配到Servlet容器进行具体的处理。
Connector类本省的作用主要是在其创建时创建ProtocolHandler,然后在生命周期的相关方法中调用了Protocol的相关生命周期方法。内部的Processor在其process方法中会调用Adapter的service方法来处理请求,Adapter的service方法主要是通过调用Container管道中的invoke方法来处理请求。
//调用Container管道的代码
connector.getService().getContainer().getPipeline().getFirst().invoke(request,response);
这里首首先从Connector中获取到Service,然后从中获取Container,再获取管道,再获取管道的第一个value,最后调用invoke方法执行请求。Service中保存的是最顶层的容器,当调用最顶层容器管道的invoke方法时,管道将逐层调用各层容器的管道中的Value的invoke方法,知道最后调用Wrapper的管道中的BaseValue(StandardWrapperValue)来处理Filter和Servlet。
参考:《看透springMVC》
----名白
http://www.cnblogs.com/mingbai/p/TomcatAnalysis.html
- Ffmpeg解析media容器过程/ ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : av_read_frame() http://blog.csdn.net/leixiaohua1020/article/details/12678577 ffmpeg ...
- 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- spring mvc 启动过程及源码分析
由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...
- CentOS7中Tomcat的安装和配置以及启动配置tomcat。启动过程中的易错点
Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置 当然也可以直接修改Tomcat的配置文件,请自行度娘 1.下载并解压 请先去官网找到需要下载的tom ...
- u_boot启动过程中的具体分析(1)
闭上眼睛,细致的回顾一下从NAND FLASH 启动的整个流程,首先,当我们打开板子的时候,先执行的就是嵌入在芯片上的iROM,它的作用就是为了把.NAND Flash 中的bootloader的一部 ...
- Android应用程序启动过程(二)分析
本文依据Android6.0源码,从点击Launcher图标,直至解析到MainActivity#OnCreate()被调用. Launcher简析 Launcher也是个应用程序,不过是个特殊的应用 ...
- Spring MVC源码(一) ----- 启动过程与组件初始化
SpringMVC作为MVC框架近年来被广泛地使用,其与Mybatis和Spring的组合,也成为许多公司开发web的套装.SpringMVC继承了Spring的优点,对业务代码的非侵入性,配置的便捷 ...
- uboot总结:uboot配置和启动过程2(mkconfig分析)
说明:文件位置:在uboot的目录下,文件名为:mkconfig.本身是一个脚本文件. 它的主要作用的是: (1)创建一个重要的符号链接 (2)创建一个config.mk文件(在include目录下) ...
- tomcat 5 启动过程官方文档
http://tomcat.apache.org/tomcat-7.0-doc/architecture/startup/serverStartup.txt Licensed to the Apach ...
随机推荐
- SharePoint 2016 每天预热脚本介绍
使用SharePoint的朋友们应该知道,SharePoint每天夜里有自动回收的机制,使环境每天把占用的内存都释放出来,以确保不会累计占用过多内存导致服务器崩溃. 我们可以打开IIS,选中我们的应用 ...
- asp.net core 中灵活的配置方式
asp.net core支持外部文件和命令行参数方式来配置系统运行所需要的配置信息,我们从下面两个常用场景来具体说下具体使用方法. 一.监听地址及端口配置 1,命令行方式 asp.net core系统 ...
- winform利用委托delegate进行窗体间通信,相同标题已经存在??
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- jQuery UI 日期选择器(Datepicker)
设置JqueryUI DatePicker默认语言为中文 <!doctype html><html lang="en"> <head> < ...
- OpenCV探索之路(十八):使用imwrite调整保存的图片质量
近日在用opencv做一些图像处理的操作时,需要对一些高分辨率的图像进行保存.比如,在操作一个容量为230M的图像后,并对该图像保存为JPG格式后,发现图像容量变为80M了!针对这个问题,忙了大半天, ...
- React 实践项目 (一)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 项目代码地址:https: ...
- 分享一次Oracle数据导入导出经历
最近工作上有一个任务要修改一个比较老的项目,分公司这边没有这个项目数据库相关的备份,所以需要从正式环境上面导出数据库备份出来在本地进行部署安装,之前在其它项目的时候也弄过这个数据库的部署和安装,也写了 ...
- eclipse 常用快捷键 及 windows快捷键
Eclipse常用快捷键 打开Eclipse快捷键的快捷键 Ctrl+Shift+L 快捷键 描述 原英文描述 Ctrl+Shift+P 定位到光标所在处的括号的另一半括号的位置 Go to Matc ...
- 第四章:Django 模型 —— 设计系统表
1. Django框架提供了完善的模型(Model )层来创建和存储数据,每一个模型对应数据库中的唯一的一张表. 2. Django 模型基础知识: .每一本模型是一个Python类,继承了djang ...
- js实现单张图片(或者多张)的预览功能
这个是预览单张图片的,如果要预览多张图片,改下面红色标记的地方就好了 <html> <head> <meta http-equiv="Content-Typ ...