NIO,BIO,AIO

同步异步,阻塞非阻塞

1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者

同步异步针对客户端,阻塞非阻塞针对服务端


BIO

同步阻塞IO
一客户端一线程

有一个acceptor负责监听客户端的连接,一旦接收到一个连接请求,就可以建立通信套接字在这个通信套接字上进行读写操作
一请求一应答,如果连接不做任何事的话会造成线程开销,如果并发访问量增加会造成线程堆栈溢出,创建新线程失败。
可通过线程池改善;通过线程池就是一个伪异步I/O模型。
BIO适用于活动连接数不是特别高的情况

NIO(New I/O)

同步非阻塞的I/O模型
NIO提供的SocketChannel和ServerSocketChannel支持阻塞和非阻塞两种模式

NIO与BIO的区别:

1. IO阻塞,NIO非阻塞;
2. IO面向流,NIO面向缓冲区
3. NIO是通过通道进行读写的,双向;BIO中流的读写是单向的
4. NIO有选择器,IO没有;选择器用于使用单个线程处理多个通道。

NIO的核心组件

channel 通道, Buffer缓冲区, selector 选择器

AIO

异步非阻塞,异步IO是基于事件和回调机制实现的


Netty

对Netty的认识

1. 基于NIO的客户端服务器框架,可以用来快速开发 网络应用程序
2. 简化了TCP、UDP套接字服务器等网络编程,性能安全性方面更好
3. 自带各种协议栈

为什么要用Netty

1. 统一的API,支持多种传输类型,阻塞和非阻塞
2. 简单强大的线程模型
3. 自带编解码器解决粘包、拆包问题
4. 比直接使用Java的IO有更高的吞吐量,更低的延迟,更低的资源消耗,更少的内存复制
5. 安全性好,注意吃SSL/TLS
6. dubbo中也用到了netty

TCP粘包拆包以及解决办法

基于TCP发送数据的时候,出现了多个字符串粘在了一起或者一个字符串被拆开的问题;
可以用netty自带的编解码器或者自定义序列化编解码器进行解决。

Netty线程模型

Netty主要靠NioEventLoopGroup线程池来实现具体的线程模型的。
一般会初始化两个线程组:bossGroup和workerGroup;
Netty中的线程模型: 
        单线程模型:一个线程需要处理所有的事件
        多线程模型:一个acceptor线程只负责监听客户端的连接,一个NIO线程池负责具体处理事件
        主从多线程模型:从主线程NIO线程池中选择一个线程作为Acceptor线程,负责客户端连接,其他线程负责处理后续的接入认证工作。


零拷贝

操作系统中,零拷贝指的是避免在用户态和内核态之间来回拷贝数据;Neety层面主要是对数据操作进行了优化
1. 使⽤ Netty 提供的 CompositeByteBuf 类, 可以将多个 ByteBuf 合并为⼀个逻辑上的ByteBuf , 避免了各个 ByteBuf 之间的拷⻉。
2. ByteBuf ⽀持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同⼀个存储区域的ByteBuf , 避免了内存的拷⻉。
3. 通过 FileRegion 包装的 FileChannel.tranferTo 实现⽂件传输, 可以直接将⽂件缓冲区的数据发送到⽬标 Channel , 避免了传统通过循环 write ⽅式导致的内存拷⻉问题.



Zookeeper

分布式协调服务框架 ,最常用的就是担任服务生产者和服务消费者的注册中心(提供发布订阅服务)。
1. zookeeper是一个分布式程序,只要半数以上节点存活,zookeeper就能正常服务
2. zk数据保存在内存中,保证了高吞吐量和低延迟
3. zk有临时节点的概念。

特点:
1. 顺序一致性
2. 原子性
3. 单一系统映像
5. 可靠性

设计目标:
1. 简单的数据模型
2. 可构建集群
3. 顺序访问
4. 高性能

集群:
主从模式,引入了leader、follower、observer三种角色
ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。












Dubbo















场景题