序文
前回の記事「Netty 入門ガイド」では、Netty の開発履歴、コア機能とコンポーネントなど、Netty の入門知識を主に説明し、Netty を使用して HTTP サーバーを構築する方法を例を通して説明しました。Netty は抽象度が高いため、より複雑で理解しにくい場合があります。そのため、この記事では、Java NIO の処理フローと Netty の全体的なプロセスを比較し、Netty をより明確に理解するために Netty のソース コードを組み合わせます。
Java NIO の仕組み
まず第一に、Netty は Java NIO に基づいたネットワーク アプリケーション フレームワークであり、それに基づいてカプセル化および拡張されていることがわかります (そのため、Netty を深く理解する前に、Java NIO についてある程度の理解を持っておくことをお勧めします)。両者はネットワーク接続をよく理解しています。読み取りと書き込みの動作モードは似ています。
上図に示すように、Java NIO の処理フローと Java NIO コード例を組み合わせると、各イベントをServerSocketChannel
登録してリッスンした後、イベント要求を受信した後、ビジネス コードがそれを判断して処理していることがわかります。Netty を使用する場合 これらのコードを記述する必要はないようで、「,」という単語さえ表示されません。では、これらのコードが Netty にどのように反映されるかを見てみましょう。上記では Netty によって構築された HTTP サーバーを例として、「 」がいつ作成され、いつイベントが登録および処理されたのかに直接焦点を当てます。Selector
Selector
Selector
ServerSocketChannel
ServerSocketChannel
Selector
セレクターの作成
EventLoop
実際、前の記事で Netty の概要を読んだ後、がさまざまなイベントの処理を担当していることがわかるので、 で作成するSelector
必要があると盲目的に推測できます。NioEventLoopGroup
NioEventLoopGroup
JDK の構築メソッドでは、Java NIO のコードをSelectorProvider
作成するために呼び出されます。Selector
ServerSocketChannelの作成
ServerSocketChannel
の作成に関しては、次の図に示すように、ポートをバインドする方法を直接見つけます。
NioServerSocketChannel
NettyのコードnewChannel()
内の Java NIO のコードも参照してください。
ServerSocketChannel の登録セレクター
以下の図では、ServerSocketChannel
作成後に a が割り当てられ、新しいスレッドが開始され (これは Netty のマルチスレッド非同期の具体化でもあります)、最後にJDK を呼び出してイベントをリッスンするEventLoop
インターフェイスに登録されます。を見れば明らかになるはずです。doRegister()
Selector
selectionKey
イベントの処理
ServerSocketChannel
イベントを登録してリッスンしたので、次のステップはSelector
イベントが来たときにEventLoop
それを処理しNioEventLoop
、コードを直接確認することです。イベントは新しいスレッドを通じて開始されるため、run()
processSelectedKeysPlain()
調べて監視されているので直接 at
図では、ChannelPipeline
拡張に便利な責任連鎖モードを使用してイベントを処理しています。Netty の読み取りイベントと Java NIO の関係は、次の図に示されています。
要約する
したがって、Netty に触れる前に、まず Java NIO をマスターする必要があります。この記事では、誰もが Netty をより便利に理解できるように、Netty での Java NIO の実施形態と Netty による Java NIO のカプセル化についてのみ紹介しており、Netty の効率的で効率的な機能については説明しません。迫力あるデザインですので、以下でご紹介します。