ホーム>source

私はNettyを初めて使用するので、クライアントからの要求を受信し、要求を別のサーバーに転送してから、元の要求の応答に応答をコピーする単純なhttpプロキシサーバーを作成するために使用しています。もう1つの要件は、タイムアウトをサポートできることです。これにより、プロキシされたサーバーが応答するのに時間がかかりすぎる場合、プロキシはそれ自体で応答し、プロキシされたサーバーへの接続を閉じます。

Jettyを使用してそのようなアプリケーションを既に実装しましたが、Jettyを使用すると、インバウンド要求がブロックされないようにするために多くのスレッドを使用する必要があります(これは、メモリまたはCPUをほとんど使用しない軽量のアプリですが、プロキシされたサーバーのレイテンシはトラフィックのバーストがプロキシサーバーでのキューイングを引き起こすか、必要なスレッドが多すぎるほどの高さ)。

私の理解によると、Nettyを使用して、各ステージが少量の計算を実行するパイプラインを構築し、それをスレッドから解放して、パイプラインの次のステージでデータを実行する準備ができるまで待機します。

私の質問は、そのようなアプリケーションの簡単な例はありますか?これまでのところ、基本的なNettyチュートリアルのサーバーコードを単純に変更していますが、クライアントのサポートがすべて不足しています。 nettyクライアントのチュートリアルを見ましたが、2つのコードを混合して単純なプロキシアプリを作成する方法がわかりません。

<前>ウィズウィズ public static void main(String[] args) throws Exception { ChannelFactory factory = new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ServerBootstrap bootstrap = new ServerBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() { return Channels.pipeline( new HttpRequestDecoder(), new HttpResponseEncoder(), /* * Is there something I can put here to make a * request to another server asynchronously and * copy the result to the response inside * MySimpleChannelHandler? */ new MySimpleChannelHandler() ); } }); bootstrap.setOption("child.tcpNoDelay", true); bootstrap.setOption("child.keepAlive", true); bootstrap.bind(new InetSocketAddress(8080)); } private static class MySimpleChannelHandler extends SimpleChannelHandler { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { HttpRequest request = (HttpRequest) e.getMessage(); HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); response.setContent(request.getContent()); Channel ch = e.getChannel(); ChannelFuture f = ch.write(response); f.addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) { Channel ch = future.getChannel(); ch.close(); } }); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { e.getCause().printStackTrace(); Channel ch = e.getChannel(); ch.close(); } }
あなたの答え
  • 解決した方法 # 1

    Nettyの上に書かれているので、LittleProxyがどのように実行されたかを確認する必要があります。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ android - 上記のすべてのアクティビティ(特定のアクティビティを含む)を閉じることにより、スタックの中央から特定のアクティビティを再起動します