zoukankan      html  css  js  c++  java
  • Tomcat源码分析(一)

    这段时间简单的看了一下Tomcat的源码,在这里做个笔记!

      1. tomcat 架构图

    Catalina: tomcat的顶级容器,main()方法中就是通过,创建Catalina 对象实例,来启动或者关闭 tomcat;

    Server: 是管理tomcat所有组件的容器,包含一个或多个的service;

    Service: Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理;

    Connector: 主要功能是 ◇socket的接收 ◇根据协议类型处理socket ◇封装相应的request和response,交给Container;

    Container: Engine容器接收来自Connector的请求,并且通过Pipeline依次传递给子容器的Pipeline;

    Engine: 在Engine的Pipeline中的Valve的invoke方法中,根据request.getHost()来定位下一个host;

    Host: 一个Web服务器虚拟机,管理着具体的 web application;

    Context: 就是我们所部属的具体Web应用的上下文,每个请求都是在具体的上下文中处理;

    Wrapper:对应着Web的每一个 Servlet;

    接下来,主要学习tomcat中的两个最主要的容器,Connector和Container容器。

     

      2. Connector容器

    Connector容器主要解决的问题就是Socket的接收,为了能够很好的处理各种协议和并发异步接收,Connector加入了两个组件 ProtocolHandler和EndPoint。

    ProtocolHandler的主要作用就是根据各个协议的定义按照一定的格式句分析协议头,封装成request和response对象;

    AbstractEndPoint 致力于高并发的解决socket的接收和处理;

    2.1 AbstractEndPoint

    EndPoint 中两个协同合作的Runnable:

    (1) Accepter负责用ServerSocket.accept()来接收客户请求,并且把建立连接之后的Socket交由Poller处理;

    (2) Poller负责接收请求,并处理;

    protected class Acceptor extends AbstractEndpoint.Acceptor (Acceptor implements Runnable)
    
    public class Poller implements Runnable

     Accepter和Poller的具体写作示意图(个人拙见)

     从上图中,我们可以发现,Acceptor接收到一个用户的socket请求之后,将这个Socket封装成PollerEvent,放入events队列中。Poller实际上,一直while(true),当执行events队列中有PollerEvent的时候,就会从自己的Selector中获取到一个有数据的Channel,交给ProcessKey()处理。

    2.1 ProtocolHandler

    每一种协议都有各自具体定义,和具体的协议头的格式,那么我么在接收到客户请求之后,就应该根据协议的类型采用相应的解析方法。

    ProtocolHandler的具体作用:

    ◆ 定义具体处理Socket的AbstractEndPoint;

    ◆ 提供解析请求的AbstractConnectionHandler来获取具体的协议头;

    ◆ 相关的init、start、stop方法

    【参考文献】

    [1] http://blog.csdn.net/cutesource/article/details/5006062

    [2] http://blog.csdn.net/yanlinwang/article/details/45648039

  • 相关阅读:
    MSIL实用指南-加载null、string、long、float、double等值
    MSIL实用指南-加载int值
    MSIL实用指南-IL版hello world
    中文编程语言Z语言开源正式开源!!!
    Lisp永远成不了编程主流语言
    TKT中文编程语言简介
    Anaconda+django写出第一个web app(八)
    Anaconda+django写出第一个web app(七)
    Anaconda+django写出第一个web app(六)
    Anaconda+django写出第一个web app(五)
  • 原文地址:https://www.cnblogs.com/felixpan/p/4910584.html
Copyright © 2011-2022 走看看