2016-07-29 31 views
3

Ich versuche, einen High-Performance-Reverse-Proxy-Server mit Netty 4.1 zu programmieren. Ich basierte meinen Code auf einer Java-Anpassung von Feng-Zihao/protox und .Netty Filterung Reverse Proxy

Ich hatte zuerst einige Probleme bei der Verarbeitung von 100-CONTINUE, aber das Hinzufügen der HttpObjectAggregator in meine Pipeline löste das irgendwie.

serverBootstrap 
     .group(bossGroup, workerGroup) 
     .channel(NioServerSocketChannel.class) 
     .handler(new LoggingHandler(LogLevel.DEBUG)) 
     .childHandler(new ChannelInitializer<SocketChannel>() { 
      @Override 
      public void initChannel(SocketChannel ch) throws Exception { 
       ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); 
       ch.pipeline().addLast(new HttpRequestDecoder()); 
       ch.pipeline().addLast(new HttpResponseEncoder()); 
       ch.pipeline().addLast(new HttpObjectAggregator(1048576)); 
       ch.pipeline().addLast(new FrontendHandler()); 
      } 
     }) 
     //   .option(ChannelOption.SO_REUSEADDR, true) 
     //   .option(ChannelOption.SO_BACKLOG, 128) 
     //   .childOption(ChannelOption.SO_KEEPALIVE, true) 
     .childOption(ChannelOption.AUTO_READ, false) 
     .bind(port).sync(); 

Auf der Clientseite, hängt die Anforderung auf unbestimmte Zeit. Die Sache ist, AUTO_READ bei false scheint zu verhindern, dass die HttpObjectAggregator seine Arbeit zu tun und meine FrontendHandler erhält nur die channelActive Ereignis, aber nie die channelRead.

Es seems though, dass ich brauche, um sicherzustellen, dass ich nicht in ein Race-Zustand zwischen den Lese-und der Remote-Peer-Verbindung bekommen.

FYI, mein Ziel am Ende ist zu wählen, um die Anfrage basierend auf einem Filter (wahrscheinlich ein neuer Handler direkt vor meinem FrontendHandler), die den vollständigen http-Inhalt lesen müssen.

Fehle ich hier etwas?

Antwort

2

Aktivieren Sie den automatischen Lesevorgang, wenn Ihr ausgehender Kanal aktiv wird, und lassen Sie ihn während der Verarbeitung jeder Nachricht von Ihrem FrontendHandler ausschalten. Dann schalten Sie es wieder ein, wenn Sie bereit sind, eine weitere Nachricht zu bearbeiten.

Dadurch kann HttpObjectAggregator so viele Nachrichten lesen, wie benötigt werden, um eine FullHttpMessage zu erstellen, und dann keine Nachrichten mehr senden, während der FrontendHandler auf einen Client schreibt oder wartet, um einen Listener aufzurufen.

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    ctx.channel().config().setAutoRead(false); 
    ... 
    // This call should probably be in some event listener 
    ctx.channel().config().setAutoRead(true);