2013-03-28 16 views
5

Jestem nowym użytkownikiem Netty i zamierzam go użyć do utworzenia prostego serwera proxy HTTP, który odbiera żądania od klienta, przekazuje żądania na inny serwer, a następnie kopiuje odpowiedź z powrotem do odpowiedzi na pierwotne żądanie. Jednym dodatkowym wymogiem jest to, że mogę obsłużyć limit czasu, więc jeśli serwer proxy zajmie zbyt dużo czasu, serwer proxy sam zareaguje i zamknie połączenie z serwerem proxy.Prosty sposób na wykorzystanie Netty do zbudowania serwera proxy http?

Aplikację taką zaimplementowałem już za pomocą Jetty, ale z Jetty muszę używać zbyt wielu wątków, aby zablokować żądania przychodzące (jest to lekka aplikacja, która wykorzystuje bardzo mało pamięci lub procesora, ale opóźnienie serwer proxy jest na tyle wysoki, że pęka w ruchu powodując kolejkowanie w serwerze proxy lub wymaga zbyt wielu wątków).

Według mojego zrozumienia, mogę użyć Netty do zbudowania potoku, w którym każdy etap wykonuje niewielką ilość obliczeń, a następnie zwalnia wątek i czeka, aż dane będą gotowe do wykonania kolejnego etapu w instalacji.

Moje pytanie brzmi, czy istnieje prosty przykład takiej aplikacji? To, co do tej pory miałem, to prosta modyfikacja kodu serwera dla podstawowego samouczka Netty, ale brakuje mu obsługi klienta. Widziałem samouczek klienta netty, ale nie jestem pewien, jak połączyć kod z dwóch, aby stworzyć prostą aplikację proxy.

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

Odpowiedz

4

trzeba by spojrzeć na LittleProxy aby zobaczyć, jak oni to zrobili, jak jest napisane na górze Netty.

+1

Link jest uszkodzony –

Powiązane problemy