Netty

本文介绍了BIO、NIO、AIO三种IO模型的区别,重点阐述了Netty在NIO基础上的改进,包括Reactor响应式编程、ByteBuf操作、编码解码、粘包处理、心跳检测以及其核心的主从Reactor线程模型和内存管理。
摘要由CSDN通过智能技术生成


代码地址:https://github.com/JinZhengjuner/netty

1.BIO、NIO、AIO

1.1BIO(Blocking IO)

在这里插入图片描述

在这里插入图片描述

1.2 NIO

1.2.1 NIO入门班版本在这里插入图片描述

同一时间没法支持太多的链接
资源紧张,线程切换多

1.2.2 NIO升级版,加入selector

selctor的创建会根据操作系统不同创建不同的selector,I/O多路复用底层主要用的Linux 内核函数epoll来实现(操作系统中断概念),Redis就是典型的基于epoll的NIO线程模型(nginx也是)
Linux man命令:打印出这个linux命令的描述
在这里插入图片描述
在这里插入图片描述

1.3 AIO(异步非阻塞)

基本不用这个AIO
同步意思链接accpet,接受数据都是自己干
在这里插入图片描述

  • netty为什么不在aio的基础上开发?

在Linux系统上,AIO的底层实现仍使用Epoll,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层不容易深度优 化,Linux上AIO还不够成熟。Netty是异步非阻塞框架,Netty在NIO上做了很多异步的封装。

2.Netty基础概念

NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 SocketChannel、
ByteBuffer等。
开发工作量和难度都非常大: 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处 理等等。
Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。且Netty拥有高性能、 吞吐量更高,延迟更 低,减少资源消耗,最小化不必要的内存复制等优点。

2.1 Reactor响应式编程

在这里插入图片描述

2.2 ByteBuf

在这里插入图片描述

2.3 Netty编码解码

在这里插入图片描述
传输对象使用protostuff

2.4 Netty粘包拆包

黏包就是不同的消息合到一起了
拆包时大的被拆成小的了

Netty提供了多个解码器,可以进行分包的操作,一般使用长度,如下:
LineBasedFrameDecoder (回车换行分包)
DelimiterBasedFrameDecoder(特殊分隔符分包)
FixedLengthFrameDecoder(固定长度报文来分包)
一般也可以自定义,详情见代码

2.5 Netty心跳检测机制

长连接、短连接:长连接就是连接后不断开、
在这里插入图片描述

3.Netty核心

在这里插入图片描述

  • 主从Reactor线程模型
  • NIO多路复用非阻塞
  • 无锁串行化设计思想

通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间 不进行线程切换,这样就避免了多线程竞争和同步锁。

  • 支持高性能序列化协议
  • 零拷贝(直接内存的使用)
    在这里插入图片描述

元空间用的也是堆外内存
直接内存申请较慢,但访问效率高。
分配直接内存,会判断直接内存是否充足,若不足,会进行一个fullGc(可能清楚掉使用直接内存的对象),若还是不足,会抛java.lang.OutOfMemoryError。 直接内存大小默认是和堆内存一样大,可通过-X:MaxDirectMemorySize=参数指定直接内存最大可分配空间
在这里插入图片描述

  • ByteBuf内存池设计

内存不一定是连续的,对于需要较大的空间空间,可能很耗时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值