标签:clu 实现 pip 并且 体系 xml配置 领域 就会 启动
Tomcat作为JavaWeb领域的Web容器,目前在我们淘宝也使用的也非常广泛,现在基本上所有线上业务系统都是部署在Tomcat上。为了对平时开发的Web系统有更深入的理解以及出于好奇心对我们写的Web系统是如何跑在Tomcat上的,于是仔细研究了下Tomcat的源码。大家都知道Servlet规范是Java领域中为服务端编程制定的规范,对于我们开发者只是关注了Servlet规范中提供的编程组件(ServletContextListener,Filer,Servlet) 等 ,但是规范中还有一些我们经常使用的接口(ServletContext,ServletRequest,ServletResponse,FilterChain)等都是由Tomcat去实现的,并且我们开发者实现的编程组件只是被Tomcat去回调而已。所以看Tomcat源码实现也有助于我们更好的理解Servlet规范及系统如何在容器中运行(一些开源的MVC框架如Struts2,Webx,SpringMVC本质无非就是这个)
仔细查看下图(网络上描述Tomcat架构比较清晰的一张图),不难发现其中的Connecotr组件以及与Container组件是Tomcat的核心。一个Server可以有多个Service,而一个Service可以包含了多个Connector组件和一个Engine容器组件,一个Engine可以由多个虚拟主机Host组成,每一个Host下面又可以由多个Web应用Context构成,每一个的Context下面可以包含多个Wrapper(Servlet的包装器)组成。
Tomcat将Engine,Host,Context,Wrapper统一抽象成Container。一个抽象的Container模块可以包含各种服务。例如,Manager管理器(Session管理),Pipeline管道( 维护管道阀门Value )等。Lifecycle接口统一定义了容器的生命周期,通过事件机制实现各个容器间的内部通讯。而容器的核心接口Container的抽象实现中定义了一个Pipeline,一个Manager,一个Realm以及ClassLoader统一了具体容器的实现规范。连接器(Connector)组件的主要任务是为其所接收到的每一个请求(可以是HTTP协议,也可以AJP协议),委托给具体相关协议的解析类ProtocolHandler,构造出Request 对象和Response 对象。然后将这两个对象传送给容器(Container)进行处理。容器(Container)组件收到来自连接器(Connector)的Request 和Response对象后,负责调用Filter,最后调用Servlet的service 方法(进入我们开发的Web系统中)。
1.Server组件:Server是最顶级的组件,代表Tomcat的运行实例;包含Listener组件用以监听生命周期中的各种事件;包含GlobalNamingResources组件用以集成JNDI;包含Service组件用以提供服务。
2.Service组件:Service是服务的抽象,代表请求从接受到处理的所有组件的集合;Server组件可以包含多个Service组件;包含Connector组件用以接收客户端的信息;包含Engine组件用以处理请求;包含Executor用以提供线程池执行任务。
3.Connector组件:接收客户端连接并接收信息报文,信息报文经由它解析后送往容器中处理;包含Mapper组件对请求地址进行路由;包含CoyoteAdaptor组件用以将Connector组件和Engine等容器组件适配起来;包含Protocol组件用以接收客户端连接、接收客户端信息报文、报文解析处理、对客户端响应等整个过程。
4.Protocol组件:包含JioEndPoint组件,其中的Acceptor组件将启动某个端口的监听,将监听到的请求放入线程池Executor组件,其中的Processor组件对HTTP协议解析并传递到Engine容器继续处理;NIO模式下NioEndPoint多了一个Poller组件轮询多个客户端连接处理事件。
Engine组件:代表全局Servlet引擎;每个Service组件只能包含一个Engine容器组件;包含Listener组件用以在生命周期中对Engine相关的事件进行监听;包含AccessLog组件以记录访问日志;包含Cluster组件以提供集群功能,将需要共享的数据同步到集群中的其他Tomcat实例中;包含Pipeline组件用以处理请求;包含Realm组件用以提供安全权限功能。
5.Host组件:代表虚拟主机;一个Engine组件可以包含若干个Host容器组件;包含Listener组件用以在生命周期中对Host相关的事件进行监听;包含AccessLog组件以记录访问日志;包含Cluster组件以提供集群功能,将需要共享的数据同步到集群中的其他Tomcat实例中;包含Pipeline组件用以处理请求;包含Realm组件用以提供安全权限功能。
6.Context组件:是Web应用的抽象,Web应用部署到Tomcat后运行时就会转化成Context对象;包含了各种静态资源、若干Servlet(Wrapper容器)以及各种其他动态资源;
包含Listener组件用以在生命周期中对Context相关的事件进行监听;
包含AccessLog组件以记录访问日志;
包含Pipeline组件用以处理请求;
包含Realm组件用以提供安全权限功能;
包含Loader组件用以加载Web应用的资源,保证不同Web应用之间的资源隔离;
包含Manager组件用以管理Web容器的会话,包括维护会话的生成、更新和销毁;
包含NamingResource组件将Tomcat配置文件的server.xml和Web应用的context.xml资源和属性映射到内存中;
7.Mapper组件用以作为路由映射Servlet。
8.Wrapper组件:对应的是Servlet;包含Web应用开发常用的Servlet组件;包含ServletPool组件用以存放Servlet对象,当Web应用的Servlet实现了SingleThreadModel接口时则会再Wrapper中产生一个Servlet对象池,线程执行时,需先从对象池中获取到一个Servlet对象,ServletPool组件能保证Servlet对象的线程安全;包含Pipeline组件用以处理请求。
我们从功能的角度将Tomcat源代码分成5个子模块,它们分别是:
标签:clu 实现 pip 并且 体系 xml配置 领域 就会 启动
原文地址:https://www.cnblogs.com/grasp/p/10061742.html