Java-Netty过滤反向代理
作者:互联网
我正在尝试使用Netty 4.1编写高性能的反向代理服务器.
我的代码基于Java改编版Feng-Zihao/protox和Netty Proxy Example.
我首先在处理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();
在客户端,请求无限期挂起.
问题是,AUTO_READ为假似乎阻止HttpObjectAggregator进行工作,而我的FrontendHandler仅接收到channelActive事件,而从未接收到channelRead.
我需要seems though以确保我不会在读取和远程对等连接之间陷入某种竞争状况.
仅供参考,我的最终目的是根据需要读取完整http内容的过滤器(可能是在FrontendHandler之前的新处理程序)选择是否转发请求.
我在这里想念什么吗?
解决方法:
当您的出站通道变为活动状态时,请打开自动读取功能,并让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);
标签:proxy,netty,reverse-proxy,java 来源: https://codeday.me/bug/20191118/2027505.html