【发布时间】:2012-03-11 13:40:56
【问题描述】:
我是Netty 的新手,并不真正了解其中的处理程序流程。我想知道的是Upstream 和Downstream 处理程序之间的区别。
- 为什么我们不能像在下游处理程序中那样拦截消息 上游?
- 下游和上游的意思和正常术语一样吗?
【问题讨论】:
我是Netty 的新手,并不真正了解其中的处理程序流程。我想知道的是Upstream 和Downstream 处理程序之间的区别。
【问题讨论】:
不同之处在于一个处理传入(上游)和另一个传出(下游)。
我认为查看ChannelPipeline 的javadoc 后,事件/消息流变得更加清晰。
我还应该注意,上游事件只会由 IO-Thread 触发,因此如果您使用新的 ChannelUpstreamHandler per ChannelPipeline,则无需在其中同步字段访问。下游事件可以由任意线程触发,因此需要同步访问字段。
【讨论】:
我认为这些想法源自网络堆栈。 Netty 的 handler-pipeline 类比类似于 OSI 网络层堆栈。看看 OSI 网络层的样子:
将每个处理程序视为“一层”,将整个管道视为“一个网络堆栈”,将物理链接视为“IO源”,将用户视为“应用程序逻辑处理程序” .使用相同的管道(堆栈),我们需要做两个功能:
所以本质上相同的管道必须做两件不同的事情(接收消息并发送回消息)。
让我们考虑一个具体示例(具有身份验证和加密功能的服务器),由 3 个处理程序组成一个管道:
让我们从接收消息的角度来看看每个人的责任
UpstreamEvent,从“Application Handler”或“Auth Handler”接收DownstreamEvent。UpstreamEvent。UpstreamEvent。因此,从逻辑上讲,每个处理程序都必须实现以下内容:
ChannelUpstreamHandler 和 ChannelDownstreamHandler
ChannelUpstreamHandler
ChannelUpstreamHandler
所以如果你有一个ChannelPipeline,上面提到了 3 个处理程序,
UpstreamEvent,Netty 将把 UpstreamEvent 转发到 (1) 然后 (2) 然后可选地 (3),因为所有 3 都实现了 ChannelUpstreamHandler。
write 调用(创建DownstreamEvent)启动。 Netty 会将DownstreamEvent 转发到(1) (这只是一个,在(3) 之前并实现了ChannelDownstreamHandler)。因此,给定带有 handlers 的 pipeline,当一个 UpstreamEvent 被创建(通过 'IO 源')时,Netty 将依次调用管道中的所有处理程序1 到 n,实现了ChannelUpstreamHandler(n 是处理程序的数量,在上面的示例中 n = 3)。并且当DownstreamEvent被创建(通过用户应用程序代码)时,Netty将依次调用管道中从n到1的所有处理程序,这些处理程序已经实现了ChannelDownstreamHandler .
由于一个类可以实现两个接口,一个处理程序可以是ChannelUpstreamHandler 和ChannelDownstreamHandler。请注意,所有UpstreamEvent 均由“IO 源”创建,所有DownstreamEvent 均由用户应用程序逻辑创建。
UpstreamEvent 的示例:
DownstreamEvent 的示例:
希望它能帮助您回答“为什么我们需要处理程序的两种行为(上游和下游)”、“Netty 如何通过Downstream 和Upstream 解决发送和接收”和“我们如何才能真正在实际应用中使用这些构造”。
你的答案到此结束,更多内容,你可以在下面继续。
让我们看看上述每个处理程序在转发消息方面的责任:
ctx.sendDownstream(e))ctx.sendDownstream(e) 和 ctx.sendUpstream(e))ctx.sendDownstream(e) 和ctx.sendUpstream(e))。【讨论】: