ディレクトリ
このセクションで、私たちはネッティーを説明します
ネッティー
なぜネッティー
私たちは、なぜネッティーを使用し、NIOは、プログラムの効率を向上させることができるんですか?
簡単に言えば:ネッティーはJDK NIOカプセル化し、複雑なコードの多くを書いていない、あなたはより多くのクールなを使用してみましょう。
公式の用語:ネッティーネットワークは、保守性、高性能のサーバーとクライアントを迅速に開発するための非同期イベント駆動型アプリケーションフレームワークです。
ここでネッティーは、JDKのネイティブNIOを使用していない理由の一部は以下のとおりです。
使用JDKは、概念の多くを理解するNIOの必要性、プログラミングの複雑さが付属しています
- NIOモデルは直接モデルIOに変換することができますから、ネッティーはIOモデルランダムスイッチングの基礎となる、そしてすべてこれは単なるマイナーな変更を行うには
- 開梱開梱を運ぶネッティーは、異常検出機構が詳細、サービスロジックの必要性の唯一の懸念から重いNIOから外されます
- ネッティーはJDKを解決するため、空のポーリングを含め、多くのバグを含んでいます
- 非常に効率的な並列処理を実現するために、小さな、うまく設計されたスレッドモデルの最適化の多くを行っネッティー基礎となるスレッド、セレクタ
- プロトコルスタックの様々な付属していますと、あなたは一般的な契約のいずれかの種類を処理することができますほとんどの手ではありません
- 任意のメーリングリストや問題のネッティーコミュニティ活動家、出会いの問題
- ネッティーは、経験豊富な大手のRPCフレームワーク、大規模な検証メッセージングミドルウェア、分散ミドルウェア通信回線、非常に強い堅牢性を持っています
IOプログラミングと同じケース:
ネッティーは従属追加
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.5.Final</version>
</dependency>
サーバー:
public class NettyServer {
public static void main(String[] args) {
ServerBootstrap serverBootstrap = new ServerBootstrap();
NioEventLoopGroup boos = new NioEventLoopGroup();
NioEventLoopGroup worker = new NioEventLoopGroup();
serverBootstrap
.group(boos, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<NioSocketChannel>() {
protected void initChannel(NioSocketChannel ch) {
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println(msg);
}
});
}
})
.bind(8000);
}
}
クライアント:
public class NettyClient {
public static void main(String[] args) throws InterruptedException {
Bootstrap bootstrap = new Bootstrap();
NioEventLoopGroup group = new NioEventLoopGroup();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) {
ch.pipeline().addLast(new StringEncoder());
}
});
Channel channel = bootstrap.connect("127.0.0.1", 8000).channel();
while (true) {
channel.writeAndFlush("测试数据");
Thread.sleep(2000);
}
}
}
ネッティーイベント駆動型
例えば、多くのシステムは、イベントダウンマウスを表すのonClick()イベントを、提供します。次のようにイベント駆動型モデルの一般的な考え方は以下のとおりです。
- イベントキューがあります。
- マウスボタンが押されたときに、イベントキューは、クリックイベントを追加します。
- そこイベントポンプ、キューからイベントの周期は、削除イベントに応じて、異なる機能を呼び出します。
- イベントは、一般的に、参照のそれぞれの処理方法を保存しています。このように、各イベントは、対応する治療中に見出すことができる。
なぜ使用イベントドリブン? - プログラムのタスクを並列に実行することができます
- タスク間の独立性の高い、お互いにお互いを待つ必要はありません
- イベントの到着を待っている前に、タスクがブロックされることはありません
:を含め、基本的なアーキテクチャとして、イベント駆動型を使用するには、網状の方法
- イベントキュー(イベントキュー):イベントを受け取るための入口。
- ディストリビュータ(イベントメディエーター):異なるビジネス・ロジック・ユニット内の異なるイベントに配布。
- イベントチャネル(イベントチャネル):ディストリビューターとプロセッサ間の通信チャネル。
- イベントハンドラ(イベント処理):ビジネス・ロジックの処理を実装するには、次のステップをトリガ、イベントの完了後に発行されます。
コアコンポーネント
図ネッティー機能特性:
ネッティー特徴:
- トランスポートサービス、BIOとNIOをサポートしています。
- 統合されたコンテナ:OSGI、JBossMC、春、Guiceのコンテナのサポート。
- プロトコルのサポート:HTTP、いるProtobuf、バイナリ、テキスト、WebSocketを、およびカスタムプロトコルのサポート。
BIOとNIO差:
シーン | バイオ | NIO |
---|---|---|
新しい接続要求 | 新しいスレッド処理を開きます。 | 多重原理を使用して、スレッド処理 |
該当シーン | 小さな接続と固定 | 特に、接続数、短い接続(オペレーティングライト)シーン |
ネッティーフレームには、次のコンポーネントが含まれています。
- ServerBootstrap:クライアント接続を受け入れると、接続のためのサブチャネルを作成するためには、一般的にサーバーを使用、受け入れられてきました。
- ブートストラップ:通常、クライアントのために、新しい接続を受け入れ、そしていくつかのアクションベースの親チャネルを実行することではありません。
- チャンネル:このよう組立作業やパッケージのように結合、読み取り、書き込み、コネクタ、アダプタなどのIネットワークソケット/ O操作。
- イベントループ:I / O操作で登録されたチャンネルのすべてを処理します。通常、A
- イベントループは、複数のチャネルを提供することができます。
- EventLoopGroup:イベントループ管理する複数のインスタンスであって、イベントループ
の構成要素は、内部スレッドのセットを維持、スレッドプールとして理解することができます。 - ChannelHandlerとChannelPipeline:例えば、ラインワークショップ、ヘッドからパイプラインへのアセンブリは、組立ラインを介して、順に組立ライン上の作業員が処理される、パイプラインは、テール製品が組み立てられる達します。パイプライン等価ChannelPipeline、イベントとしてChannelHandler、ソースコンポーネントの等価な組立ラインの労働者。
- ChannelInitializer:ChannelHandler ChannelPipeline処理チェーンにチャンネルを追加し、先ほど作成したチャンネルを初期化するために使用されます。
- ChannelFuture:並列処理結果を達成するために同様のスレッド、すなわちとの将来のインタフェースJDK。これは、自動的に操作の実装の成功または失敗のイベントハンドラメソッドリスナーをトリガすることができます。
ネッティーフレームワーク上で、おそらく少しモンゴル見て、私たちは前に書かれたコードにコメントを追加し、次のコンポーネントで構成されています。
サーバー:
public class NettyServer {
public static void main(String[] args) {
// 用于接受客户端的连接以及为已接受的连接创建子通道,一般用于服务端。
ServerBootstrap serverBootstrap = new ServerBootstrap();
// EventLoopGroup包含有多个EventLoop的实例,用来管理event Loop的组件
// 接受新连接线程
NioEventLoopGroup boos = new NioEventLoopGroup();
// 读取数据的线程
NioEventLoopGroup worker = new NioEventLoopGroup();
//服务端执行
serverBootstrap
.group(boos, worker)
// Channel对网络套接字的I/O操作,
// 例如读、写、连接、绑定等操作进行适配和封装的组件。
.channel(NioServerSocketChannel.class)
// ChannelInitializer用于对刚创建的channel进行初始化
// 将ChannelHandler添加到channel的ChannelPipeline处理链路中。
.childHandler(new ChannelInitializer<NioSocketChannel>() {
protected void initChannel(NioSocketChannel ch) {
// 组件从流水线头部进入,流水线上的工人按顺序对组件进行加工
// 流水线相当于ChannelPipeline
// 流水线工人相当于ChannelHandler
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
//这个工人有点麻烦,需要我们告诉他干啥事
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println(msg);
}
});
}
})
.bind(8000);
}
}
クライアント:
public class NettyClient {
public static void main(String[] args) throws InterruptedException {
// 不接受新的连接,并且是在父通道类完成一些操作,一般用于客户端的。
Bootstrap bootstrap = new Bootstrap();
// EventLoopGroup包含有多个EventLoop的实例,用来管理event Loop的组件
NioEventLoopGroup group = new NioEventLoopGroup();
//客户端执行
bootstrap.group(group)
// Channel对网络套接字的I/O操作,
// 例如读、写、连接、绑定等操作进行适配和封装的组件。
.channel(NioSocketChannel.class)
// 用于对刚创建的channel进行初始化,
// 将ChannelHandler添加到channel的ChannelPipeline处理链路中。
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) {
// 组件从流水线头部进入,流水线上的工人按顺序对组件进行加工
// 流水线相当于ChannelPipeline
// 流水线工人相当于ChannelHandler
ch.pipeline().addLast(new StringEncoder());
}
});
//客户端连接服务端
Channel channel = bootstrap.connect("127.0.0.1", 8000).channel();
while (true) {
// 客户端使用writeAndFlush方法向服务端发送数据,返回的是ChannelFuture
// 与jdk中线程的Future接口类似,即实现并行处理的效果
// 可以在操作执行成功或失败时自动触发监听器中的事件处理方法。
ChannelFuture future = channel.writeAndFlush("测试数据");
Thread.sleep(2000);
}
}
}