前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat connector 实现原理

Tomcat connector 实现原理

作者头像
java404
发布2018-05-18 12:27:16
1.6K0
发布2018-05-18 12:27:16
举报
文章被收录于专栏:java 成神之路java 成神之路

Bootstrap.main()->Bootstrap.init()

BootStrap.init()

bootstrap.init() 方法中设置catalinaDaemon

创建 Connector 对象

Bootstrap.main()->Bootstrap.start()->Catalina.start()->Catalina.load()->Catalina.createStartDigester()

createStartDigester() 方法
  1. 创建connector对象,并判断server.xml 中是否配置线程池,如果配置线程池则创建线程池

server.xml 配置

  1. 为connector对象设置除executor外的其它属性信息
  2. 把当前connector添加到StandardService.connectors 数组中。

Connector

构造

通过protocol协议来判断使用那个protocolHandler。

setProtocol 方法

tomcat 默认配置 是以BIO的模式启动的,默认会调用org.apache.coyote.http11.Http11Protocol。 下面我们以Http11Protocol来分析Connector。

startInternal() 方法

startInternal() 方法

  1. 设置tomcat状态为,正在启动
  2. 启动 connector。

Http11Protocol

Http11Protocol 构造方法

  1. 在构造方法中创建JIoEndpoint和Http11ConnectionHandler对象
  2. 设置 socket 参数
AbstractEndpoint.start() 方法
代码语言:javascript
复制
public class JIoEndpoint extends AbstractEndpoint

JIoEndpoint 继承 AbstractEndpoint

start()

JIoEndpoint .bind() 方法

在这创建connector的socket服务,使用serverSocket监听入站连接。

JIoEndpoint.startInternal() 方法
  1. 判断线程池是否为空,如果为空则创建默认的线程池。(server.xml的connector中配置的线程池)
  2. 根据server.xml中的connector中的acceptorThreadCount属性来确定创建几个接受请求处理的线程。 Acceptor类,负责处理接受客户端请求的处理。

server.xml 中配置如下: <Connector port="8080" protocol="HTTP/1.1" acceptorThreadCount="2" redirectPort="8443"/>

acceptorThreadCount 个数建议和CPU的个数一致。

createExecutor() 方法

createExecutor() 方法

默认创建的线程池,最小线程数为10,最大线程数为200,空闲时间为60秒,队列为LinkedBlockingQueue,队列大小默认为Ineteger.MAX_VALUE。

这里需要注意的是,如果队列中的元素没有存满,那么线程的数量一直会是10,而不会自动扩大到200。所以建议大家自己设置一个线程池,而不要用默认的

Acceptor 类
Acceptor.run() 方法
  1. 获取之前创建的serverSocket。 2.设置socket的参数
  2. 调用processSocket 处理请求的socket
processSocket() 方法

把socket封装成SocketWrapper对象 传给SocketProcessor对象,并提交给线程池处理。

SocketProcessor

负责解析http协议信息。 SOcketProcessor重要属性

Paste_Image.png

inputBuffer:包装socket的inputStream,并解析http协议信息。 outputBuffer:包装socket的outputStream,负责响应用户的数据。

run() 方法

run() 方法

在process方法中处理解析http协议信息。

Http11Processor.process() 方法

Http11Protocol.process()->Http11Processor.process() 代码如下:

Http11Processor.process()

获取socket的输入流和输出流

Http11Processor构造方法

在这里,构造Request和Response对象。

解析http协议

解析完后的数据存储到 AbstractInputBuffer的下面两个属性中

代码语言:javascript
复制
    protected Request request;
    protected MimeHeaders headers;

request对象就是 HttpServletRequest 对象的原型。

解析完之后,调用下面的service方法。

这里的service方法会调用servlet中的service方法并传入request和response对象,然后根据请求的方法来决定调用的是servlet的doGet方法还是doPost或其它的方法。

到此 Connector的整理流程就结束了。

简单梳理下

1. Connector

根据协议来选择协议的处理类,tomcat默认的处理类是Http11Protocol。

2. JIoEndpoint
  1. 创建ServerSocket 连接
  2. 创建接受请求的线程 Acceptor对象。
  3. 创建处理请求的线程池 executor。
3. Http11Processor

主要负责解析http协议的

  1. 解析请求行 (来确定http协议、请求的url、请求的method)
  2. 解析请求头 headers 3.并把解析后的结果交给 Container 处理

connector 可配置的部分参数

参数值根据自己项目做响应修改。下面的只是个例子

代码语言:javascript
复制
<Connector port="8080" protocol="HTTP/1.1"
    acceptCount="1000"
    disableUploadTimeout="true"
    enableLookups="false"
    keepAliveTimeout="20"
    maxThreads="500" 
    minThreads="500"
    maxProcessor="500"
    minSpareThreads="20"
    maxKeepAliveRequests="1"
    connectionTimeout="20" 
    redirectPort="8443"
    allowTrace="false"
    acceptorThreadCount="2"
    acceptorThreadPriority="7"
    socket.tcpNoDelay="true"
    threadPriority="8"
    tcpNoDelay="true"
    compression="on"
    emptySessionPath="true"
/>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建 Connector 对象
    • createStartDigester() 方法
    • Connector
      • 构造
        • setProtocol 方法
        • startInternal() 方法
        • Http11Protocol
          • AbstractEndpoint.start() 方法
            • JIoEndpoint .bind() 方法
              • JIoEndpoint.startInternal() 方法
                • createExecutor() 方法
                  • Acceptor 类
                    • processSocket() 方法
                      • SocketProcessor
                        • run() 方法
                          • Http11Processor.process() 方法
                            • Http11Processor构造方法
                            • 简单梳理下
                              • 1. Connector
                                • 2. JIoEndpoint
                                  • 3. Http11Processor
                                  • connector 可配置的部分参数
                                  相关产品与服务
                                  数据保险箱
                                  数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档