您的位置:首页 > 运维架构 > Tomcat

Servlet容器原型(三)——Tomcat 4默认连接器浅谈

2014-08-07 00:00 120 查看
其实就是在Servlet容器原型(二)的基础上,讲讲Tomcat中处理HTTP请求的那部分的一个优化,这也是Tomcat4中默认采用的方法。



在这幅图中我们看到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加载出来,目的是引入容器的概念。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: