Tomcat顶层架构可以看到一个Server可以有多个Service,一个Service可以有多个Connector和一个Container。这两部分是Tomcat的核心。1、Connector用来处理连接相关的事情,提供Socket和Response相关的转换2、Container用来封装和管理Servlet,具体处理Request请求。多个Connector可以提供多个链接,比如同时提供http和https链接,也可以提供同一个协议不同端口的链接,如图:多个Connector和一个Container组成一个Service,但是一个环境是需要管理整个多个Service(但一般只有一个Service,常见的是Catalina),这个必须是Server,具体可以看server.xml文件配置:上面的配置用这张图可以看得更清楚:我们来分析一下这个配置文件:可以看到server标签端口设置为8005,shutdown="SHUTDOWN",意思是8005端口监听SHUTDOWN命令时会关闭Tomcat服务。在Resource中配置pathname="conf/tomcat-users.xml",指定manageUI登录用户等全局配置。此服务器中只有一个名为Catalina的服务。Catalina支持两种连接,分别是8080端口的http连接和8009端口的AJP连接。Catalina服务中有一个名为localhoust的站点,该站点下的应用组为appBase="webapps",支持自动部署autoDeploy="true",并设置站点中应用程序打印的日志名称和日志格式。Connector和Container架构分析Connector用于接收请求,将请求封装成Request和Response,然后交给Container处理,处理后交给Connector返回给客户端。可以分为四个步骤:1.Connector如何接受请求?2、如何将接受的请求封装成Request和Response?3、Request和Response封装完成后如何传递给Container?4.Container处理完后如何交给Connector返回给客户端?Connector结构图:Connector使用ProtocolHandler来处理请求。不同的ProtocolHandlers代表不同的类型。例如:Http11Protocol使用普通Socket连接,Http11NioProtocol使用NioSocket连接。三个组件Endpoint用于处理底层的Socket连接,Process用于将EndPoint收到的Socket封装成Request,Adapetr将Request交给Container进行具体处理。EndPoint底层处理Socket网络连接,所以使用EndPoint实现TCP/IP协议,使用Processor实现HTTP协议。Adapetr将请求分配给Servlet容器进行具体处理。AsyncTimeout用于监听请求是否超时。现在1、2、3的前三步都处理完了,最后一步就是Container如何处理请求了。容器结构图:四个子容器分别是:1、Engine:引擎管理多个站点(Host),一个Service和一个Engine2、Host:代表一个站点,可以通过在server.xml中配置Host、Context来添加站点3:表示应该使用的程序,就是我们平时开发的程序,或者一个WEB-INF目录和web.xml文件4、Wrapper:每个Wrapper包这个Servlet上面的几个容器和Tomcat目录的对应关系如下:Context和Host的区别是Context代表一个应用,而我们Tomcat默认的webapps下的每个文件夹都是一个Context,其中主应用放在Root下,其他目录都存放子应用。而整个webapps就是一个Host站点。访问应用时,如果放在Root下,可以直接在Connector的端口加上Host的name属性。如果你自己构建它,你可以添加上下文名称。Container是如何处理请求的?Pipeline-Valve管道用于处理,它使用责任链模型。每个处理器负责自己的处理。处理完成后返回处理结果,交给下一个处理器继续处理。如图:(1)Connector收到请求后会先调用最顶层容器的Pipeline进行处理。这里最顶层容器的Pipeline是EnginePipeline(Engine的管道);(2)Engine的pipeline中会依次执行EngineValve1、EngineValve2等,最后执行StandardEngineValve。StandardEngineValve中会调用Host管道,然后依次执行Host的HostValve1、HostValve2等。最后会执行StandardHostValve,然后依次调用Context管道和Wrapper管道,最后执行StandardWrapperValve。.(3)StandardWrapperValve执行时,会在StandardWrapperValve中创建一个FilterChain,调用其doFilter方法处理请求。这个FilterChain包含了我们配置的匹配请求的Filter和Servlet,它的doFilter方法会依次调用它们。Filter的doFilter方法和Servlet的service方法,让请求得到处理!(4)所有Pipeline-Valves执行完毕,具体请求处理完成后,即可将返回结果交给Connector。,Connector通过Socket将结果返回给客户端。
