近年、インターネット技術の急速な発展に伴い、サーバー側における高性能、高同時実行性、高可用性への要求はますます高まっており、高性能、非同期、ノンブロッキングのネットワーク通信フレームワークとして, Netty はますます人気が高まっており、開発者の注目と使用。
この記事では、Netty フレームワークを使用して高パフォーマンスの API サーバーを実装する方法を紹介します。
1. Netty とは
Netty は、Java NIO に基づく非同期イベント駆動型ネットワーク アプリケーション フレームワークであり、クライアントなどの高性能、高信頼性のネットワーク通信プログラムを迅速に開発するために使用されます。そしてサーバー側。
そのコアコンポーネントには、バッファ、チャネル、イベントループ、コーデックなどが含まれます。 Buffer は Netty のバッファ コンポーネント、Channel は抽象的なネットワーク通信インターフェイスを提供し、EventLoop は Netty のイベント駆動モデル、Codec はコーデックです。これらのコンポーネントを通じて、Netty フレームワークは、高性能、高同時実行性、低遅延のネットワーク通信機能を提供できます。
2. Netty の基本的な使用方法
まず、Netty の依存関係を導入する必要があります:
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version> </dependency>
次に、Bootstrap オブジェクトを作成し、このオブジェクトを使用してNetty サーバー:
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.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 HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(65536)); pipeline.addLast(new ChunkedWriteHandler()); pipeline.addLast(new HttpServerHandler()); } }); ChannelFuture future = bootstrap.bind(port).sync(); future.channel().closeFuture().sync(); }finally{ bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); }
上記のコードでは、クライアント要求を受信するための BossGroup とクライアント要求を処理するための WorkerGroup という 2 つの EventLoopGroup オブジェクトを作成しました。 ServerBootstrap オブジェクトを介して、通信プロトコル (NioServerSocketChannel)、プロセッサ (ハンドラー)、チャネルの初期化およびその他の操作を含む Netty サーバーのパラメーターを構成します。
上記のコードでは、HTTP リクエストと応答のエンコード、デコード、集計を実装するために HttpServerCodec コンポーネントと HttpObjectAggregator コンポーネントを追加していることもわかります。同時に、ビッグ データ ストリームを処理するための ChunkedWriteHandler も追加しました。
最後に、ポートをバインドし、bootstrap.bind メソッドを通じて Netty サーバーを起動し、メインスレッドをブロックして、future.channel().closeFuture() を通じて Netty サーバーがシャットダウンするのを待ちます。 sync()メソッド。
3. Netty を使用して高性能 API サーバーを実装する
API サーバーの場合、通常、システムの可用性と高パフォーマンスの応答時間を確保しながら、大量のリクエストと応答を処理する必要があります。 。
ここでは、単純な API サーバーの実装を例として、Netty フレームワークを使用して高パフォーマンスの API サーバーを実装する方法を紹介します。
1. インターフェース定義
まず、簡単な API インターフェースを定義しましょう。このインターフェースは、ユーザー情報を取得する機能を実装するために使用されます:
GET /user/{id} HTTP/1.1 Host: localhost:8888
ここで、{id} はuser ID 番号。この ID 番号に基づいてユーザー情報を照会し、クライアントに返す必要があります。
2. ビジネス処理
次に、クライアント リクエスト内の ID 番号に基づいてユーザー情報をクエリし、クエリ結果をクライアントに返すビジネス ロジック処理を実装する必要があります。 。
まず、SimpleChannelInboundHandler から継承するプロセッサ HttpServerHandler を作成しましょう。このプロセッサにビジネス ロジックを実装できます。
public class HttpServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> { @Override protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception { HttpServerRoute route = HttpServerRoute.builder() .addRoute("/user/{id}", new GetUserHandler()) .build(); HttpServerRequest request = new HttpServerRequest(msg); HttpServerResponse response = new HttpServerResponse(ctx, msg); route.route(request, response); } }
ご覧のとおり、上記のコードでは、HttpServerRoute オブジェクトを通じてルート マッチングを実装しています。クライアント要求を受信すると、要求を HttpServerRequest オブジェクトに変換し、その中に応答オブジェクト HttpServerResponse をラップし、HttpServerRoute オブジェクトを通じてルーティング ルールと照合し、要求を対応するプロセッサに分散して処理します。
ユーザー ID に基づいてユーザー情報をクエリするために使用される GetUserHandler プロセッサを実装する必要があります:
public class GetUserHandler implements HttpServerHandlerInterface { @Override public void handle(HttpServerRequest request, HttpServerResponse response) throws Exception { String id = request.getPathParam("id"); //查询用户信息 User user = UserService.getUserById(id); if (user != null) { JSONObject json = new JSONObject(); json.put("id", user.getId()); json.put("name", user.getName()); response.sendJSON(HttpResponseStatus.OK, json.toJSONString()); } else { response.sendError(HttpResponseStatus.NOT_FOUND); } } }
上記のコードでは、ID 番号に基づいてユーザー情報をクエリします。リクエストに含め、JSONObject を使用してリクエスト応答の JSON 文字列データを構築し、最後にクエリ結果をクライアントに返します。
ユーザー情報をクエリする機能を提供するために、UserService クラスも実装する必要があります:
public class UserService { public static User getUserById(String id) { //查询数据库中的用户信息 } }
3. パフォーマンス テスト
最後に、Netty の高いパフォーマンスをテストしましょう。 API サーバーの応答時間と QPS (1 秒あたりの同時リクエスト数) を実装しました。
Apache ab ツールを通じて、複数のクライアントの同時リクエストをシミュレートし、応答時間と QPS 情報に関する統計を収集できます。次のコマンドを使用します:
ab -n 10000 -c 100 -k http://localhost:8888/user/1
パラメータの説明:
-n: リクエストの総数を示します
-c: 同時リクエストの数を示します
-k: キープアライブ接続を有効にすることを示します
テストを通じて、応答時間と QPS 情報を取得できます:
Server Software: Server Hostname: localhost Server Port: 8888 Document Path: /user/1 Document Length: 36 bytes Concurrency Level: 100 Time taken for tests: 3.777 seconds Complete requests: 10000 Failed requests: 0 Keep-Alive requests: 10000 Total transferred: 1460000 bytes HTML transferred: 360000 bytes Requests per second: 2647.65 [#/sec] (mean) Time per request: 37.771 [ms] (mean) Time per request: 0.378 [ms] (mean, across all concurrent requests) Transfer rate: 377.12 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 1.2 2 10 Processing: 3 32 11.3 32 84 Waiting: 3 32 11.3 32 84 Total: 6 34 11.2 34 86 Percentage of the requests served within a certain time (ms) 50% 34 66% 38 75% 40 80% 42 90% 49 95% 55 98% 64 99% 71 100% 86 (longest request)
ご覧のとおり、API サーバーは 100 の同時処理を効果的に処理できます。テストからのリクエスト シミュレーションは 1 秒あたり 2647.65 リクエストを処理でき、平均応答時間はわずか 37.771 ミリ秒です。
4. 概要
上記の紹介と手順を通じて、Netty をネットワーク通信フレームワークとして使用し、それを使用して高性能 API サーバーを開発する方法を学びました。 Netty フレームワークを使用すると、サーバーのパフォーマンスが大幅に向上し、サーバーに高い同時実行性、高い信頼性、低い遅延などの特性が備わります。同時に、Netty フレームワークは高い拡張性と柔軟性も備えており、あらゆるアプリケーションに簡単に統合できます。
Java バックエンド開発テクノロジ スタックの一部として、Netty フレームワークの使用も習得する必要があるスキルの 1 つです。
以上がJava バックエンド開発: Netty を使用した高性能 API サーバーの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。