java Nio
Selector 選擇器
Buffer 緩沖器
Channel 通道
Selector是NIO的核心,是channel的管理者嗜傅,通過執(zhí)行select()阻塞方式檩赢,監(jiān)聽是否有channel準備好,一旦有數(shù)據(jù)可讀,此方法的返回值是SelectionKey的數(shù)量趁曼。服務端通常會死循環(huán)執(zhí)行select()方法棕洋,直到有channel準備就緒,然后開始工作拍冠,每個channel都會和Selector綁定一個事件,然后生成一個SelectionKey的對象射众。
channel和Selector綁定時晃财,channel必須是非阻塞模式,而FileChannel不能切換到非阻塞模式断盛,因為它不能套接字通道钢猛,所以FileChannel不能和Selector綁定事件。
在NIO中一共有四種事件:
1命迈、SelectorKey.OP_CONNECT:連接事件
2、SelectorKey.OP_ACCEPT:接收事件
3淑倾、SelectorKey.OP_READ:讀事件
4征椒、SelectorKey.OP_WRITE:寫事件
channel連接tcp端口和selector選擇器,每次連接channel會新建一個嗎勃救,然后等準備好了就發(fā)送SelectionKey事件嗎,有事件后channel讀寫到buffer嗎垄开?是這個順序嗎税肪?
SelectionKey是Channel和Selector交互的核心組件,channel通過register綁定再selector上锻梳,并且注冊為connect事件净捅。Selector返回一個SelectionKey來檢測channel事件,通過輪詢判斷事件類型蛔六,然后做相應操作,通過SelectionKey可以反過來拿到Channel和Selector具钥。
tomcat NIO
connector
tomcat中Http11NioProtocol包含NioEndpoint實例液兽,請求工作委托給NioEndpoint,tomcat在NioProtocol解析http請求時設計了三種線程宁玫,分別為Acceptor柑晒,Poller,Worker匙赞。
Acceptor run方法中包含執(zhí)行過程。ServerSocketChannel執(zhí)行阻塞接收操作苦囱,接收完成后setSocketOptions脾猛,設置為非阻塞,調(diào)用Poller的register方法猛拴,完成channel的注冊。該方法的主要功能是利用傳入的SocketChannel參數(shù)生成SecureNioChannel或者NioChannel职员,然后注冊到Poller線程的selector中跛溉,注冊中事件改為SelectionKey.OP_READ扮授。
Poller線程专肪,相當于Selector
Worker線程就是SocketProcessor用來處理實際業(yè)務請求,實現(xiàn)Runnable接口荔仁,通過線程池執(zhí)行任務芽死。
Container:
Container容器是所用servlet容器的父接口,也就是說作為一個servlet容器掌呜,首先必須要實現(xiàn)Container接口坪哄,每個tomcat服務器只能有唯一的根Container,Connector組件通過setContainer方法將Container容器和Connector關聯(lián)起來翩肌。共有四種類型Container容器,分別對應不同概念的層次兑宇,每一層之間是父子的關系粱坤。
1、Engine:整個Catalina servlet引擎,標準實現(xiàn)為StandardEngine枚驻。
2株旷、Host:表示包含一個或多個Context容器的虛擬主機,標準實現(xiàn)為StandardHost晾剖。
3、Context:表示一個web應用程序沽损,一個Context可以有多個Wrapper循头,標準實現(xiàn)為StandardContext炎疆。
4壹士、Wrapper:包裝一個獨立的Servlet容器偿警,標準實現(xiàn)為StandardWrapper。