韩顺平netty学习笔记

I/O 型基本说明

1) I/O 型简单的理解 就是 用什么样的通 行数据的发送和接收,很 大程度上决定 序通信的
2) Java共支持3种网络编程 /IO 模式: BIO NIO AIO
3) Java BIO : 同步并阻 ( 传统阻塞型 ) 服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开 简单示意图
4) Java NIO 同步非阻塞 ,服务器实现模式为一个线程处理多个请求 ( 连接 ) ,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理 简单示意图
5) Java AIO(NIO.2) 异步非阻塞 AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用
 

BIONIOAIO适用场景分析

1) BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中, JDK1.4 以前的唯一选择,但程 序简 单易理解
2) NIO 方式适用于 连接数目多且连接比较短 (轻操作)的架构,比如聊天服务器 幕系统,服务器间通讯等。编 程比较复杂, JDK1.4 开始支持
3) AIO 方式使用于 连接数目多且连接比较长 (重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂, JDK7 开始支持
 
l Java NIO 基本介绍
1) Java NIO 全称 java non-blocking IO ,是指 JDK 提供的新 API 。从 JDK1.4 开始, Java 提供 了一 系列改进的输入 / 输出的新特性,被统称为 NIO( New IO ) ,是 同步非阻塞
2) NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写
3) NIO 有三大核心部分: Channel( 通道 ) Buffer( 缓冲区 ) , Selector( 选择器 )
4) NIO 是 面 冲区 ,或者面向 编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使 用它可以提供 非阻塞 式的高伸缩性网
5)Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而 不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。【 后面有案例说明
6) 俗理解: NIO 是可以做到用一个线程来处理多个操作的。假设有 10000 个请求过来 , 根据实际情况,可以分配 50 或者 100 个线程来处理。不像之前的阻塞 IO 那样,非得分配 10000
7) HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP1.1 大了好几个数量级。
 
韩顺平netty学习笔记
l NIO BIO 的比较
1) BIO 以流的方式处理数据,而 NIO 以块的方式处理数据 , I/O 的效率比流 I/O 高很
2) B IO 是阻 塞的, NIO 是非 阻塞
3) BIO 字节流和字符流 进行操作,而 NIO 基于 Channel( 通道 ) Buffer( 缓冲区 ) 进行操作,数 据总 是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Selector( ) 用于监听多个 通道 的事件(比如:连接请求,数据到达等),因此使用 单个线程就可以监听多个客户端
 
Buffer 基本介绍
1) Buffer 就是一个内存块 , 层是有一个数组
2) 据的读取写入是通过 Buffer, 这个和 BIO , BIO 中要么是输入流,或者是 出流 , 不能双向,但是 NIO Buffer 是可以读也可以写 , 需要 flip 方法 换channel 是双向的 , 可以返回底层操作系统的情况 , 比如Linux , 底层的操作系统通道就是双向的 .

冲区(Buffer):缓冲区本质上是一个可读写据的内存块,可以理解成是一个器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer如图:  【后面举例说明

l(Channel) 

1)NIO的通道类似于流,但有些区别如下:
     •通道可以同时进行读写,而流只能读或者只能写
     •通道可以实现异步读写数据
     •通道可以从缓冲读数据,也可以写数据到缓冲
2)BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的通道(Channel)是双向的,可以读操作,也可以写操作。
3)Channel在NIO中是一个接口
public interface Channel extends Closeable{}
4)常用的 Channel 类有:FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel。【ServerSocketChanne 类似 ServerSocket , SocketChannel 类似 Socket】
5)FileChannel 用于文件的数据读写,DatagramChannel 用于 UDP 的数据读写,ServerSocketChannel 和 SocketChannel 用于 TCP 的数据读写。

l Selector ( 选择器 )

1)Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,就会使用到Selector(选择器)
2)Selector 能够检测多个注册的通道上是否有事件发生(注意:多个Channel以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求
3)只有在 连接/通道 真正有读写事件发生时,才会进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程
4)避免了多线程之间的上下文切换导致的开销

韩顺平netty学习笔记

韩顺平netty学习笔记

韩顺平netty学习笔记

韩顺平netty学习笔记

 零拷贝的再次理解

1) 们说零拷贝,是从 操作系统的角度来说的 。因为内核缓冲区之间,没有数据是重复的(只有 kernel buffer 有一份数 据)。
2) 拷贝不仅仅带来更少的数据复制,还能带来其他的性能优势,例如更少的上下文切换,更少的 CPU 缓存伪共享以及无 CPU 校验和计算。

 

lJava AIO 基本介绍
1) JDK 7 引入了 Asynchronous I/O ,即 AIO 。在进行 I/O 编程中,常用到两种模式: ReactorProactor Java NIO 就是 Reactor 当有事件触发时,服务器端得到通知,进行相应的处理
2) AIO NIO2.0 ,叫做异步不阻塞的 IO AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用
3) 目前 AIO 还没有广泛应 用, Netty 也是基于 NIO, 而不是 AIO 此我们就不详解 AIO 了,有兴趣的同学可以参考 << Java 新一代网络编程模型 AIO 原理及 Linux 系统 AIO 介绍 >>  http :// www.52im.net/thread-306-1-1.html 
 
 

 

BIO

NIO

AIO

IO 模型

同步阻塞

同步非阻塞(多路复用)

异步非阻塞

编程难度

简单

复杂

复杂

可靠性

吞吐量

l 原生 NIO 存在的问题
1) NIO 的类库和 API 繁杂,使用麻烦 :需 要熟练掌握 Selector ServerSocketChannel SocketChannel ByteBuffer
2) 要具备其他的额外技 能: Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程 网络 程非常熟悉,才能编写出高质量的 NIO 程序
3) 发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异 常流 的处理等 等。
4) JDK NIO Bug :例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100% 。直 JDK 1.7 版本该问题仍旧存在 ,没 有被根本解决。

 

l Netty 的优点

Netty JDK 自带的 NIO API 进行了封装,解决了上述问题。

1) 计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket ;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程 .
2) 使 用方便:详细记录的 Javadoc ,用户指南和示例;没有其他依赖项, JDK 5 Netty 3.x )或 6 Netty 4.x )就足够了
3) 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
4) 全:完整的 SSL/TLS StartTLS 支持
5) 区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入

 

 

 

 

 

 

============