总结
- Tomcat是如何接收网络请求?
- 使用java nio的同步非阻塞去进行网络监听 。
- org.apache.tomcat.util.net.AbstractEndpoint#bindWithCleanup中初始化网络监听、SSL
- { .... serverSock = ServerSocketChannel.open(); socketProperties.setProperties(serverSock.socket()); InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset()); // 当应用层面的连接数到达最大值时,操作系统可以继续接收连接,那么操作系统能继续接收的最大连接数就是这个队列长度,可以通过acceptCount 参数配置,默认是 100 serverSock.bind(addr, getAcceptCount()); } serverSock.configureBlocking(true); //mimic APR behavior
- org.apache.tomcat.util.net.NioEndpoint#startInternal中初始化业务处理的线程池、连接限制器、Poller线程、Acceptor线程
- 如何做到高性能的http协议服务器?
- Tomcat把接收连接、检测 I/O 事件以及处理请求进行了拆分,用不同规模的线程去做对应的事情,这也是tomcat能高并发处理请求的原因 。不让线程阻塞,尽量让CPU忙起来
文章插图
- 是怎么设计的呢?
- 通过接口、抽象类等,将不同的处理逻辑拆分,各司其职
- org.apache.tomcat.util.net.AbstractEndpoint:I/O事件的检测、处理逻辑都在这个类的实现类里面 。使用模板方法,不同的协议有不同的实现方法 。NioEndpoint/Nio2Endpoint/AprEndpointorg.apache.tomcat.util.net.NioEndpoint.Poller:引用了java.nio.channels.Selector,内部有个事件队列,监听I/O事件具体就是在这里做的org.apache.tomcat.util.net.NioEndpoint.NioSocketWrapperorg.apache.tomcat.util.net.NioEndpoint.SocketProcessor: 具体处理请求的线程类
Java NIO浅析
来源:
https://www.cnblogs.com/chenzw93/p/16072325.html
推荐阅读
- 红茶的产地和特征,功夫红茶的质量特征
- 百色古树红茶如何,古树红茶水温多少
- 红茶好坏如何区分,川红茶怎么样
- 深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力
- 如何让代码管理更简单高效?
- 架构师自诉:如何做到百万数据半小时跑批结束
- 红茶保存方法,红茶老茶如何保存方法
- 红茶茶的制作,红茶的红汤如何形成
- 如何评价宋太宗赵光义?宋太宗赵光义的后代在哪里_1
- 喝红茶失眠了如何解,7茶网红茶