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

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...