【发布时间】:2020-05-12 20:35:26
【问题描述】:
我需要实现一个充当透明 HTTP 代理的服务,它需要执行以下操作:
- 接收 HTTP 请求(TLS 已经终止,所以我们在这里只讨论普通 HTTP)
- 向请求添加标头
- 以非阻塞方式将修改后的请求转发到其预期目的地
- 存储/挂起请求以供以后使用
- 当响应返回时,将其返回给调用者。
- 打包响应和请求(隐藏在 #4 中)并以非阻塞方式将它们发送到另一个系统。
阅读 Netty 文档后,我设法将一些非常原始的东西放在一起,它接受来自客户端的 HTTP 请求并返回 HTTP 响应,这在单个服务器管道中使用了以下 Netty 组件:
- HttpServerCodec
- HttpObjectAggregator
-
我写的一个处理程序,它扩展了
ChannelInboundHandlerAdapter,看起来像这样:void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception { try { FullHttpRequest httpRequest = (FullHttpRequest) msg ensureAuditingHeaderIsPresent(httpRequest) ctx.writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)) println("Response written...") } finally { ReferenceCountUtil.release(msg) } }```
这一切都如我所料,导致向客户端返回 200 响应(尽管是空的)。但是,我很难理解我现在可以采用哪种方法来实现 HTTP 请求的转发以及将响应返回给客户端。
我最初的想法是使用异步 HTTP 客户端库,但我觉得我缺少 Netty 内置的一些东西,它可以让我在管道中做到这一点?也许某种出站ChannelOutboundHandlerAdapter?
如您所知,我目前对 Netty 内部的理解非常基础,非常感谢任何指点!
最后一个问题:2015 年的网络实战书还值得一读吗?如果它会完全过时,我不愿意购买它,但它仍然具有相关性,那么可能值得一读?
非常感谢,
艾德
【问题讨论】:
标签: netty