tomcat@nginx

Tomcat原理架构简介

2017-06-20  本文已影响182人  zhanglbjames

Tomcat组件

  1. 概述:核心组件:Connector 和 Container(以夫妻为例介绍)。多个 Connector 和一个 Container 就形成了一个 Service。Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。



    注:整个 Tomcat 的生命周期(通过实现Lifecycle实现)由 Server 控制,作用就是要能够提供一个接口让其它程序能够访问到这个 Service 集合、同时要维护它所包含的所有 Service 的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的 Service。

  2. 其他重要组件:安全组件 security、logger 日志组件、session、mbeans、naming 等。这些组件共同为 Connector 和 Container 提供必要的服务。

  3. Connector:
    负责接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后从线程池中取出一个线程来处理这个请求,并把产生的 Request 和 Response 对象传给处理这个请求的线程。Connector有三种IO处理模型BIO、NIO、AIO(APR)
    注:启动过程:初始化SeverSocket, 初始化线程池,构建Request 和 Response,请求到来时,激活线程,解析http协议,把头写到Request 和 Response中,传给Container,完成之后返回Request 和 Response对象,关闭当前Socket,回收线程。
    BIO、NIO、AIO适用场景分析:
    BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
    NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
    AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
    Tomcat中BIO与NIO

  4. Container:
    Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。(子容器的路由放在request中)
    Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,Context是 Servlet 运行的基本环境,对应Web工程,定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析需要 Host ,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。

  5. 责任链模式:很多对象由每个对象对其下家的引用连接起来形成,请求在链上传递,这样可以不影响客户端而能够在链上增加任意处理节点。包含抽象处理者和具体处理者,整个容器就是通过一个链连接在一起,这个链一直将请求正确传递给最终处理的Servlet。(其中Pipeline和Value扩展了链的功能,使得可以接收外界干预)。
    注:此外,还有命令模式,观察者模式,门面模式等

请求处理流程


描述:

  1. 用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
  3. Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
  5. path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
  6. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
  7. Context把执行完之后的HttpServletResponse对象返回给Host。
  8. Host把HttpServletResponse对象返回给Engine。
  9. Engine把HttpServletResponse对象返回Connector。
  10. Connector把HttpServletResponse对象返回给客户Browser。

参考链接
https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
http://www.cnblogs.com/hggen/p/6264475.html

上一篇 下一篇

猜你喜欢

热点阅读