我刚接触 Netty,对其中的handlers流程并不了解。我想知道Upstream
和Downstream
处理器之间的区别。
- 为什么我们不能像在upstream处理器中那样在downstream处理器中拦截消息?
- downstream和upstream在正常情况下的意思是否相同?
ChannelPipeline
的JavaDoc后,事件/消息流变得更加清晰。ChannelUpstreamHandler
,则无需在其中同步字段访问。 下行事件可以由任何线程触发,因此需要同步对字段的访问。我认为这些想法是从网络堆栈中派生出来的。Netty的“handler-pipeline”类比类似于OSI网络层堆栈。看一下OSI网络层的样子:
把每个处理器(handler)看作一个“层”,整个管道(pipeline)看作一个“网络堆栈”,物理链接看作“IO源”,用户看作“应用逻辑处理器”。使用相同的管道(堆栈),我们需要执行两个功能:
因此,基本上相同的管道必须执行两个不同的操作(接收消息并将消息发送回去)。
让我们考虑一个具体的例子(具有身份验证和加密的服务器),由3个处理器组成了一个管道:
让我们来看一下每个接收消息的处理器的职责
因此,从逻辑上讲,每个处理器都必须实现以下内容:
因此,如果您有一个具有上述3个处理程序的ChannelPipeline,则需要执行以下操作:
UpstreamEvent
,Netty将把UpstreamEvent
转发到(1)、(2)、(3),因为它们都实现了ChannelUpstreamHandler
。write
调用(创建DownstreamEvent
)来发起。Netty将把DownstreamEvent
转发到(1)(只有一个,在(3)之前,并且实现了ChannelDownstreamHandler
)。所以在具有处理程序的管道中,当创建UpstreamEvent
时(由'IO源'创建),Netty将按顺序调用从1到n的所有处理程序,这些处理程序都实现了ChannelUpstreamHandler
(在上面的示例中,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)
)。