当前位置: 首页 > news >正文

Netty入门学习

目录

  • 为什么要学习netty
  • netty学习导图
  • 学习netty前需要知道的知识
    • I/O模型
      • 主要I/O模型
  • netty框架的整体结构
  • netty的逻辑架构
    • 网络通信层
    • 事件调度层
    • 服务编排层

为什么要学习netty

Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架,通过异步、基于事件驱动的IO,用以快速开发高性能、高可靠性的网络IO程序,主要针对在TCP协议下,面向Client端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用。

作为Java后端研发同学,一定都会接触到框架和网络通信,就我接触过并看过源码的开源项目,可以说基本上都是使用Netty作为网络通信的底层框架,如Dubbo、RocketMQ、Canal、otter、HBase等等。
————————————————
版权声明:本文为CSDN博主「西木风落」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenwiehuang/article/details/103937396

netty学习导图

在这里插入图片描述

学习netty前需要知道的知识

I/O模型

I/O请求分为两个阶段:

  • I/O调用阶段:用户进程向内核发起系统调用
  • I/O执行阶段:内核等待I/O请求处理完成并返回

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

主要I/O模型

  • 同步堵塞I/O (BIO)
    在这里插入图片描述

  • 同步非堵塞I/O (NIO)
    在这里插入图片描述

  • I/O多路复用

在这里插入图片描述

  • 信号驱动I/O
    在这里插入图片描述
  • 异步I/O
    在这里插入图片描述

netty的IO模型是基于非堵塞IO,底层实现依赖于JDK NIO的多路复用器Selector

事件处理器(Event Handler)

负责将读写事件分发给对应的读写事件处理器(Event Handler)

Reactor (使用同步IO)和 Proactor (异步IO),主流的事件模型主要使用Reactor 或Epoll

在这里插入图片描述

netty框架的整体结构

在这里插入图片描述
Core核心层
提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API、支持零拷贝的 ByteBuf等

Protocol Support 协议支持层

  • 覆盖了主流协议的编解码实现如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等
  • 支持自定义应用层协议

Transport Service传输服务层

  • 传输服务层提供了网络传输能力的定义和实现方法支持Socket、HTTP隧道、虚拟机管道等传输方式
  • Netty的模块设计具备较高的通用性和可扩展性 支持自定义应用层协议

netty的逻辑架构

在这里插入图片描述

网络通信层

网络通信层的职责是执行网络I/O的操作,支持多种网络协议和I/О模型的连接操作,包括ServerBootstrap,Bootstrap,Channel组件

在这里插入图片描述

  • Bootstrap可用于连接远端服务器,只绑定一个EventLoopGroup (Boss),负责客户端的启动
  • ServerBootStrap 用于服务端启动绑定本地端口,绑定两个EventLoopGroup (Worker),负责服务端的启动

Bootstrap,ServerBootStrap是netty程序的入口

每个服务器中都会有一个Boss,会有一群做事情的 Worker
Boss 会不停地接收新的连接,将连接分配给一个个Worker处理连接
roup
√支持自定义应用层协议

Channel
Channel是网络通信的载体,提供了基本的API用于网络I/О操作
如register、bind、connect、read、write、flush等Netty自己实现的Channel是以JDKNIO Channel为基础的
在这里插入图片描述
Channel会有多种状态,如连接建立、连接注册、数据读写、
连接销毁等

Channel的状态

事件说明
channelRegisteredChannel创建后被注册到EventLoop 上
channelUnregisteredChannel创建后未注册或者从EventLoop取消注册
channelInactiveChannel处于非就绪状态
channelReadChannel可以从远端读取到数据

小结

BootStrap和ServerBootStrap 分别负责客户端和服务端的启动
Channel是网络通信的载体,提供了与底层Socket交互的能力

事件调度层

通过Reactor线程模型对各类事件进行聚合处理通过Selector主循环线程集成多种事件
核心组件包括EventLoopGroup、EventLoop

在这里插入图片描述
在这里插入图片描述
EventLoopGroup是Netty Reactor线程模型的具体实现方式
在这里插入图片描述

服务编排层

在这里插入图片描述

ChannelPipeline负责组装各种ChannelHandler实际数据的编解码以及加工处理操作由ChannelHandler完成

当I/O读写事件触发时,ChannelPipeline会
依次调用ChannelHandler列表对Channel的数据进行拦截和处理

每一个新的Channel会对应绑定一个新的ChannelPipeline(线程安全的);一个ChannelPipeline关联一个EventLoop一个EventLoop仅会绑定一个线程

ChannelPipeline入站和出站

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

在这里插入图片描述

channel和ChannelPipeline的关系
在这里插入图片描述

ChannelHandlerContext的作用

  • 保存ChannelHandler上下文
  • 实现ChannelHandler之间的交互,包含ChannelHandler生命周期的所有事件
    如connect、bind、read、flush、write、close等

组件之间的协作
在这里插入图片描述

小结

  • Bootstrap负责客户端或服务端的启动工作,包括创建、初始化Channel等
  • EventLoop负责向注册的Channel发起I/O读写操作
  • channelPipeline负责ChannelHandler的有序编排

相关文章:

Netty入门学习

目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架…...

代客泊车对HUT功能交互规范

目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统(环视和超声波雷达)...…...

mysql的update_time

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下: DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...

避免安装这5种软件,手机广告频繁弹窗且性能下降

在我们使用手机的日常生活中,选择合适的应用软件对于保持良好的使用体验至关重要。然而,有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序,我们应该尽量避免安装它们。 首先第一种&#xf…...

kafka-事务

1. 事务的5个API // 1初始化事务 void initTransactions();// 2开启事务 void beginTransaction() throws ProducerFencedException;// 3在事务内提交已经消费的偏移量&#xff08;主要用于消费者&#xff09; void sendOffsetsToTransaction(Map<TopicPartition, OffsetAn…...

【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)

阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程&#xff0c;但是我没在界面看到有vnc连接&#xff0c;后面才发现官网有教程。 其实官网很详细了&#xff0c;不过这里还是…...

Python 扩展 快捷贴士:os模块下的创建目录的方式

Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建多层目录。 如果子目录创建失败或者已经存在&#xff0c;会抛出一个 OSError 的异常&#xff0c;Windows上Error 183 即为目录已经存在的异常错误。 如果第一个参数 path 只有一级&#xff0c;即只创建一层目…...

Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明

目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 介绍 恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积…...

redis缓存雪崩和缓存击穿

目录 缓存雪崩 解决方案&#xff1a; 缓存击穿 ​解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …...

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…...

ubuntu 硬盘操作

查看移动硬盘的文件系统名 以及空间使用情况 df -hl查看硬盘的格式类型&#xff0c;以及挂载位置 df -T挂载硬盘 fdisk -l #查看磁盘信息 mount -o rw /dev/sdb1 /home/test # 挂载硬盘-o 指定挂载文件系统时的选项 ro 以只读方式挂载 rw 以读写方式挂载 注意&#xff1a;…...

C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose

1、垃圾回收器GC GC&#xff08;Garbage Collection)是.NET中的垃圾回收器。以应用程序的root为基础&#xff0c;遍历应用程序在Heap上动态分配的所有对象&#xff0c;通过识别它们是否被引用&#xff0c;来确定哪些对象是已经死亡的&#xff0c;哪些仍需要被使用。已经不再被…...

第20周 服务容错-Hystrix

RabbitMQ 安装 1. 首先在Linux上进行一些软件的准备工作&#xff0c;yum下来一些基础的软件包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel 2. 下载RabbitMQ所需软件包&#xff08;本神在这里使用的是 RabbitM…...

浏览器不同源的页面之间如何跨域通信

目录 1&#xff0c;需求2&#xff0c;难点3&#xff0c;思路浏览器不同源的页面之间如何跨域通信&#xff1f; 4&#xff0c;实现第1版第2版最终版其他的问题1&#xff0c;页面路径需完全一致。2&#xff0c;事件注册问题 1&#xff0c;需求 现在有2个项目&#xff0c;页面路径…...

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中&#xff0c;部…...

HOT78-跳跃游戏

leetcode原题链接&#xff1a;跳跃游戏 题目描述 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输…...

HDFS中的NAMENODE元数据管理(超详细)

元数据管理 元数据是什么元数据管理概述内存元数据元数据文件fsimage内存镜像文件edits log编辑日志 namenode加载元数据文件顺序 元数据管理相关目录文件元数据相关文件VERSIONseen_txid 元数据文件查看&#xff08;OIV,OEV&#xff09;SecondaryNameNode介绍checkpoint机制SN…...

区块链实验室(14) - 编译FISCO-BCOS

FISCO-BCOS是一种区块链平台&#xff0c;与Hyperledger和Ethereum有些不同&#xff0c;详见FISCO BCOS 区块链 编译FISCO BCOS源码的目的是修改或者新增其中功能模块&#xff0c;进行对比实验&#xff0c;验证新想法、新创意的效果。编译的步骤很简单&#xff0c;按技术文档一…...

for(auto iter:vec) 及 for(auto iter:vec) 的典型用法

【算法知识点】C11 标准引入了 auto 类型说明符。它通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。 一、for(auto iter:vec) 的典型用法 #include <bits/stdc.h> using namespace std;int main(){string s;cin>>s;for(auto t:s){cout<<…...

【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中,input.value.focus无法聚焦问题

【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中&#xff0c;input.value.focus无法聚焦问题 此次项目遇到了两个问题&#xff0c;一个是在Vue3中el-input的input.value.focus()无法触发&#xff0c;但是在PC或者安卓均可触发。 // 解决方案 // 单纯的触发input.val…...

CANN/hccl参数面建链阶段故障诊断

参数面建链阶段 【免费下载链接】hccl 集合通信库&#xff08;Huawei Collective Communication Library&#xff0c;简称HCCL&#xff09;是基于昇腾AI处理器的高性能集合通信库&#xff0c;为计算集群提供高性能、高可靠的通信方案 项目地址: https://gitcode.com/cann/hcc…...

终极指南:5分钟在Windows上安装安卓APK文件,无需模拟器

终极指南&#xff1a;5分钟在Windows上安装安卓APK文件&#xff0c;无需模拟器 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否厌倦了笨重的安卓模拟器&#xff…...

3行代码实现语音检索:用FunASR从10万段音频中精准定位关键信息

3行代码实现语音检索&#xff1a;用FunASR从10万段音频中精准定位关键信息 【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-proc…...

新手也能看懂的CTF靶场通关笔记:从.htaccess上传到SUID提权,手把手复现BUUCTF Week5

新手也能看懂的CTF靶场通关笔记&#xff1a;从.htaccess上传到SUID提权&#xff0c;手把手复现BUUCTF Week5 第一次接触CTF比赛时&#xff0c;看到那些复杂的漏洞利用链总有种"看天书"的感觉。直到自己动手在虚拟机里复现了整个攻击流程&#xff0c;才真正理解每个技…...

零基础转专业计算机机试,我用这5道题帮你摸清浙工大出题套路(附C++代码)

零基础转专业计算机机试&#xff1a;5道真题破解浙工大出题密码&#xff08;附C实战代码&#xff09; 第一次面对计算机转专业机试时&#xff0c;我盯着屏幕上闪烁的光标&#xff0c;手指悬在键盘上方却不知从何下手。那种面对陌生题型的茫然感&#xff0c;至今记忆犹新。现在作…...

XC7Z010-2CLG400I Xilinx Zynq-7000 FPGA

XC7Z010-2CLG400I 可以理解为一颗“ARM 处理器 FPGA 可编程逻辑”合在一起的 SoC。它属于 Xilinx (赛灵思 AMD &#xff09;Zynq-7000 家族里的 Z-7010 器件&#xff0c;核心特点就是把 双核 Arm Cortex-A9 MPCore 处理系统&#xff08;PS&#xff09; 和 7 系列可编程逻辑&am…...

Fast-GitHub架构解析:基于Manifest V3的浏览器扩展网络加速方案

Fast-GitHub架构解析&#xff1a;基于Manifest V3的浏览器扩展网络加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 技术架…...

DLSS Swapper:免费开源的游戏性能优化终极解决方案

DLSS Swapper&#xff1a;免费开源的游戏性能优化终极解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为PC游戏玩家设计的免费开源工具&#xff0c;它能够智能管理、下载和替换游戏中的DL…...

AI微型赛车:从车道线检测到PID控制,手把手实现端侧自动驾驶

1. 项目概述&#xff1a;当AI遇见指尖上的速度与激情最近在创客圈和AI应用领域&#xff0c;一个结合了硬件、软件与智能算法的项目正悄然兴起&#xff0c;那就是“AI驱动的自动微型赛车”。这听起来像是科幻电影里的场景&#xff0c;但如今&#xff0c;借助开源硬件和成熟的机器…...

为什么你的Perplexity症状查询总返回模糊答案?——解析LLM医学知识蒸馏偏差、实体链接断层与实时性衰减问题

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity症状查询功能的临床价值与典型失效场景 Perplexity症状查询功能在临床决策支持系统中承担着语义级症状归一化与鉴别诊断初筛的关键角色。它通过将患者自然语言描述&#xff08;如“饭后右上腹闷胀、…...