Servlet容器原型(三)——Tomcat 4默认连接器浅谈
2014-08-07 00:00
120 查看
其实就是在Servlet容器原型(二)的基础上,讲讲Tomcat中处理HTTP请求的那部分的一个优化,这也是Tomcat4中默认采用的方法。
![](http://static.oschina.net/uploads/space/2014/0227/151929_X4to_265349.png)
在这幅图中我们看到Bootstrap启动之后会启用一个叫做HttpConnector的组件,这个组件负责绑定会用ServerSocket绑定一个IP和一个端口,那么我们猜想一下,假如Tomcat对外提供服务,那么可能处理的客户端请求就有可能是HTTP或者是HTTPS,那么这个两个Connector肯定是有着不同的实现,如果都放在Bootstrap的main中实现,肯定不行,那么我们很自然的就会想到用多线程去实现。没错,Tomcat4中也是这么干的,Connector实现了Runnable接口。那么一种类型请求来,就不会阻碍另一种类型的请求来了。
接下来HttpConnecor接收到了代表客户端的Socket,把它交给HttpProcessor处理,这一步的处理还是要排队的,那么如何做到不排队呢?Tomcat 4的答案还是用多线程,Processor实现了Runnable接口(在run方法中进行process),那么一个客户端Socket进来,就为其分配一个线程去处理,这样就不会阻碍到再有新的Socket进来的处理了。
同时题外话,这样就可以理解了Servlet中的成员变量可能会有线程安全问题的说法了,Servlet单实例多线程访问。
但是,线程的创建与销毁代价的蛮高的,因此,HttpConnector会维护一个HttpProcessor的线程池,实现线程的可复用。当然,这个线程池的伸缩可根据不同的策略去配置。
上面这些方法很粗糙,当然现在的Tomcat版本已经有了很好的连接器实现。
最后,引入容器Container的概念。有了容器,我们就不用再去直接new一个Servlet出来了,而是使用自定义的类加载器(ClassLoader),那么这个把Servlet从字节码加载进内存的东西就要负责管理Servlet的生命周期了(我们先不讲到生命周期)
具体就是一个HttpProcessor关联一个容器,调用其invoke方法,invoke方法会把servlet加载出来,并调用器sevice方法处理。这里的“容器”其实是直接找到了Servlet类,还没有加入映射器Mapper组件的帮助,直接根据URL来去把Servlet加载出来,目的是引入容器的概念。
![](http://static.oschina.net/uploads/space/2014/0227/151929_X4to_265349.png)
在这幅图中我们看到Bootstrap启动之后会启用一个叫做HttpConnector的组件,这个组件负责绑定会用ServerSocket绑定一个IP和一个端口,那么我们猜想一下,假如Tomcat对外提供服务,那么可能处理的客户端请求就有可能是HTTP或者是HTTPS,那么这个两个Connector肯定是有着不同的实现,如果都放在Bootstrap的main中实现,肯定不行,那么我们很自然的就会想到用多线程去实现。没错,Tomcat4中也是这么干的,Connector实现了Runnable接口。那么一种类型请求来,就不会阻碍另一种类型的请求来了。
接下来HttpConnecor接收到了代表客户端的Socket,把它交给HttpProcessor处理,这一步的处理还是要排队的,那么如何做到不排队呢?Tomcat 4的答案还是用多线程,Processor实现了Runnable接口(在run方法中进行process),那么一个客户端Socket进来,就为其分配一个线程去处理,这样就不会阻碍到再有新的Socket进来的处理了。
同时题外话,这样就可以理解了Servlet中的成员变量可能会有线程安全问题的说法了,Servlet单实例多线程访问。
但是,线程的创建与销毁代价的蛮高的,因此,HttpConnector会维护一个HttpProcessor的线程池,实现线程的可复用。当然,这个线程池的伸缩可根据不同的策略去配置。
上面这些方法很粗糙,当然现在的Tomcat版本已经有了很好的连接器实现。
最后,引入容器Container的概念。有了容器,我们就不用再去直接new一个Servlet出来了,而是使用自定义的类加载器(ClassLoader),那么这个把Servlet从字节码加载进内存的东西就要负责管理Servlet的生命周期了(我们先不讲到生命周期)
具体就是一个HttpProcessor关联一个容器,调用其invoke方法,invoke方法会把servlet加载出来,并调用器sevice方法处理。这里的“容器”其实是直接找到了Servlet类,还没有加入映射器Mapper组件的帮助,直接根据URL来去把Servlet加载出来,目的是引入容器的概念。
相关文章推荐
- [笔记]深入剖析Tomcat-tomcat的默认连接器,servlet容器
- Resin与其他容器(tomcat/jetty)默认处理Servlet
- [笔记]深入剖析Tomcat-servlet容器和连接器
- Tomcat 容器与servlet的交互原理
- [How Tomcat Works]第2章 一个简单的Servlet容器
- Web 服务器、Servlet容器、Tomcat服务器
- JSP,servlet容器,Tomcat,servlet容器之间的关系
- Tomcat 5 servlet/JSP 容器 JNDI 资源使用说明 (一)
- 什么是Servlet容器、Web服务器、Tomcat服务器?
- Tomcat源码分析(五)--容器处理连接之servlet的映射
- Tomcat源码分析(三)--连接器是如何与容器关联的?转载
- Servlet容器与Servlet,Tomcat的关系
- Tomcat的默认连接器
- JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系
- Action级,package级,application级的国际化(tomcat容器的web.xml,project的web.xml,默认action跳转)
- Tomcat 5 servlet/JSP 容器 JNDI 资源使用说明 (一)
- 为什么说Tomcat是servlet容器?
- JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系
- Servlet容器 - Tomcat请求处理原理
- Web 服务器、Servlet容器以及Tomcat服务器