tomcat详解

servlet是用tomcat做服务器的一个程序,web服务器的一大功能就是会把浏览器传过来的请求封装成Servlet可以接受的Request和Response。这样就不用自己写Socket程序来处理传输过来的请求。

  • Server:代表的就是整个Tomcat服务器。Server的作用是提供接口让外界可以访问其中的Service集合。
  • Service:是Server的子容器,它的主要作用是把Connector和Container聚合起来作为一个服务。一个Server可以有多个Service.
  • Connector:属于Service的子容器,主要作用是负责接收浏览器的发过来的 tcp连接请求,并把这个请求封装成Request和Response对象。然后会产生一个线程(产生一个线程池)来处理这个请求并把产生的Request 和 Response 对象传给处理这个请求的线程。接下来处理这个请求的线程会传给 Container 组件要做的事了。Connector有多个,因为一般有很多请求需要处理。
  • Container:属于Service的子容器,它是一个接口,实现包含4个容器,Engine、Host、Context、Wrapper,这四个容器也是父子关系。

  • Host: 主要指的是虚拟主机,虚拟主机可以定义不同端口,一个Engine可以有多个Host,这里不是重点,略过了。可以看我以前写的一个博客Tomcat的虚拟主机

  • Context:context代表的就是一个Web项目,一个Host可以有多个Context。Context是用来管理web项目的Servlet的,后面再详解。
  • Wrapper:实现类是StandardWrapper,代表的是一个包装过的Servlet。
  1. 调用Server的start方法。值得注意的是,这个方法里面会遍历Service集合,并调用所有Service的start方法。因此启动tomcat会启动其中所有的项目!!!
  2. Service启动会触发一个监听器(生命周期监听器),让Service中的所有Container启动。导致所有的Context中启动。细节是,每一个Context其中有一个类ContextConfig会开始解析相应项目的web.xml,并把解析内容整合放到Context中。ContextConfig执行startInternal方法获取到ServletContext.因此一个web项目对应一个ServletContext,ServletContext是一个web项目中所有Servlet共用的。
  3. Context根据load-on-start创建Wrapper子容器,Wrapper调用loadServlet方法,实例化Servlet,并创建ServletConfig。因此Servlet和ServletConfig是绑定在一起的。当然在这个过程中,如果有相应的监听器,也会初始化监听器。

至此,Tomcat启动完成了。上面没有提到Connector,因为还没有请求过来。当请求过来的时候,Connector包装Tcp请求成Request和Response对象,且Request中存储了访问的URL信息,在Connector处理的阶段就已经确认要访问的Wrapper子容器(即servlet)了。 在封装完成后,创建一个线程,把Request和Response对象传到Container中确定好的Wrapper中,执行service方法里的doGet或doPost。

tomcat同时也是轻量级web服务器,能实现http传输。

在SpringMvc中,只有一个DispatherServlet,找到这个之后接下来的映射就交给SpringMvc自身的映射器来处理。

根据前面的知识,接到一个http请求,Tomcat就封装成一个Request和 Response。如果多个浏览器访问相同的url,那么多个浏览器访问相同的servlet,执行service方法。差别是每个service中的参数对象不一样。因为Servlet在Tomcat中只初始化一次,因此只有一个实例,每一个请求线程都会共用这一个实例。为了防止线程不安全,servlet中不能有类变量(或者说不能有可以被线程改变的类变量) 
总结:Servlet是单实例多线程模型,Tomcat在接到一个请求的时候,会在线程池中新开一个线程去处理这个请求。 
一般的Tomcat服务器可以处理的并发量是300左右

 

Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务

tomcat最重要的两个组件:connector和container,一个service对应一个container对应多个connector,tomcat的生命周期由server控制。

connector负责对外交流,container主要处理connector接收的请求,处理内部事务,service将connector与container组装在一起,向外提供服务。server提供让其他程序访问service集合的接口,同时维护他所包含的service的生命周期,包括初始化,结束服务,如何找到要访问的service等。

connector

负责接收浏览器发过来的tcp连接请求,创建request和response对象,并产生一个线程(connector是多线程的)来处理这个请求并把创建的request和response对象传给处理这个请求的线程,container负责处理这个请求。

流程如下图:

tomcat详解