JAVA中IO相关知识学习

Netty 学习

 

在此之前 想家介绍一下阻塞与同步相关的概念:

    同步:应用阻塞在发送或接受资源的状态,知道数据成功传输或返回失败。

    异步:应用发送或接受数据后立刻返回,实际上对资源的请求或处理是后续进行的。

    阻塞:资源不可用时,IO请求一直阻塞,直到反馈结果(超时或成功)。

    非阻塞:资源不可用时,IO请求直接返回数据不可用的标识。

概括来解释就是 阻塞/非阻塞式获取资源的方式,而同步/异步是指如何处理资源的逻辑设计方式。像ServerSocker的accept 以及InputStream的read 都是阻塞的。


#BIO NIO 简单介绍 作用 区别 原理

 

BIO 就是我们的阻塞IO, NIO 是非阻塞IO。

BIO 这个不需要介绍太多,这个是最常规的实现方式,阻塞的实现会导致线程的资源浪费,一个线程会在一个请求上挂起,这样会浪费掉很多的宝贵线程资源。

    NIO 是JDK 1.4之后提供用来替换NIO 的API,有三大核心组件,分别是 Buffer(缓冲区),Channel(通道),Selector(选择器);通过这三大组件,我们可以实现了高性能网络编程。

    Buffer(缓冲区) :本质是一个可写入内存的内存块,相对于操作数据而言,其提供的方法使用起来更加简单方便。

        Buffer有三个属性:capacity容量,position 位置,limit 限制。

        使用Buffer 需要4个步骤: 1.将数据写入缓冲区 2.调用buffer.flip(),转换读取/写入模式 3.从缓冲区读取数据 4.调用clear()或者compact() 清楚缓冲区。

    Channel(通道):

        用来创建网络连接以及发送数据,Buffer中的数据将通过Channel来出入口来传输/接收。

        和标准的IO Stream相比较:

    • Channel 是双向的,可以在一个Channel下完成读写,如果使用IO Stream,就需要分开读写

    • 非阻塞读取/写入。由于非阻塞的原因,在调用读写方法的时候,我们需要作出额外的判断,防止数据没有准备好就返回了。

    • 始终在读取/写入缓冲区

        刚刚写道在调用Channel的读写方法的时候,我们需要作出额外的判断,而这个判断就是类似如下的代码:

    这就会导致我们的非阻塞Channel 在这个地方发起/接收请求之后,阻塞在数据的读写上,这种做法在意义上讲不是正在的非阻塞,只是阻塞的位置不一样而已,一个Channel依然只能处理一个请求。要解决这个问题,需要使用到Selector。

    使用Selector去检查通道是否已经准备好了,可以进行读取/写入,通过这种方式实现单个线程管理多个通道来管理多个网络连接,实现高性能。

    Selector是一种建立在事件驱动机制上的,线程使用Selector去监听Channel上的不同事件,当事件产生后Selector会通知到对应线程去处理。

    Selector中定义了四种事件:

  1. OP_CONNECT - 连接

  2. OP_ACCEPT - 完成准备

  3. OP_READ - 读取

  4. OP_WRITE - 写入

    按照如下代码进行初始化:

 

    调用selector.select(),阻塞地获取注册的事件(selectNow 不阻塞),加以处理

 

    讲道理,这种方式有点高效率的意思了。看了一下源码...啊,果然没不懂。还想看看这个select 是怎么样做到时间通知的,只知道底层是操作系统的多路复用机制。(推测大概率是将通道放到一个数组里面,然后使用额外线程进行计算判断,得到符合要求的结果就返回)

 

总结一下:

     BIO由于acceptor 阻塞的原因,请求需要线程逐个处理。NIO使用selector带来的时间轮询机制,将Channel注册到Selector上并为其绑定感兴趣的时间,等事件触发的时候就做出对应的操作,实现了一个线程处理多个请求。


    到这里NIO优点也很明显了,一个线程处理多个连接,那么就意味着如果我们用多个线程或者线程池的技术就能处理海量连接。于是基于这个思想,多线程大神 Doug Lea 提出了改进的方案,将接受请求的操作进行多线程化,处理请求也多线程化,甚至分的更细一点点,将处理请求分为读写数据与业务逻辑处理分为两个部分,并且也作也多线程化。下面的他的文章截图:

    

 

    看起来,Reactor 是个很重要的组件,我们会将其作为所有请求过来的入口与分发器,借助它来分发给后面的读写线程, Reactor同时负责网络连接的处理以及数据的接收。

Reactor 也可以分为单Reactor模式 和 多Reactor 模式,多Reactor模式下面会把网络处理和数据分发分给不同的Reactor处理,进一步分散压力。

     可见分散压力的思想 也就是纵向横向两个方向,纵向增加系统层度、层数,功能分割,简化功能,”专病专治“;横向就是集群。

 

 

#Netty是什么,作用

    Netty 是一个高性能、高拓展性的异步驱动的网络应用程序框架,极大地简化了TCP/UDP客户端和服务端开发的网络编程。使用Reactor的佼佼者。

    在Netty中有四个重要的概念:

  1. Reactor线程模型

  2. Netty自定义的Channel,算是增强简化的以通道概念

  3. ChannelPipeline责任链机制,用于事件处理

  4. 内存管理,增强型的ByteBuffer

    官网的结构图:

        Netty 被分为三个模块:

    1. 传输服务

    2. 协议支持:包括Http 、WebSocker、SSL、大文件传输等

    3. 核心模块:包括事件处理模型、API、零拷贝增强Byte Buffer

    

 

 

        


Netty部分尚未完成,将作后续补充

 

#Netty作实现原理 与 BIO NIO  的区别

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值