前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty Review - 探索Channel和Pipeline的内部机制

Netty Review - 探索Channel和Pipeline的内部机制

作者头像
小小工匠
发布2023-12-01 10:00:44
1390
发布2023-12-01 10:00:44
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
在这里插入图片描述
在这里插入图片描述

概念

在这里插入图片描述
在这里插入图片描述

Netty中的ChannelPipeline是其核心概念,它们在构建高性能网络应用程序时起着重要作用。

Channel: 在Netty中,Channel表示一个开放的连接,可以执行读取/写入操作。Channel可以是网络套接字,文件,或者任何可以进行I/O操作的实体。每个Channel都与一个EventLoop相关联,它负责处理所有I/O事件和任务。Channel提供了异步的I/O操作,可以通过注册关注的事件来触发。

Pipeline: Pipeline是一个处理I/O事件或执行业务逻辑的组件链。它由一系列ChannelHandler组成,每个ChannelHandler都负责处理特定类型的事件。当数据通过Channel时,它会在Pipeline中流动,每个ChannelHandler都有机会处理它。

内部机制:

  1. Channel:
    • Channel内部包含一个Pipeline
    • 当一个Channel被创建时,会创建一个新的Pipeline实例。
    • Channel的生命周期与Pipeline密切相关,一个Channel的事件将在其关联的Pipeline中被处理。
  2. Pipeline:
    • Pipeline是由一系列ChannelHandler按顺序组成的。
    • 数据在Pipeline中流动,每个ChannelHandler按照添加的顺序逐个处理数据。
    • 每个ChannelHandler都可以拦截并处理入站(Inbound)或出站(Outbound)事件,例如数据读取、数据写入等。
  3. 事件传播:
    • 当事件通过Channel时,它将被传播到关联的Pipeline
    • 事件首先通过ChannelPipeline中的第一个ChannelHandler,然后依次传播到链中的下一个ChannelHandler
    • ChannelHandler可以拦截并处理特定类型的事件,也可以将事件传递给下一个ChannelHandler
  4. ChannelHandlerContext:
    • ChannelHandlerContextChannelHandlerPipeline以及Channel之间的桥梁。
    • 每个ChannelHandler都有一个关联的ChannelHandlerContext,它提供了访问PipelineChannel的方法。

Netty中的Channel代表一个开放的连接,而Pipeline是一个处理I/O事件的链。

Channel的生命周期与Pipeline紧密相连,数据通过Pipeline中的ChannelHandler逐个处理。

事件传播通过ChannelHandlerContext实现,使得每个ChannelHandler都可以对事件进行处理或传递给下一个处理器。


Channel概念与java.nio.channel概念一致,用以连接IO设备(socket、文件等)的纽带。

在这里插入图片描述
在这里插入图片描述

Netty的Channel可以这么分类

Channel的IO类型主要有两种:

  • 非阻塞IO(NIO)
  • 阻塞IO(OIO);

数据传输类型有两种:

  • 按事件消息传递(Message)
  • 按字节传递(Byte)

适用方类型也有两种:

  • 服务器(ServerSocket)
  • 客户端(Socket)

还有一些根据传输协议而制定的的Channel,如:

  • TCP
  • UDTP
  • SCTP等
在这里插入图片描述
在这里插入图片描述

Netty按照类型逐层设计相应的类。最底层的为抽象类AbstractChannel,再以此根据IO类型、数据传输类型、适用方类型实现。类图可以一目了然,如上图


Channel Pipeline实现原理分析

在这里插入图片描述
在这里插入图片描述

首先,想象一下Channel就像是通道,它提供了一些操作方法,比如读(read)和写(write)。但它并不是直接执行这些操作,而是通过一个叫做Pipeline的东西来实现的。

现在,Pipeline可以看作是一条连接了很多小工具的长链。每个小工具被称为Handler,它们负责处理网络通信中的不同任务,比如数据的编码、解码和其他处理。

这个链的结构可以看作是一个双向链表,每个节点是一个处理器。内部代码实现的流程是从头(Head)到尾(Tail)的顺序,对于传入数据,或者从尾(Tail)到头(Head)的顺序,对于传出数据。


详解 Inbound事件和Outbound事件

Inbound事件和Outbound事件是两种类型的事件,根据触发事件的源头进行区分

https://stackoverflow.com/questions/22354135/in-netty4-why-read-and-write-both-in-outboundhandler

在这里插入图片描述
在这里插入图片描述

Inbound指网络数据从外部进入Netty过程,也就是数据的输入。当Nettyt收到外部的数据,就会调用Inbound相关方法来处理数据。例如,当Netty收到一个新的连接请求时,就会调用Inbound#channelActive方法来处理这个连接请求。另外,当Netty接收到一个数据包时,就会调用Inbound#channelRead方法来处理这个数据包。

outbound指网络数据从Netty出到外部的过程,也就是数据的输出。当Netty 要向外部发送数据时,就会调用Outbound 相关方法来处理数据。例如,当Netty 要向外部发送一个数据包时,就会调用Outbound#write法来将数据包写入输出缓冲区。另外,当Netty需要关闭一个连接时,就会调用outboundc#lose方法来关闭连接。

演示Code

代码语言:javascript
复制
请移步  [Netty Review - 探索Pipeline的Inbound和Outbound](https://blog.csdn.net/yangshangwei/article/details/134704751)
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📷
  • 概念
  • Channel Pipeline实现原理分析
    • 详解 Inbound事件和Outbound事件
      • 演示Code
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档