【问题标题】:Netty filtering reverse proxyNetty 过滤反向代理
【发布时间】:2016-07-29 16:10:26
【问题描述】:

我正在尝试使用 Netty 4.1 编写高性能反向代理服务器。 我的代码基于Feng-Zihao/protoxNetty Proxy Example 的Java 改编。

我最初在处理 100-CONTINUE 时遇到了一些麻烦,但将 HttpObjectAggregator 添加到我的管道中解决了这个问题。

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

在客户端,请求无限期挂起。 问题是,位于false 的AUTO_READ 似乎阻止了HttpObjectAggregator 完成他的工作,而我的FrontendHandler 只收到channelActive 事件,但从来没有收到channelRead

seems though 我需要它来确保我不会在读取和远程对等连接之间陷入某种竞争状态。

仅供参考,我的最终目标是根据需要读取完整 http 内容的过滤器(可能是我的 FrontendHandler 之前的新处理程序)选择转发或不转发请求。

我在这里错过了什么吗?

【问题讨论】:

    标签: java proxy netty reverse-proxy


    【解决方案1】:

    当您的出站通道变为活动状态时打开自动读取,并让您的 FrontendHandler 在处理每条消息时将其关闭。然后在您准备好处理另一条消息时再次打开它。

    这将使 HttpObjectAggregator 继续读取尽可能多的消息以创建 FullHttpMessage,然后在 FrontendHandler 正在处理或等待某些客户端写入以调用侦听器时停止向其发送消息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2012-11-03
      相关资源
      最近更新 更多