Tomcat并发处理请求

Tomcat处理连接请求的模式:

  • BIO:阻塞模型
  • NIO:非阻塞模型
  • APR: 高性能,可扩展的模式,Tomcat8版本默认模式
    Tomcat连接器(Connector)是处理请求的主要组件,它负责接收请求,创建Request和Response对象用于和前端进行数据的交换;然后分配线程让Servlet容器来处理这个请求,并把产生的Request和Response对象传给Servlet容器。当Engine处理完请求后,也会通过Connector将结果返回给请求端。即Connector进行请求的调度和控制。
    根据协议的不同,可以分为Http Connector和AJP Connector,两种协议的不同可以看这篇博文

一、NIO、BIO、APR

1. Connector的模式

Connector在处理HTTP请求时,会使用不同的模式。不同版本的Tomcat支持的模式不行同(Tomcat8+版本支持NIO以及APR去掉了对BIO的支持)
BIO与NIO大家都是比较熟悉的,APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高扩展性、高性能;APR是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包

2. Connector的请求流程

OverView

Connector启动后会启动三种线程组用于不同阶段的处理:

  • Acceptor线程组。用于接收新连接,并将新连接封装以下,选择一个Poller将新连接添加到Poller的事件队列中
  • Poller线程组。用于监听Socket事件,当Socket可读或可写时,将Socket封装一下添加到worker线程池的任务队列中
  • Worker线程组。用于对请求进行处理,包括分析请求报文并创建Request对象,调用容器的pipeline
    Acceptor、Poller、Worker的线程池(ThreadPoolExcutor)均维护在NioEndPoint中
Connector的初始化及启动
tomcat-connector-start
  1. initServerSocket(),通过ServerSocketChannel.open()打开一个ServerSocket,默认绑定到8080端口,默认的连接等待队列长度为100,当超过100时会拒绝服务。我们可以通过在conf/server.xml中的Connector的acceptCount属性对其进行设置。
  2. createExecutor()用于创建Worker线程池。默认会启动10个Worker线程,Tomcat处理请求过程中,Worker最多不超过200个。我们可以通过配置conf/server.xml中的Connector的minSpareThreads 和 maxThreads 对这两个属性进行定制。
  3. Poller用于检测已经就绪的Socket,默认不超过2个线程,我们可以通过配置 pollerThreadCount 设置。
    4.Acceptor用于接收新的连接,默认1个线程,我们可以通过配置 acceptorThreadCount 对其进行设置。
Acceptor请求过程
  1. Acceptor在启动后会阻塞在ServerSocketChannel.accept()处,当有新连接到达时,该方法返回一个SocketChannel
    2.配置完Socket以后会将Socket封装到NioChannel中,并注册到 Poller,由于我们一开始就启动了多个 Poller 线程,注册的时候,连接是公平的分配到每个 Poller 的。
    3.addEvent() 方法会将 Socket 添加到该 Poller 的 PollerEvent 队列中。到此 Acceptor 的任务就完成了。
Poller过程
  1. selector.select(1000)。当 Poller 启动后因为 selector 中并没有已注册的 Channel,所以当执行到该方法时只能阻塞。所有的 Poller 共用一个 Selector,其实现类是 sun.nio.ch.EPollSelectorImpl
    2.events() 方法会将通过 addEvent() 方法添加到事件队列中的 Socket 注册到 EPollSelectorImpl,当 Socket 可读时,Poller 才对其进行处理
    3.createSocketProcessor() 方法将 Socket 封装到 SocketProcessor 中,SocketProcessor 实现了 Runnable 接口。worker 线程通过调用其 run() 方法来对 Socket 进行处理。
    4.execute(SocketProcessor) 方法将 SocketProcessor 提交到线程池,放入线程池的 workQueue 中。workQueue 是 BlockingQueue 的实例。到此 Poller 的任务就完成了。
Worker过程
  • worker 线程被创建以后就执行 ThreadPoolExecutor 的 runWorker() 方法,试图从 workQueue 中取待处理任务,但是一开始 workQueue 是空的,所以 worker 线程会阻塞在 workQueue.take() 方法。
  • 当新任务添加到 workQueue后,workQueue.take() 方法会返回一个 Runnable,通常是 SocketProcessor,然后 worker 线程调用 SocketProcessor 的 run() 方法对 Socket 进行处理。
  • createProcessor() 会创建一个 Http11Processor, 它用来解析 Socket,将 Socket 中的内容封装到 Request 中。注意这个 Request 是临时使用的一个类,它的全类名是 org.apache.coyote.Request
  • postParseRequest() 方法封装一下 Request,并处理一下映射关系(从 URL 映射到相应的 Host、Context、Wrapper)。

参考:谈谈 Tomcat 请求处理流程(http://www.importnew.com/27729.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容