在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了.但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助.只有对比后,你才能知道其他模式的优势在哪里. Http11Protocol表示阻塞式的HTTP协议的通信,它包含从套接字连接接收.处理.响应客户端的整个过程.它主要包含JIoEndpoint组件和Http11Processor组件.启动时,JIoEndpoint组件将启动某个端口的监听,一个请求到…
Tomcat8之后,针对Http协议默认使用org.apache.coyote.http11.Http11NioProtocol,也就是NIO模式.通过之前的博客分析,我们知道Connector组件在初始化和start的时候会触发它子组件(Http11NioProtocol.NIOEndpoint的初始化和start). NIO模式工作时序图 还是像之前那样,我们先整理出NIO模式启动时的时序图. 从上面的时序图可以看出,整个流程的重点时在NioEndpoint这个类中.下面我们通过源代码看下这…
Connector组件介绍 Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责是负责接收客户端连接和客户端请求的处理加工.每个Connector都将指定一个端口进行监听,分别负责对请求报文解析和对响应报文组装. Connector组件是整个Tomcat的入口,假如我们想要学习Tomcat的源码的话,建议从Connector组件开始看起. 还有一个比喻就是Tomcat是一座城堡,而Connector组件就是这座城堡的一个个城门. 上图是Connector组件的一个典型实…
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让大家见笑了. 本文我们来探索一下主流的各种应用服务器的网络处理模型,看看大家都是怎么设计网络程序的.在本文中,我会从Node.js.Apache Server.Nginx.Netty.Redis.Tomcat.MySQL.Zuul等常用的服务器程序,给大家逐一分析,分析各种服务器程序的性能,心中有数,才能手中…
最近看到了内网ATA上的一篇断网故障时Mtop触发tomcat高并发场景下的BUG排查和修复(已被apache采纳),引起了我的好奇,感觉原作者对应底层十分了解,写的很复杂.原来对于tomcat的线程模型不怎么清楚,但是它又是我们日常最常用的服务器,于是我对它的线程模型进行了补习. 一. tomcat支持的请求处理方式 Tomcat支持三种接收请求的处理方式:BIO.NIO.APR BIO模式:阻塞式I/O操作,表示Tomcat使用的是传统Java I/O操作(即Java.io包及其子包).To…
目录 一. Netty是什么? 二. Netty 的使用场景 三. Netty通讯示例 1. Netty的maven依赖 2. 服务端代码 3. 客户端代码 四. Netty线程模型 五. Netty模块组件 1. [Bootstrap.ServerBootstrap]: 2. [Future.ChannelFuture]: 3. [Channel]: 4.[Selector]: 5. [NioEventLoop]: 6.[NioEventLoopGroup]: 7.[ChannelHandle…
作者:Calix 一)模型分析 memcached到底是如何处理我们的网络连接的? memcached通过epoll(使用libevent,下面具体再讲)实现异步的服务器,但仍然使用多线程,主要有两种线程,分别是“主线程”和“worker线程”,一个主线程,多个worker线程. 主线程负责监听网络连接,并且accept连接.当监听到连接时,accept后,连接成功,把相应的client fd丢给其中一个worker线程.worker线程接收主线程丢过来的client fd,加入到自己的epol…
1 四种线程模型  配置方法:在tomcat conf 下找到server.xml,在<Connector port="8080" protocol="HTTP/1.1"/> BIO: protocol =" org.apache.coyote.http11.Http11Protocol" NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol" AIO…
前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的机制我们还是有必要了解的,尤其是线程模型和classloader,这篇我们会聚焦线程模型. 其实我本打算将一个问题,即大家知道,我们平时最终写的controller.service那些业务代码,最终是由什么线程来执行的呢? 大家都是debug过的人,肯定知道,线程名称大概如下: http-nio-8…
看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoarpg游戏划分,线程被划分为,主线程,全局同步线程,聊天线程,组队线程,地图线程,以及地图消息分发派送线程等: 一些列,都需要根据我的划分,以及数据流向做控制. 游戏服务器,主要要做的事情,肯定是接受玩家的 命令请求 -> 相应的操作 -> 返回结果: 在服务器端所有的消息都会注册到消息管理器里,然…