Netty高性能框架详解

基于零拷贝技术,采取IO多用复用技术

基于reactor设计模型

netty实际是对java的NIO的一次封装

JAVA NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

NIO和传统IO(一下简称IO)之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的

IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

Channel

首先说一下Channel,国内大多翻译成“通道”。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。

NIO中的Channel的主要实现有:

FileChannel

DatagramChannel

SocketChannel

ServerSocketChannel

作者:|一见飘红|,原文链接: http://www.imooc.com/article/325532

文章推荐

阿里二面:main 方法可以继承吗?

Python <算法思想集结>之抽丝剥茧聊动态规划

Sentinel流控规则可以这样玩?

Spring大事务到底如何优化?

asp.net6 blazor 文件上传

Redis系列:深刻理解高性能Redis的本质

用python为心爱的人制作520照片墙,已成功做出效果图

探索Snowflake auto clustering 设计

Oracle分组取最大值

【组件封装】改造 Element-UI 多选框组件 (el-check

来实现一个DataStore的封装吧

hive从入门到放弃(六)——常用文件存储格式