Tomcat整体框架:
Server:
Server是Service的生存环境。一个Server中可以有多个Service。
Service:
Service将Connector和Container包装在一起提供对外服务,一个Service可以有多个Connector,但是只有一个Container。
Connector:
Connector负责对外交流。它的主要任务是负责接收浏览器的发过来的tcp连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request 和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事了。
Connector中网络事件的是ProtocolHandler,每个ProtocolHandler都有一个EndPoint,EndPoint则代表具体的端口监听模式,像BIO, NIO,ProtocolHandler接收来自EndPoint的事件,并交给Container处理。
Container:
Container负责处理Connector传过来的请求。
Container是容器的父接口,所有子容器都必须实现这个接口,Container容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine包含Host,Host包含 Context,Context包含Wrapper。通常一个Servlet class对应一个Wrapper,如果有多个Servlet就可以定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container了,如Context。
Container中都包含一个Pipeline,Pipeline则像是一个事件处理管道,上面有很多时间处理程序,Container接收到事件后,分别调用Pipeline上的Valve去处理,每一个上一层Container的Pipeline上都有一个指向下一层Container的Valve,从而做到了事件从上层Container传到下层。
a) Engine是完整的容器,其下面拥有多个虚拟主机,它的责任就是将Connector请求分配给虚拟机处理。它的标准实现类是StandardEngine,这个类注意一点就是Engine没有父容器了,如果调用 setParent方法时将会报错。
b) Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
c) Context还可以定义在父容器Host中,Host不是必须的,但是要运行war程序,就必须要Host,因为war中必有web.xml文件,这个文件的解析就需要Host了,如果要有多个Host就要定义一个top容器Engine了。而Engine没有父容器了,一个Engine代表一个完整的Servlet引擎。
d) Wrapper代表一个Servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,它没有子容器了,所以调用它的addChild将会报错。