Apache Tomcat如何高并发处理请求( 四 )

总结

  • 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忙起来

Apache Tomcat如何高并发处理请求

文章插图
 
  • 是怎么设计的呢?
  • 通过接口、抽象类等,将不同的处理逻辑拆分,各司其职
    • 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: 具体处理请求的线程类
参考:NioEndpoint组件:Tomcat如何实现非阻塞I/O?
Java NIO浅析
来源:
https://www.cnblogs.com/chenzw93/p/16072325.html




推荐阅读