当前位置: 首页 > 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…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...