上游和下游处理程序如何在Netty中工作......?

问题描述 投票:2回答:2

我是Netty的新手,并不真正理解Netty中处理程序的流程。我想知道的是上游和下游处理程序之间的区别。为什么我们不能像在上游那样拦截下游处理程序中的消息?下游和上游是否与正常情况相同?

java netty
2个回答
7
投票

区别在于处理传入(上游)和另一个传出(下游)。我认为在查看qazxsw poi的javadoc之后,事件/消息流变得更加清晰。

我还应该注意,上游事件只会由IO-Thread触发,因此如果你使用每个ChannelPipeline新的ChannelUpstreamHandler,则不需要在那里同步字段访问。任何线程都可以触发下游事件,因此需要同步对字段的访问。


1
投票

我认为这些想法来自网络堆栈。 Netty的处理程序 - 管道类比类似于OSI网络层堆栈。看一下OSI网络层的外观...... ChannelPipeline

将每个处理程序视为“一个层”,将整个管道视为“一个网络堆栈”,将物理链接视为“IO源”,将用户视为“应用程序逻辑处理程序”。使用相同的管道(堆栈),我们需要做两个功能

  1. 传输数据(当'应用程序逻辑处理程序'希望通过'IO源'执行某些操作时向下发送数据)
  2. 接收数据(发送数据,'IO源'有一些事件,这可能是'应用程序逻辑处理程序'的兴趣)

所以基本上相同的管道必须做两件事(接收消息并发回消息)。让我们考虑一个具体的例子(具有身份验证和加密的服务器),3个处理程序构成一个管道:enter image description here

让我们看看每个接收消息的责任

  1. 加密处理程序 - >需要从'IO Source'接收Example Netty pipeline with 3 handlers,并从上面的流程中的'Application Handler'或'Auth Handler'接收UpstreamEvent
  2. Auth处理程序 - >只需要从“加密处理程序”接收DownstreamEvent
  3. 应用程序处理程序 - >只需要从'Auth Handler'接收UpstreamEvent

因此,从逻辑上讲,每个处理程序都必须实现以下功能:

  1. 加密处理程序 - > UpstreamEventChannelUpstreamHandler
  2. Auth处理程序 - > ChannelDownstreamHandler
  3. 应用程序处理程序 - > ChannelUpstreamHandler

所以如果你有一个ChannelUpstreamHandler,上面提到3个处理程序,

  • 对于传入消息:'IO source'(0)启动ChannelPipeline,Netty将UpstreamEvent转发到(1)然后(2)然后可选地(3),因为所有3都实现了UpstreamEvent
  • 当'Application handler'(3)/'Auth Handler'(2)想要将状态消息发送回客户端时,它将以ChannelUpstreamHandler调用(创建write)启动。 Netty将把DownstreamEvent转发给(1)(只有一个,之前(3)并实施DownstreamEvent)。

因此,给定带有处理程序的管道,当创建ChannelDownstreamHandler时(通过'IO source'),Netty将按顺序从1到n调用管道中的所有处理程序,这已经实现了UpstreamEvent(n是处理程序的数量,在上面的示例中) n = 3)。当创建ChannelUpstreamHandler时(通过用户应用程序代码),Netty将按顺序从n到1调用管道中的所有处理程序,这已经实现了DownstreamEvent。由于类可以实现两个接口,因此处理程序可以是ChannelDownstreamHandlerChannelUpstreamHandler。请注意,所有ChannelDownstreamHandler都是由'IO Source'创建的,所有UpstreamEvent都是由用户应用程序逻辑创建的。

DownstreamEvent的例子:

  1. 收到消息
  2. 渠道开通了
  3. 渠道关闭
  4. 'IO source'引发的异常
  5. 由'IO source'完成写
  6. 频道断开
  7. ...

UpstreamEvent的例子:

  1. 写信给频道
  2. 绑定到一个端口
  3. 连接到服务器地址
  4. ...

希望它能帮助你回答为什么我们需要处理程序的两个行为(上游和下游),netty如何通过q​​azxswpoi和DownstreamEvent解决发送和接收问题。我们如何真正在现实世界的应用程序中使用这些结构。

您的答案在此结束,有关额外内容,您可以在下面继续。

让我们看看每个转发消息的责任:

  1. 应用程序处理程序 - >需要将消息转发到先前的层(应该隐式或显式调用Downstream
  2. Auth处理程序 - >需要将消息转发到先前的层(用于auth失败)和下一层(用于auth成功)。 (应隐式或明确地调用Upstreamctx.sendDownstream(e)
  3. 加密处理程序 - >需要将消息转发到前一层和下一层(应隐式或显式调用ctx.sendDownstream(e)ctx.sendUpstream(e)
© www.soinside.com 2019 - 2024. All rights reserved.