《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》

摘要: 原创出处 http://ericcenblog.com/2017/11/02/jettyyuan-ma-pou-xi-xi-lie-3-connectorru-he-jie-shou-wang-luo-qing-qiu/ 「Eric Cen」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

在本系列的第一篇提到,Jetty由Connector组件负责接收网络请求,如下图:img

ServerConnector是Jetty Connector的实现类,我们直接看它的doStart方法:img它先是调用了父类AbstractNetworkConnectordoStart方法:img这个父类的doStart方法先是调用了open方法,注意这里实际调用的是ServerConnector实现的open方法:img它先是调用openAcceptChannel方法来创建一个NIO的ServerSocketChannelimg上面的就是一个经典的NIO ServerSocketChannel创建过程:先是ServerSocketChannel.open(),然后再把ServerSocketChannelServerSocket绑定到相应的InetSocketAddress,熟悉的配方,熟悉的味道:) 再回到ServerConnectoropen方法,它拿到这个ServerSocketChannel后,会调用它的configureBlocking方法,把它设置为阻塞的,这里其实是为了设置它的ServerSocket在调用accept方法的时是阻塞模式(即调用accept方法就会进入线程阻塞直到有网络连接进来)。 我们再回到AbstractNetworkConnectordoStart方法,当它执行完open方法打开ServerSocketChannel后,接着会调用它的父类AbstractConnectordoStart方法:img这个方法很重要,到这里就开始了本文真正要关注的地方:Connector是如何接收处理网络请求的。我们来看其中的这段代码:img我们先看一下_acceptorsAbstractConnector的构造方法里初始化的)是什么:img我们可以看到它其实是个acceptor(我翻译为网络请求接收者)线程数组,这个数组的长度定得有点讲究,如果你没有指定acceptor的数目,acceptors这个值传进来的时候会默认为-1,那么就会将主机的CPU数量除以8取整跟4比较取最小的再跟1比较取最大的,如果acceptors的数目比JVM CPU的数目还多的话,它就会通过打一句log来提醒你Acceptor的数目不应大于JVM CPU的数目。

TO BE CONTINUE.....

文章目录