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。
- 调用Server的start方法。值得注意的是,这个方法里面会遍历Service集合,并调用所有Service的start方法。因此启动tomcat会启动其中所有的项目!!!
- Service启动会触发一个监听器(生命周期监听器),让Service中的所有Container启动。导致所有的Context中启动。细节是,每一个Context其中有一个类ContextConfig会开始解析相应项目的web.xml,并把解析内容整合放到Context中。ContextConfig执行startInternal方法获取到ServletContext.因此一个web项目对应一个ServletContext,ServletContext是一个web项目中所有Servlet共用的。
- 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负责处理这个请求。
流程如下图: