ホームページ  >  記事  >  バックエンド開発  >  Java バックエンド開発: Netty を使用した高性能 API サーバーの実装

Java バックエンド開発: Netty を使用した高性能 API サーバーの実装

WBOY
WBOYオリジナル
2023-06-17 11:04:481740ブラウズ

近年、インターネット技術の急速な発展に伴い、サーバー側における高性能、高同時実行性、高可用性への要求はますます高まっており、高性能、非同期、ノンブロッキングのネットワーク通信フレームワークとして, 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。