当前位置: 首页 > 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的有序编排
http://www.lryc.cn/news/110787.html

相关文章:

  • 代客泊车对HUT功能交互规范
  • mysql的update_time
  • 避免安装这5种软件,手机广告频繁弹窗且性能下降
  • kafka-事务
  • 【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)
  • Python 扩展 快捷贴士:os模块下的创建目录的方式
  • Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
  • redis缓存雪崩和缓存击穿
  • 计算机网络(5) --- http协议
  • ubuntu 硬盘操作
  • C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose
  • 第20周 服务容错-Hystrix
  • 浏览器不同源的页面之间如何跨域通信
  • 【云原生】K8S二进制搭建三:高可用配置
  • HOT78-跳跃游戏
  • HDFS中的NAMENODE元数据管理(超详细)
  • 区块链实验室(14) - 编译FISCO-BCOS
  • for(auto iter:vec) 及 for(auto iter:vec) 的典型用法
  • 【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中,input.value.focus无法聚焦问题
  • 【2023】华为OD机试真题Java CC++ Python JS Go-题目0257-增强的strstr
  • Android 解析ping回复包
  • 在外地ssh远程连接家里ubuntu服务器(Coplar内网穿透)
  • windows创建占用特定端口程序
  • 【uniapp 定位获取详细位置】
  • 后端进阶之路——万字总结Spring Security与数据库集成实践(五)
  • mysql8查看执行sql记录历史,配置开启sql历史日志general_log
  • git 版本控制与合并
  • 【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>
  • 微信小程序真机防盗链referer问题处理
  • SpringBoot集成Redisson实现延迟队列