[英]How does upstream and downstream handlers work in Netty…?
我是Netty 的新手,并不真正了解Netty 中的处理程序流程。 我想知道的是上游和下游处理程序之间的区别。 为什么我们不能像在上游那样拦截下游处理程序中的消息? 下游和上游的意思和正常情况一样吗?
区别在于,一个处理传入(上游),另一个处理传出(下游)。 我认为在查看ChannelPipeline
的 javadoc 后,事件/消息流变得更加清晰。
我还应该注意,上游事件只会由 IO-Thread 触发,因此如果您为每个ChannelPipeline
使用新的ChannelUpstreamHandler
,则无需同步那里的字段访问。 任何线程都可以触发下游事件,因此对字段的访问需要同步。
我认为这些想法来自网络堆栈。 Netty 的处理程序管道类比类似于 OSI 网络层堆栈。 看看 OSI 网络层的样子……
将每个处理程序视为“一层”,将整个管道视为“一个网络堆栈”,将物理链接视为“IO 源”,将用户视为“应用程序逻辑处理程序”。 使用相同的管道(堆栈),我们需要做两个功能
所以本质上相同的管道必须做两件不同的事情(接收消息和发回消息)。 让我们考虑一个具体的例子(一个带有身份验证和加密的服务器),有 3 个处理程序构成一个管道:
让我们来看看每个接收消息的责任
UpstreamEvent
和来自“应用程序处理程序”或“身份验证处理程序”的DownstreamEvent
。UpstreamEvent
。UpstreamEvent
。因此,从逻辑上讲,每个处理程序都必须实现以下内容:
ChannelUpstreamHandler
和ChannelDownstreamHandler
ChannelUpstreamHandler
验证处理程序 --> ChannelUpstreamHandler
ChannelUpstreamHandler
所以如果你有一个ChannelPipeline
,上面提到了 3 个处理程序,
UpstreamEvent
并且 Netty 将UpstreamEvent
转发到 (1) 然后 (2) 然后可选 (3),因为所有 3 个都实现了ChannelUpstreamHandler
。write
调用(创建DownstreamEvent
)。 Netty 会将DownstreamEvent
转发到 (1) (这只是一个,在 (3) 之前并实现了ChannelDownstreamHandler
)。 因此,给定带有处理程序的管道,当创建UpstreamEvent
时(通过 'IO 源'),Netty 将按从 1 到 n 的顺序调用管道中的所有处理程序,这些处理程序已经实现了ChannelUpstreamHandler
(n 是处理程序的数量,在上面的例子中) n = 3)。 当DownstreamEvent
被创建时(通过用户应用程序代码),Netty 将按从 n 到 1 的顺序调用管道中的所有处理程序,这些处理程序已经实现了ChannelDownstreamHandler
。 由于一个类可以实现两个接口,因此处理程序可以是ChannelUpstreamHandler
和ChannelDownstreamHandler
。 请注意,所有UpstreamEvent
均由“IO Source”创建,所有DownstreamEvent
均由用户应用程序逻辑创建。
UpstreamEvent
例子:
DownstreamEvent
例子:
希望它可以帮助您回答为什么我们需要处理程序的两种行为(上游和下游),netty 如何解决通过Downstream
和Upstream
的发送和接收。 我们如何才能真正在实际应用中使用这些构造。
您的回答到此结束,更多内容,您可以继续往下看。
让我们来看看每个转发消息的责任:
ctx.sendDownstream(e)
)ctx.sendDownstream(e)
和ctx.sendUpstream(e)
)ctx.sendDownstream(e)
和ctx.sendUpstream(e)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.