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

文章目录

  • 概念
  • Channel Pipeline实现原理分析
    • 详解 Inbound事件和Outbound事件
    • 演示Code

在这里插入图片描述


概念

在这里插入图片描述

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

请移步  [Netty Review - 探索Pipeline的Inbound和Outbound](https://blog.csdn.net/yangshangwei/article/details/134704751)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/205747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring整合web环境

目录 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 Spring的web开发组件spring-web MVC框架思想及其设计思路 Javaweb三大组件及环境特点 Spring整合web环境的思路及实现 package com.xfy.listener;import com.xfy.config.SpringConfig; import org.springfra…

Scrapy框架中间件(一篇文章齐全)

1、Scrapy框架初识(点击前往查阅) 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件 Scrapy 是一个开源的、基于Python的爬虫框架,它提供了…

业务连续性的实施步骤及价值

业务连续性计划不仅仅是面对灾难时的应急措施,更是一种战略性的投资。通过综合的风险评估、计划制定和实施,企业可以提高对各种风险的适应能力,确保业务在任何情况下都能够持续运营。这种全面的准备不仅有助于应对突发事件,还能为…

【社会网络分析第6期】Ucient实操

一、导入数据处理二、核心——边缘分析三、聚类分析四、网络密度 一、导入数据处理 将数据导入Ucinet首先需要对数据进行处理。 承接上一期的数据格式:【社会网络分析第5期】gephi使用指南 原先得到的数据格式如下: 接下来打开ucinet: 之后…

latex中算法的几种模板

latex中算法的几种模板_latex算法模板-CSDN博客文章浏览阅读6.2k次,点赞3次,收藏45次。latex中几种算法模板_latex算法模板https://blog.csdn.net/weixin_50514171/article/details/125136121?spm1001.2014.3001.5506 latex排版原理 常用算法排版伪代码…

「Linux」使用C语言制作简易Shell

💻文章目录 📄前言简易shell实现shell的概念系统环境变量shell的结构定义内建命令完整代码 📓总结 📄前言 对于很多学习后端的同学来讲,学习了C语言,发现除了能写出那个经典的“hello world”以外&#xff…

43.0BaseDao抽取dao公共父类

43.1. 回顾 1. 把数据库表中查询的结果封装到一个实体类中。 命名规则:类名和表名一致 类中属性和表的字段对应。 表中的一条记录对应实体的一个对象 多条记录→集合 43.2. 正文 目录 43.1. 回顾 43.2. 正文 43.3. 抽取dao公共父类。 43.4. 引入数据源 43.3. 抽取dao公共…

文件夹重命名技巧:用关键词替换文件夹名称指定内容的右侧文字

在日常生活中,经常要管理大量的文件夹,这时候掌握一些文件夹重命名的技巧就非常实用。例如文件夹重命名时,经常要将一些通用的文字替换成其他关键词,以便更好地标识和分类文件夹。而用关键词替换文件夹名称指定内容的右侧文字&…

【论文阅读】1 SkyChain:一个深度强化学习的动态区块链分片系统

SkyChain 一、文献简介二、引言及重要信息2.1 研究背景2.2 研究目的和意义2.3 文献的创新点 三、研究内容3.1模型3.2自适应分类账协议3.2.1状态块创建3.2.2合并过程3.2.3拆分过程 3.3评价框架3.3.1性能3.3.1.1共识延迟3.3.1.2重新分片延迟3.3.1.3处理事务数3.3.1.4 约束 3.3.2 …

使用RobotFramework编写BDD代码

背景 行为驱动开发(Behavior Driven Development)即BDD,是一种敏捷开发方法,通常应用在自动化测试中,或者也可称为行为驱动测试。通过使用自然描述语言确定自动化脚本,通过这种方式,能够大大促…

EI级 | Matlab实现TCN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-BiLSTM-Multihead-…

Openai通用特定领域的智能语音小助手

无穷尽的Q&A 钉钉...钉钉... 双双同学刚到工位,报销答疑群的消息就万马纷沓而来。她只能咧嘴无奈的摇摇头。水都还没有喝一口就开始“人工智能”的去回复。原本很阳光心情开始蒙上一层薄薄阴影。在这无休无止的Q&A中,就算你对工作有磐石一般强硬&#xff0…

XXL-Job详解(一):组件架构

目录 XXL-Job特性系统组成架构图调度模块剖析任务 “运行模式” 剖析执行器 XXL-Job XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 特性 1、简单&#…

探究Kafka原理-6.CAP理论实践

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请&#x1f44…

解决keil右键Go To Definition跳转不过去的问题

解决: 在魔法棒中如图所示打上√

Pycharm新手开发指南

文章目录 前言一、常用功能介绍二、常用高效pycharm使用方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言…

京东秒杀之秒杀实现

1 登录判断 用户在未登录状态下可以查看商品列别以及秒杀商品详情&#xff0c;但不可以在未登录状态进行秒杀商品的操作&#xff0c;当用户点击开始秒杀时&#xff0c;进行登陆验证 <!DOCTYPE html> <head><title>商品详情</title><meta http-eq…

习题补充整理

目录 一、自己封装response 二、在响应头中放数据 HttpResponse redirect ​编辑 render JsonResponse 三、函数和方法区别 ----》绑定方法区别 四、上传图片和开启media访问 五、页面静态化(解决访问率高的问题) 一、自己封装response 第一步&#xff0c;在app01下…

使用vue脚手架创建vue项目

Vue是一个流行的前端框架&#xff0c;可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具&#xff0c;它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目&#xff0c;并选择一些常用的功能和插件…

【JavaFX漏扫开发基础】JavaFx项目基础

文章目录 前言一、创建项目二、运行程序三、application的启动方式和生命周期四、生命周期前言 创建第一个javafx项目,用Idea编辑器来创建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、创建项目 初创项目,第一个javafx的窗口。 依次点击,新建项目 点击Jaca…