繁体   English   中英

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

[英]How does upstream and downstream handlers work in Netty…?

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

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

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

我认为这些想法来自网络堆栈。 Netty 的处理程序管道类比类似于 OSI 网络层堆栈。 看看 OSI 网络层的样子…… 在此处输入图片说明

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

  1. 传输数据(向下发送数据,当“应用程序逻辑处理程序”想要通过“IO 源”做某事时)
  2. 接收数据(向上发送数据,当“IO 源”有一些事件时,这可能是“应用程序逻辑处理程序”感兴趣的)

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

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

  1. 加密处理程序 --> 需要在上述流程中接收来自“IO 源”的UpstreamEvent和来自“应用程序处理程序”或“身份验证处理程序”的DownstreamEvent
  2. 身份验证处理程序 --> 只需要从“加密处理程序”接收UpstreamEvent
  3. 应用程序处理程序 --> 只需要从“身份验证处理程序”接收UpstreamEvent

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

  1. 加密处理程序 --> ChannelUpstreamHandlerChannelDownstreamHandler
  2. ChannelUpstreamHandler验证处理程序 --> ChannelUpstreamHandler
  3. 应用程序处理程序 --> ChannelUpstreamHandler

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

  • 对于传入消息:'IO source'(0) 启动UpstreamEvent并且 Netty 将UpstreamEvent转发到 (1) 然后 (2) 然后可选 (3),因为所有 3 个都实现了ChannelUpstreamHandler
  • 当“应用程序处理程序”(3)/“身份验证处理程序”(2) 想要将状态消息发送回客户端时,它将启动write调用(创建DownstreamEvent )。 Netty 会将DownstreamEvent转发到 (1) (这只是一个,在 (3) 之前并实现了ChannelDownstreamHandler )。

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

UpstreamEvent例子:

  1. 收到消息
  2. 通道打开
  3. 通道关闭
  4. “IO 源”引发的异常
  5. 写入由“IO 源”完成
  6. 通道断开
  7. ...

DownstreamEvent例子:

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

希望它可以帮助您回答为什么我们需要处理程序的两种行为(上游和下游),netty 如何解决通过DownstreamUpstream的发送和接收。 我们如何才能真正在实际应用中使用这些构造。

您的回答到此结束,更多内容,您可以继续往下看。

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

  1. 应用程序处理程序 --> 需要将消息转发到前一层(应隐式或显式调用ctx.sendDownstream(e)
  2. 身份验证处理程序 --> 需要将消息转发到前一层(身份验证失败)和下一层(身份验证成功)。 (应该隐式或显式调用ctx.sendDownstream(e)ctx.sendUpstream(e)
  3. 加密处理程序 --> 需要将消息转发到上一层和下一层(应隐式或显式调用ctx.sendDownstream(e)ctx.sendUpstream(e)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM