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

  • 相关阅读:
    window上部署Flask
    PIP超时
    覆盖内敛样式
    解决js导出csv中文乱码
    没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览。
    nuget加载本地包
    DataTable表头对不齐、添加参数等方法总结
    根据class判断
    element-ui的table动态生成表头和数据,且表中数据可编辑
    VScode快捷键、Chrome快捷键知识小总结和状态码
  • 原文地址:https://www.cnblogs.com/felixpan/p/4910584.html
Copyright © 2011-2022 走看看