2013-03-28 8 views
5

Ich bin neu bei Netty, und ich versuche es zu verwenden, um einen einfachen HTTP-Proxy-Server zu erstellen, der Anforderungen von einem Client empfängt, die Anforderungen an einen anderen Server weiterleitet und die Antwort dann zurück an die Antwort für die ursprüngliche Anforderung kopiert. Eine zusätzliche Anforderung ist, dass ich eine Zeitüberschreitung unterstützen kann. Wenn der Proxyserver zu lange braucht, um zu antworten, antwortet der Proxyserver von selbst und schließt die Verbindung zum Proxyserver.Einfache Möglichkeit, Netty zu verwenden, um einen HTTP-Proxy-Server zu erstellen?

Ich habe bereits eine solche Anwendung mit Jetty implementiert, aber mit Jetty muss ich zu viele Threads verwenden, um eingehende Anfragen blockiert zu halten (dies ist eine leichte App, die sehr wenig Speicher oder CPU verwendet, aber die Latenz von der Proxy-Server ist hoch genug, dass der Datenverkehr im Datenverkehr unterbrochen wird, weil er sich entweder im Proxy-Server einreiht oder zu viele Threads benötigt).

Nach meinem Verständnis kann ich Netty verwenden, um eine Pipeline zu erstellen, in der jede Stufe eine kleine Menge an Berechnungen durchführt, dann gibt es den Thread frei und wartet, bis die Daten für die nächste Stufe in der Pipeline bereit sind.

Meine Frage ist, gibt es ein einfaches Beispiel für eine solche Anwendung? Was ich bisher habe, ist eine einfache Modifikation des Server-Codes für das grundlegende Netty-Tutorial, aber es fehlt jegliche Unterstützung für einen Client. Ich habe das Netty-Client-Tutorial gesehen, bin mir aber nicht sicher, wie ich Code aus den beiden mischen kann, um eine einfache Proxy-App zu erstellen.

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(); 
    } 
} 

Antwort

4

Sie würden bei LittleProxy schauen, um zu sehen, wie sie es tat, wie es oben auf Netty geschrieben.

+1

Die Verbindung ist unterbrochen –

Verwandte Themen