点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

关注公众号后台回复paymall获取实战项目资料视频

点击此链接:多套SpringCloud/SpringBoot实战项目,资料文档教程齐全

作者:编程迷思

来源:cnblogs.com/kismetv/p/7806063.html

前言

在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector)。

在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Request和Response对象传给Engine。当Engine处理完请求后,也会通过Connector将响应返回给客户端。

可以说,Servlet容器处理请求,是需要Connector进行调度和控制的,Connector 是Tomcat 处理请求的主干 ,因此Connector的配置和使用对Tomcat的性能有着重要的影响。这篇文章将从Connector入手,讨论一些与Connector有关的重要问题,包括NIO/BIO模式、线程池、连接数等。

根据协议的不同,Connector可以分为HTTP Connector、AJP Connector等,本文只讨论HTTP Connector。

一、Nio、Bio、APR

1、Connector的protocol

Connector在处理HTTP请求时,会使用不同的protocol。不同的Tomcat版本支持的protocol不同,其中最典型的protocol包括BIO、NIO和APR(Tomcat7中支持这3种,Tomcat8增加了对NIO2的支持,而到了Tomcat8.5和Tomcat9.0,则去掉了对BIO的支持)。

BIO是Blocking IO,顾名思义是阻塞的IO;NIO是Non-blocking IO,则是非阻塞的IO。而APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能;Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。

2、如何指定protocol

Connector使用哪种protocol,可以通过元素中的protocol属性进行指定,也可以使用默认值。

指定的protocol取值及对应的协议如下:

  • HTTP/1.1:默认值,使用的协议与Tomcat版本有关
  • org.apache.coyote.http11.Http11Protocol:BIO
  • org.apache.coyote.http11.Http11NioProtocol:NIO
  • org.apache.coyote.http11.Http11Nio2Protocol:NIO2
  • org.apache.coyote.http11.Http11AprProtocol:APR

如果没有指定protocol,则使用默认值HTTP/1.1,其含义如下:在Tomcat7中,自动选取使用BIO或APR(如果找到APR需要的本地库,则使用APR,否则使用BIO);在Tomcat8中,自动选取使用NIO或APR(如果找到APR需要的本地库,则使用APR,否则使用NIO)。

3、BIO/NIO有何不同

无论是BIO,还是NIO,Connector处理请求的大致流程是一样的:

在accept 队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS 完成三次握手建立了连接,则OS 将该连接放入accept 队列);在连接中获取请求的数据,生成request ;调用servlet 容器处理请求;返回response 为了便于后面的说明,首先明确一下连接与请求的关系:连接是TCP层面的(传输层),对应socket;请求是HTTP层面的(应用层),必须依赖于TCP的连接实现;一个TCP连接中可能传输多个HTTP请求。

在BIO实现的Connector中,处理请求的主要实体是JIoEndpoint对象。JIoEndpoint维护了Acceptor和Worker:Acceptor接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞。其中Worker是Tomcat自带的线程池,如果通过配置了其他线程池,原理与Worker类似。

有热门推荐

NETGEAR拒绝连接请求_详解 Tomcat 的连接数与线程池相关推荐

  1. tomcat线程释放时间_详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  2. 详解 Tomcat 的连接数与线程池

    原文出处:编程迷思 前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文 ...

  3. 详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  4. NETGEAR拒绝连接请求_破案:Kubernetes/Docker 上无法解释的连接超时

    编译:bot(才云) 技术校对:星空下的文仔(才云) 编者按:将应用迁移到 Kubernetes 时,有时候工程师们会发现一些令人费解的连接超时,无论怎么排查都找不到原因.在这篇文章中,软件架构师 M ...

  5. NETGEAR拒绝连接请求_习惯了独来独往,该怎么与别人建立连接?| KY咨询师信箱Vol.44...

    亲爱的咨询师: 您好.受我这种别扭的性格困扰好久了,不知道为什么,我不知道怎么跟别人建立亲密关系. 在与别人相处的过程中,我总是把自己放在很低的位置,过分在意别人的想法,不敢表达自己的真实想法,说话总 ...

  6. tomcat出现404的原因_详解Tomcat出现404的解决方法

    Tomcat测试出现404问题出现的问题如下: HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/chapter06/IndexServlet]不可用 描述 源服务器未能找到目标资 ...

  7. tomcat的连接数与线程池

    在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). Connector的主要功能,是接收连接请求,创建Reques ...

  8. java让线程空转_详解Java编程中对线程的中断处理

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...

  9. NETGEAR拒绝连接请求_3分钟理解HTTP的请求与响应

    HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...

最新文章

  1. 95-855-040-源码-调度-Flink Schedule Mode 调度模式
  2. awk java_Linux三剑客之awk
  3. java从0单排之java就业培训教程复习与面试题回顾——02
  4. Onvif协议学习:5、设备搜索
  5. python毕业论文参考文献格式范例_毕业论文参考文献范例
  6. mysql resource_MySQL - Resource temporarily unavailable问题处理
  7. 获取微信公众号文章内容
  8. 用户账号被盗,京东回应:都怪QQ!库克:从来没获取过FB用户数据!
  9. java 禁用迅雷_【Java】我擦!迅雷的代码结构竟然被扒了精光~
  10. JQuery $(function(){})和$(document).ready(function(){})
  11. 【微信技术-微信小程序】------- 渐进式骨架屏(加载流)(第二篇)
  12. linux操作mysql数据库
  13. Java学习-节点3
  14. 01 - AWS Organization
  15. 芋道 Spring Boot 消息队列 RocketMQ 入门
  16. insightface人脸训练数据rec文件制作
  17. 还在删减文件?知乎百万人追捧的内存增加术,让你的内存秒翻倍
  18. 等你爱我的伤感QQ日志:听说,喜欢隐身的人都有一种伤
  19. Juniper 防火墙端口映射
  20. 一网打尽:贝佐斯与亚马逊时代

热门文章

  1. python opencv旋转图片_opencv3+python3进行图片旋转处理
  2. java 计数器越界,[总结]-第二章 Java内存区域与内存溢出异常
  3. 10分钟解决Redis安装和Springboot整合
  4. python pandas使用pipe管道增强代码可读性
  5. python sklearn 绘制决策树模型的节点图
  6. pandas 按照固定的列顺序排序,并补足缺失列
  7. Python使用wordnet工具计算词集与词条基本用法(二)
  8. 解决pytorch CrossEntropyLoss报错RuntimeError: 1D target tensor expected, multi-target not supported
  9. Python“文件操作”Excel篇(上)
  10. android崩溃拦截给出提示显示日志