Connector 屬於 StandardService 裏的一個組件,能夠在 server.xml 中配置,指定協議、端口、超時時間等。git
1 2 3 4 |
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> </Service> |
每一個 Service 裏能夠配置多個 Connector. Tomcat 的 Connector 支持兩種協議,HTTP 和 AJP. 關於這兩種協議,官方文檔如此說:github
經過配置不一樣的 protocol 屬性,可使用不一樣的 ProtocalHandler. 配置HTTP/1.1時,默認會使用org.apache.coyote.http11.Http11NioProtocol. 也能夠經過指定類名的方式來配置,好比
protocol=」org.apache.coyote.http11.Http11Nio2Protocol」.
針對 HTTP 和 AJP 兩種協議,都有 BIO/NIO/NIO2/APR 四種處理方式。web
AJP 的處理我並無去細看,但大的代碼結構基本和 HTTP 的處理相似。後面重點看下 HTTP 1.1 鏈接的幾種處理方式(我看的這個版本還不支持Http 2.0)。apache
使用的是Java BIO 技術,一個 Acceptor 線程負責建立鏈接,把創建好鏈接的 socket 給到 SocketProcessor, 而後把SocketProcessor 丟到線程池裏去執行。通過一系列處理後最終到達 CoyoteAdapter. 線程模型即:編程
使用的是Java NIO 技術,一個 Acceptor 線程負責建立鏈接,把創建好鏈接的 socket 交給 一個Poller. 這裏有多個Poller,每一個Poller一個線程。Poller 負責把 socket 註冊到 selector, 負責輪詢 selector(關於selector, 我當年給NetX協議棧寫 BSD SOCKET 兼容接口的時候還親自實現過,哈哈), 有數據可讀的時候,就交給SocketProcessor丟到線程池裏去執行。通過一系列處理後最終到達 CoyoteAdapter. 線程模型即:tomcat
使用的是 Java NIO2(AIO) 技術,一個 Acceptor 線程(代碼裏 Acceptor 只支持建立多個的,經過變量 acceptorThreadCount 來控制)負責建立鏈接,把創建好鏈接的 socket 給到 SocketProcessor, 而後把SocketProcessor 丟到線程池裏去執行。 線程模型即:網絡
是否是看起來和 HTTP BIO 很像,可是這裏的 read/write 用的是 NIO2 的異步非阻塞方式,即read的時候帶個callback,等有OS有數據了,再來回調你的處理方法,效率比BIO高不少。app
APR ,講真,沒仔細研究過,就不瞎BB了。異步
關於BIO/NIO/NIO2(AIO),已及網絡編程的線程模型,更詳細的能夠看Netty學習筆記. 關於這幾種模式的性能比較,網上也有不少測試數據。socket
如前面幾張圖所示,整個鏈接器的代碼結構仍是很清晰的。在 Tomcat 啓動的時候,經過 Digest 解析 server.xml 配置的時候,會在 StandardService 裏建立一些 Connector. Connector 也是實現生命週期接口的,在 StandardService 初始化和啓動的時候,Connector 也會完成本身的初始化和啓動操做,啓動過程當中,EndPoint 會去完成 bind 操做,而後啓動 accept 線程。ProtocalHandler、EndPoint、ConnectionHandler、Processor、Adaptor 這幾個角色互相配合,完成各自的工做。
最後,謝晞鳴在想,CoyotoAdapter 這個適配器以前的全部這些的網絡處理,是否是均可以用Netty來實現呢,抽空想一想看?
.
以上皆是閱讀源碼 https://github.com/fdx321/tomcat8.0-source-research 所得