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

时间:2012-02-21 08:26:32

标签: java netty

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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

  1. 传输数据(向下发送数据,当'应用程序逻辑处理程序'希望通过'IO源'执行某些操作时)
  2. 接收数据(向上发送数据,当'IO source'有某些事件时,可能是'应用程序逻辑处理程序'的兴趣)
  3. 所以基本上相同的管道必须做两件事(接收消息并发回消息)。让我们考虑一个具体的例子(具有身份验证和加密的服务器),3个处理程序创建一个管道: Example Netty pipeline with 3 handlers

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

    1. 加密处理程序 - >需要在上述流程中从“IO Source”和“Application Handler”或“Auth Handler”中的UpstreamEvent接收DownstreamEvent
    2. 验证处理程序 - >需要仅从“加密处理程序”接收UpstreamEvent
    3. 应用程序处理程序 - >需要仅从“Auth Handler”接收UpstreamEvent
    4. 因此,从逻辑上讲,每个处理程序都必须实现以下内容:

      1. 加密处理程序 - > ChannelUpstreamHandlerChannelDownstreamHandler
      2. 验证处理程序 - > ChannelUpstreamHandler
      3. 应用程序处理程序 - > ChannelUpstreamHandler
      4. 所以如果你有一个ChannelPipeline,上面提到了3个处理程序,

        • 对于传入消息:'IO source'(0)启动UpstreamEvent,Netty会将UpstreamEvent转发到(1)然后转移(2)然后转发(3),因为所有3个已经实现{ {1}}。
        • 当'应用程序处理程序'(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. ...
        8. UpstreamEvent的例子:

          1. 将信息写入频道
          2. 绑定到端口
          3. 连接到服务器地址
          4. ...
          5. 希望它能帮助您解答为什么我们需要两个处理程序行为(上游和下游),netty如何通过DownstreamEventDownstream解决发送和接收问题。我们如何在现实世界的应用程序中真正使用这些结构。

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

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

            1. 应用程序处理程序 - >需要将消息转发到以前的层(应该隐式或明确地调用Upstream
            2. 验证处理程序 - >需要将消息转发到先前的层(用于auth失败)和下一层(用于auth成功)。 (应隐式或明确地致电ctx.sendDownstream(e)ctx.sendDownstream(e)
            3. 加密处理程序 - >需要将消息转发到上一层和下一层(应隐式或明确地调用ctx.sendUpstream(e)ctx.sendDownstream(e)