IO模型學習(一)IO模型分類

liudashuang2017發表於2018-04-15

IO分類

在java中,IO分為Bio、Nio、Aio三類,三者有本質的區別,下面主要講解其在網路IO中的區別。

Bio
阻塞式IO,客戶端類為Socket,服務端類為ServerSocket。該類中提供的方法全部為阻塞方法,即該操作完成後,該方法才會返回。舉例說明,如果呼叫了Socket輸入流的readLine方法,那麼該方法必須在讀取到換行符才會返回。優點:實現簡單缺點:針對每一個客戶端請求都需要建立一個IO執行緒進行處理,並且IO操作在等待條件未滿足時,仍然佔用已持有資源等待,受網路波動的影響較大。

Nio
非阻塞式IO,客戶端類為SocketChannel,服務端類為ServerSocketChannel。在Nio中提供了阻塞和非阻塞兩種模式,一般我們會使用Nio的非阻塞模式,即每一個方法不會等待條件滿足就會立即返回。舉例說明:如果呼叫SocketChannel的read方法時,不管讀沒讀到資料都會立即返回,那麼帶來的問題也可想而知,對於IO操作的判斷邏輯會變得更加複雜(因為執行IO操作時,並不知道該操作有沒有完成)。優點:Nio中使用一個IO執行緒(Selector輪詢檢查每一個註冊的Channel)去處理所有的客戶端連線,且IO操作會立即返回,不會產生BIO中保持資源等待的情況。缺點:由於IO操作的完成情況是不確定的,導致了處理邏輯會比Nio複雜,其次IO執行緒通過輪詢的方式檢測,當註冊在Selector上的Channel非常多時,會成為系統的瓶頸

Aio
非同步IO,客戶端類為AsynchronousSocketChannel,服務端類為AsynchronousServerSocketChannel。相比於只使用一個IO執行緒處理IO操作的Nio而言,Aio中不存在額外的IO執行緒,而是通過事件回撥的方式來執行。(對Aio瞭解還不是很深刻,此處不做過多的講解)優點:不需要IO執行緒,相比於輪詢Channel的Nio而言,採用事件響應模式可以有更小的開銷缺點:目前還不知道

Tomcat配置IO協議

使用指定IO模型的配置方式:
配置 server.xml 檔案當中的

<Connector protocol="HTTP/1.1">

protocol 修改即可。
預設配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之後是NIO
BIO
protocol=“org.apache.coyote.http11.Http11Protocol“
NIO
protocol=”org.apache.coyote.http11.Http11NioProtocol“
AIO
protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
APR
protocol=”org.apache.coyote.http11.Http11AprProtocol“

下面是摘的server.xml中的一段配置

<!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation. The default
         SSLImplementation will depend on the presence of the APR/native
         library and the useOpenSSL attribute of the
         AprLifecycleListener.
         Either JSSE or OpenSSL style configuration may be used regardless of
         the SSLImplementation selected. JSSE style configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->

Connector 可以配置HTTP協議的和AJP協議. 可以參考/docs/config/http.html 裡面的內容 .
可以配置執行緒池, 連結超時時間, 監聽的埠號,SSH連結配置. 重定向的埠.

相關文章