今日は、エイプ灯台の「365オリジナルプロジェクト」の第13章です。
ビーコンジュンは、次の時間にNettyシリーズを更新し続けます。合計9つの記事
Current:Nettyソースコード分析(1)が始まる
Nettyソースコード分析(2):Netty Channel
Nettyソースコード分析(3):Netty Future and Promise
Nettyソースコード分析(4):NettyのChannelPipeline
Nettyソースコード分析(5):Nettyのスレッドプール分析
Nettyソースコード分析(6):チャネルレジスタ操作
Nettyソースコード分析(7):NioEventLoopワークフロー
Nettyソースコード分析(8):チャネルレジスタ操作に戻る
Nettyソースコード分析(9):接続プロセスとバインドプロセス分析
今日!Dengta Junはあなたに言った:
Nettyソースコード分析(1)
序文:この記事では、Javaプラットフォームで最も広く使用されているNIOパッケージであるNettyを紹介します。これは、JIOでのNIO実装のカプセル化レイヤーであり、NIOプログラムをより便利に開発できます。実際、Nettyは単なるNIOではなく、基本的に誰もがNIOに参加しています。
Dengta Junは、Nettyについて自慢することは国内では少し多すぎると感じています。それは主に、多くの人々がトレーニングや出版のいずれかでディナーに依存しているためであり、私はNettyを空に吹き込みたいと思っています。初心者は、Nettyは高度なテクノロジーと同じだと感じます。
Nettyのソースコードは、それがより単純で、さまざまなカテゴリ間の関係が複雑であるため、それほど単純ではありません。多くの人々は、そのソースコードは非常に優れていると言っています。それはきれいで、すべての線が本質ですが、それらは異なるタイプであり、比較するものは何もありません。
Nettyのソースコードは優れています。そのインターフェースはより柔軟で、多くの場合、インターフェースは使いやすく、ソースコードはそれほど単純ではありません。
この記事はソースコード分析に基づいています。読者がNettyをある程度理解している場合、またはそれを使用している場合は、より良いでしょう。
- この記事ではTCP関連のコンテンツのみを紹介します。他のプロトコルに対するNettyのサポートは、この記事の範囲を超えています。
- 並行パッケージのソースコード分析とは異なり、ソースコードを1行ずつ言うことはできないため、いくつかの例外は、導入する必要があると思わない限り、直接スキップされます。
- Nettyのソースコードを更新し、バージョン間に相違点があるため、最新バージョン4.1.25.2018-09-06の最終版に合わせて導入しました。
この記事を読んだ後、初心者は「Netty In Action」を体験できることをお勧めします。中国語のテキスト版もオンラインで見つけることができます。
1.準備
ソースコードを学ぶために、それは間違いなく最初の準備環境です。
Dengjunはmavenを使用するのが好きで、Spring Bootも好きなので、私は通常、最も単純な足場を準備するためにhttps://start.spring.io/にアクセスします。
10秒でスキャフォールディングを取得し、それをIntellijにインポートします。新しいバージョンのSpring Bootを使用している場合は、ダウンロードの依存関係も待機する必要がある場合があります。この間、https://mvnrepository.com/を開いて、すぐに使用するmavenの依存関係を検索してください。
nettyは、netty-handler、netty-buffer、netty-transport、netty-commonなど、いくつかのモジュールに分かれています。すべてのモジュールを含むnetty-allもあります。
ソースコードを分析しているので、最も単純なものを使用するのが自然です。netty-allは最適なオプションではありません。netty-exampleは次のとおりです。
1 <dependency> 2 <groupId> io.netty </ groupId> 3 <artifactId> netty-example </ artifactId> 4 <version> 4.1.25.Final </ version> 5 </ dependency>
依存関係を解決できるだけでなく、例の例は使用方法を学ぶのに非常に適しています。
2.エコーの例
NettyはNIOライブラリとして、サーバーとして要求を自然に受け入れるか、クライアントとして要求を開始できます。Nettyを使用してクライアントまたはサーバーを開発することは非常に簡単です。Nettyは非常に優れたカプセル化を行います。または、複数のハンドラーを使用してカスタムロジックを処理します。
次に、私たちがよく目にする例を見てみましょう。これはエコーと呼ばれます。つまり、エコー、クライアントから渡される値、サーバーから返される値はそのままです。
netty-exampleのソースコードを開き、echoパッケージの下のコードをコピーして再生します。
上記のコードは基本的にテンプレートコードです。それぞれの用途はルーチンです。開発する必要があるのは、もちろんEchoServerHandlerやEchoClientHandlerなどのハンドラー(...)およびchildHandler(...)メソッドで指定されたハンドラーだけです。 Nettyソースコードは、Nettyソースコードで提供されている上記のLoggingHandlerなどの多くのハンドラーも提供し、必要に応じて直接使用できます。
上記のコードに含まれるコンテンツのいくつかを見てみましょう:
- ServerBootstrapクラスはサーバーインスタンスの作成に使用され、Bootstrapはクライアントインスタンスの作成に使用されます。
- 2つのEventLoopGroup:bossGroupとworkerGroup、これらはNettyのスレッドモデルに関連しています。サーバー側に2つのグループがあり、クライアント側に1つだけあることがわかります。これらはNettyのスレッドプールです。
- Nettyのチャネルは、JavaのネイティブのServerSocketChannelとSocketChannelを直接使用しませんが、それに対応するNioServerSocketChannelとNioSocketChannelをラップします。
もちろん、UDPプロトコルをサポートするNioDatagramChannelなどの他のプロトコルもサポートされていますが、この記事ではTCPのみを扱います。
- 左側のハンドラー(...)メソッドは、サーバーが新しい要求を受信したときに処理に使用されるハンドラー(LoggingHandler)を指定し、右側のハンドラー(...)メソッドは、クライアントが要求を処理する必要があることを指定します。中古ハンドラー。
EchoServerで複数のハンドラーを指定する場合は、右側でEchoClientのようなChannelInitializerを使用することもできます
- 左側のchildHandler(…)は、childHandlerを指定します。ここでのハンドラーは、新しく作成された接続用です。接続を受け入れた後、ServerSocketChannelはSocketChannelのインスタンスを作成する必要があることがわかります。childHandler(…)で設定されたハンドラーは、新しく作成されたSocketChannelを処理します。ServerSocketChannelインスタンスの処理には使用されません。
- パイプライン:ハンドラーは複数を指定できます(支援するには上記のChannelInitializerクラスが必要です)。これらはパイプラインを形成します。これらは実際にはインターセプターの概念に似ています。すべてのNioSocketChannelまたはNioServerSocketChannelインスタンスにパイプラインインスタンスパイプラインが含まれていることを覚えておいてください。ハンドラの実行順序も含まれます。
- ChannelFuture:これには、JDKのFutureインターフェースと同様に、Nettyでの非同期プログラミングが含まれます。
Nettyを知らない読者のために、プレッシャーをかけないでください。LighthouseJunは、それらを1つずつ紹介します。この記事は主に初心者向けです。LighthouseJunは、理解することがより困難であるか、より重要な部分を見つけます。
上記のソースコードはメッセージ送信およびメッセージ受信の処理を示していません。灯台のこの部分は、上記のコンテンツを紹介した後に紹介されます。
以下では、これらのコンテンツをブロックごとに紹介します。読者がNIOやNettyについてさまざまな程度の理解を持っている可能性があるという事実を考慮して、Dengta Junは多くの場所で初心者の世話をするために詳細にする必要があるので、読者がセクションごとに読み進めて、あなたが精通しているコンテンツを適切に読んでいただければ幸いです。お楽しみに!
365日間の乾物が常に利用可能です。WeChatで「Ape Lighthouse」を検索して、最初に読んだり、返信したりできます。[情報] [インタビュー] [再開]最初に準備した工場のインタビュー資料と履歴書テンプレートがあります