インターネットの継続的な発展とアプリケーション分野の継続的な拡大に伴い、ネットワーク アプリケーション開発では高い同時実行性を考慮する必要があることが課題となっており、エンタープライズ レベルのアプリケーション開発で広く使用されている言語として、Java は高度な言語で使用されています。 -同時実行アプリケーションのシナリオ. 以下のパフォーマンスが大きな注目を集めました。 Netty は、近年 Java バックエンド開発の分野で広く使用されている、高性能の非同期イベント駆動型ネットワーク アプリケーション フレームワークです。この記事では、Netty の基本的な概念と使用法を紹介し、高同時実行性の API サーバーの構築を例として、実際のプロジェクトでの Netty のアプリケーションを示します。
1. Netty の概要
Netty は、JBOSS が提供するオープンソースの高性能な非同期イベント駆動型 NIO フレームワークです。高いパフォーマンス、拡張性、柔軟性、簡単な操作などの利点があり、特に高性能ネットワークサーバーの構築において、さまざまな分野で広く使用されています。 Netty のコア コンポーネントは、Channel、EventLoop、ChannelFuture などです。Channel は双方向データ フローを表し、EventLoop はデータ フロー内のイベント (接続、読み取りおよび書き込み操作など) の処理を担当し、ChannelFuture は非同期操作の結果。
Netty のフレームワーク全体は Reactor モードに基づいています。つまり、チャネルでイベントが発生すると、非同期処理のために EventLoop に入れられ、処理が完了した後にアプリケーションに返されます。このアプローチにより、Netty は多数の同時リクエストをサポートし、良好な応答速度を維持できるようになります。
2. Netty アプリケーション
Netty では、次の手順に従って単純な TCP サーバーを構築できます:
1) ServerBootstrap インスタンスを作成し、リスニング ポート、スレッド プール サイズなどの関連パラメータを設定します;
2) ポートをバインドしてサービスを開始します。この時点で、新しいチャネルが作成されます対応する EventLoop に登録されます;
3) チャネル内のイベントの処理ロジックの処理を担当する、新しく作成されたチャネルに ChannelInitializer オブジェクトを追加します。
サンプル コードは次のとおりです。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new EchoServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
Netty では、HTTP プロトコルに基づいたサーバーを簡単に構築することもできます。 HTTP 開発に Netty を使用する場合は、HTTP プロトコルとのデータ交換をサポートするために関連するコーデックを追加する必要があることに注意してください。
サンプルコードは以下のとおりです。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加HTTP请求解码器 pipeline.addLast(new HttpServerCodec()); // 添加HTTP请求内容聚合器(主要是将HTTP消息聚合成FullHttpRequest或FullHttpResponse) pipeline.addLast(new HttpObjectAggregator(64 * 1024)); // 添加自定义的请求处理器 pipeline.addLast(new HttpServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
WebSocketは全二重通信を実現するプロトコルで、直接利用できます。ブラウザ間で通信し、サーバー間で通信します。 Netty では、WebSocket プロトコルを使用してサーバーを構築することもできます。サンプル コードは次のとおりです:
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加HTTP请求解码器 pipeline.addLast(new HttpServerCodec()); // 添加HTTP请求内容聚合器 pipeline.addLast(new HttpObjectAggregator(64 * 1024)); // 添加WebSocket协议处理器 pipeline.addLast(new WebSocketServerProtocolHandler("/websocket")); // 添加自定义的请求处理器 pipeline.addLast(new WebSocketServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
3. Netty の高度な機能
上記の基本的なアプリケーション シナリオに加えて、Nettyまた、多くの高度な機能も提供します。例:
Netty は、TCP、HTTP、WebSocket などの一般的なプロトコルをサポートするだけでなく、開発およびさまざまなカスタム プロトコルのアプリケーション;
Netty が提供するコーデックは、JSON、Protobuf などのさまざまな形式でデータを簡単にエンコードおよびデコードできます。
Netty は、NIO、Epoll などの複数の IO モデルの選択をサポートします。さまざまな伝送方式
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加HTTP请求解码器 pipeline.addLast(new HttpServerCodec()); // 添加HTTP请求内容聚合器 pipeline.addLast(new HttpObjectAggregator(64 * 1024)); // 添加自定义的请求处理器 pipeline.addLast(new RestfulServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
public class UserController { @GET("/user/{id}") public String getUserById(@PathParam("id") int id) { // 查询数据库并返回结果 } @POST("/user") public String createUser(@RequestBody User user) { // 向数据库中插入新用户并返回结果 } @PUT("/user/{id}") public String updateUser(@PathParam("id") int id, @RequestBody User user) { // 更新数据库中指定用户的信息并返回结果 } @DELETE("/user/{id}") public String deleteUser(@PathParam("id") int id) { // 从数据库中删除指定用户并返回结果 } }
以上がJava バックエンド開発: Netty を使用して同時実行性の高い API サーバーを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。