javaWeb技术内幕之tomcat系统架构

一:tomcat总体架构图

tomcat的心脏是两个组件:connector和container,connector可以被替换,一个container可以选择对应多个connector,多个connector和一个container形成了一个service,有了service可以对外提供服务,但是service还要一个生存环境,必须有人给她生命,那就非server莫属。所以整个tomcat的生命周期由server控制。

    Connector负责对外交流,container主要connector接受的请求,主要处理内部事务。service主要是为了关联connector和container,同时会初始化它下面的其他组件,所有组件的生命周期在一个Lifecycle的接口中控制

     tomcat中Service接口的标准实现类是StandardService,它不仅实现了service接口,同时还实现了Lifecycle接口。

     二:组件的生命线:Lifecycle

         server和service管理它下面组件的生命周期:Tomcat组件的生命周期是通过Lifecycle接口来控制的,组件只要继承这个接口并实现其中的方法就可以统一被拥有它的组件控制了,这样一层一层的直到一个最高级的组件就可以控制Tomcat中所有组件的生命周期了,这个最高级的组件就是server,而控制server的是startup,也就是你启动和关闭tomcat

除了控制生命周期的start和stop方法外,还有一个监听机制,在生命周期开始和结束的时候做一些额外操作。

Lifecycle接口的方法的实现都在其他组件中,组件的生命周期由包含它的父组件控制,所以它的start方法自然就是调用它下面的组件的start方法,stop方法也是一样。如在server中start方法就会调用service组件的start方法,server的start方法代码如下:

     

        监听的代码会包围service组件的启动过程,就是简单的循环启动所有service组件的start房发,但是所有service必须要实现lifecycle接口,这样做更加灵活。

          server的stop方法代码如下:

       三:Connector组件:

         Connector组件的主要任务是负责接收浏览器发过来的tcp连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是container组件要做的事了。

    四:connector最重要的功能就是接收连接请求,然后分配线程让container来处理这个请求,所以这必然是多线程的,多线程的处理是connector设计的核心,将connector划分为connector、processor、protacol

     connector的主要类图:

     HttpConnector的start方法如下:

       

当执行到 threadStart()方法时,就会进入等待请求的状态。直到一个新的请求到来才会激活它继续执行。这个激活是在HttpProcessor的assign方法中,代码如下:

    创建HttpProcessor对象时会把available设为false,所以当请求到来时不会进入while循环,将请求的Socket赋给当前处理的socket,并将avaliable设为true,当avaliable设为true时,HttpPrecessor的run方法将被激活,接下来会处理这次请求。

   run方法代码如下:

   

解析socket的过程在process方法中,

当connector将Socket连接封装成Request和Response对象后,接下来的事情就交给container来处理了。

五:servlet容器Container

        Container是容器的父接口,所有子容器都必须实现这个接口,它使用的是典型的责任链的设计模式,由四个子容器构成,分别是Engine、Host、Context和Wrapper。通常一个servlet class对应一个Wrapper,如果有多个Servlet就可以定义多个Wrapper,如果有多个wrapper就要定义一个更高的container

  六:容器的总体设计:

       Context还可以定义在父容器Host中,Host不是必须,但是要运行war程序就必须用Host,因为war中必有web.xml文件,这个文件的解析就需要Host。如果要有多个Host就要定义一个top容器Engine,而Engine没有父容器,一个Engine代表一个完整的servlet引擎。

       当Connector接受一个连接请求时,将请求交给container,下面试时序图:

      

   Engine和Host处理请求的时序图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值