Netty基本概念

Netty是一个提供了易于使用的API的客户端/服务端

并发高 -NIO(非阻塞IO)

传输快 -零拷贝

1.基本概念:

阻塞与非阻塞

线程访问某个资源,该资源是否准备就绪的一种处理方式

阻塞: 线程访问某个资源,这个资源被占用中,会一直等待到这个资源处理完成后进行访问

非阻塞: 线程访问某个资源,当这个资源被占用了,会自动访问下一个资源

同步与异步

同步: 发起请求后,会一直等待这个请求响应后才执行其他操作

异步:发起请求后,在响应返回之前可以继续发起其他请求

举例:

当看完上边阻塞与非阻塞、异步与同步以后 一定会联想到同步和阻塞 异步与非阻塞的区别在哪儿

举一个生活中的例子,假设我现在去上厕所,此时不知道哪一个坑有位置

阻塞: 我询问第一个坑有没有人 有人在 我会一直等待这个人出来为止我再进去

非阻塞: 我询问第一个坑有没有人 有人在 我还会去问下一个坑有没有人

同步:我询问第一个坑有没有人 有人在 此时会一直等待这个人给我响应 告诉我没人了,我再进去(期间不会做其他事情)

异步:我询问第一个坑有没有 有人在 此时我会边玩手机、边抽烟、边和朋友聊天....可以做很多事情 并等待这个坑的人给我响应 告诉我没有人了

同步与阻塞的区别: 阻塞是访问某个资源,发现这个资源正在被别的线程占用的时候,"它不能访问下一个资源",而同步是发起某个请求以后,不能做其他事情

异步与非阻塞的区别则是非阻塞一个可以访问下一个资源,异步可以在请求期间做其他的事情 比如发起其他请求,响应也是异步的

2.几种常见IO的介绍

了解完了基本的概念 同步与异步 阻塞与非阻塞以后 现在来了解一些常用的IO

1.BIO (Block IO)

BIO的特点是同步阻塞

即某个线程访问某个资源的时候,**(阻塞)会一直等待这个资源被上一个线程使用结束以后再进入,期间不会去访问其他资源,(同步)**并且每一次请求打进来,都会创建一个新的线程,这样在流量上升后的系统,会频繁创建线程与销毁线程,非常损耗服务器的性能且并不高效,这是一种非常古老的IO流处理方式!

2.NIO (Non Block IO)

NIO的特点是同步非阻塞在访问某个资源的时候,发现这个资源被占用了,并不会在这个资源上死耗着,还会去查看下一个资源点是否可以进行处理**(非阻塞)**

假设现在三个客户端(client)一个服务端(server)

它们在进行通讯的时候我们会使用到一个Selector(选择器、多路复用器)

Selector其实就是一个线程,这个线程会进行轮询

每一个client与server创建连接后,都会在Selector注册后,创建一个对应的channel(通道)

3.AIO (Async IO)

AIO的特点是异步非阻塞,在访问某个资源的时候,如果发现该资源被占用了,会进行访问下一个资源,

并且当AIO模式的线程请求到了资源以后,并不会等着这个资源响应后再做其他事情,而是请求后,数据使用回调的方式通知该线程**(异步)**

4.三种IO模式的区别以及举例子

BIO:发起请求->一直阻塞->处理完成(响应) 每一次请求都创建一个新的线程 非常损耗资源且低效

NIO:发起请求->Selector主动轮询(单线程)->处理请求->处理完成

AIO:发起请求->等待回调(回调期间可以做其他事情)

3.Netty概述

Netty提供了三种线程模型**(Reactor线程模型)**

1.单线程模型

所有的IO操作都由同一个NIO线程处理

所有的client请求到server 请求打到Selector(选择器、多路复用器)(单线程)上 创建出一个单独对应的channel

一个线程挑大梁的模式

2.多线程模型

由一组NIO线程处理IO操作

假设现在有许多client到进来 首先还是由一个**Selector(选择器、多路复用器)**上,但这个时候Selector会把这些client的请求转发给线程池

举个生活中的例子就是去大酒店吃饭,门口有**(单线程)一个服务员来领着客户进服务厅,进入以后会有更多的服务员来服务这些客户(线程池)**

3.主从线程模型 (Netty官方推荐使用)

一组线程来接收请求,一组线程来处理IO

即与多线程模型不同的是,接受请求的单线程换成了线程池

生活中的例子,门口的酒店服务员由一个 变成了多个**(线程池)** 把客户领进大堂后还有**(线程池)**多个服务员来负责后续处理


愿你出走半生,归来仍是少年