BIO、NIO、AIO的不同
BIO:同步阻塞IO模式,线程发起IO请求后,一直阻塞IO,直到缓冲区数据就绪后,再进行下一步操作。 NIO:是同步非阻塞IO,线程发起IO请求后,立即返回。同步体现在selector仍然要去轮询判断channel是否准备好,非阻塞体现在这个过程中处理用户线程不会一直等待,可以去做其他的事情,但是要定时轮询IO缓存区数据是否准备好。 NIO主要有buffer、channel、selector三个组件,通过零拷贝的buffer获取数 AIO是异步非阻塞IO模型。在上述NIO实现中,需要用户线程定时轮询,去检查IO缓冲区数据是否准备就绪,占用应用程序线程资源,其实轮询也是阻塞的,它需要查询哪些IO就绪了。而真正的理想的异步非阻塞IO应该让内核系统完成,用户线程只需告诉内核,当缓冲区就绪后,通知我或者执行回调函数。 BIO存在的问题 在BIO模式中,socket.accept()、socket.read()、socket.write()三个主要函数都是同步阻塞的。当一个连接处理IO的时候,系统是阻塞的,要想处理多个连接,就要使用多线程。但是,当面对数万级别的连接时,传统的BIO模型就不行了,太消耗资源了。 NIO与IO的区别 NIO以块的方式处理数据,但是IO是以最基础的字节流的形式进行写入和读出。 NIO的通道是双向的,但是IO中的流是单向的。 NIO采用的是多路复用的IO模型,普通的IO用的就是阻塞的IO模型。NIO的工作流程
1) 首先先创建ServerSocketChannel对象和真正处理数据的线程池。不选择JAVA原生NIO编程的原因
NIO的类库和API繁琐,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能做铺垫,例如要熟悉Java多线程编程。 可靠性能力补齐,工作量和难度都非常大。比如说拆包闭包问题。 JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。
为什么选择Netty
Netty有什么特点
高并发。 Netty是一款基于NIO开发的网络通信框架,对比于BIO,它的并发性得到了很大的提高。Netty如何解决空轮询
NIO组件之选择器的select
select操作的返回值不是已准备好的通道的总数,而是从上一个select()调用之后进入就绪态的通道的数量。之前的调用就绪的,并且在本次调用中仍就绪的通道不会被计入,而那些在前一次调用中已经就绪但是已经不再处于就绪状态的通道也不会被计入。零拷贝
在传统的I/O操作中,每次都需要把内核空间的数据拷贝到用户空间中,这样挺浪费空间的,所以零拷贝的出现就是为了解决这个问题。 主要有两种方法: mmap+write 和 Sendfile mmap+write 使用mmap+write方式替换原来的read+write方式,mmap是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。 这样就可以省略掉原来内核Read缓冲区Copy数据到用户缓冲区,但是还是需要内核Read缓冲区将数据Copy到内核Socket缓冲区。 Sendfile Sendfile是为了简化通过网络在两个通道内进行的数据传输过程。 它不仅减少了数据复制,还减少了上下文次数的切换。数据传送只发生在内核空间里,所以减少了一次上下文切换,但是还是存在一次Copy。 后来进行了改进,将Kernel Buffer中对应的数据描述信息(内存地址,偏移量)记录到相应的Socket缓冲区中,这样连内核空间中的一次CPU Copy也省掉了。Netty的零拷贝具体体现
Netty零拷贝主要体现在三个方面。 Netty的接收和发送ByteBuffer采用DirtectByteBuffer,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。 Netty在操作多个Channel时,使用CompositeChannelBuffer,它并不会开辟新的内存并复制所有ChannelBuffer内容,而是直接保存了所有ChannelBuffer的引用,并在子ChannelBuffer里进行读写,实现了零拷贝。 Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel。Netty工作流程服务端
1) 创建ServerBootStrap实例。客户端
1) 创建Bootstrap实例。
Java 自学免费加油站
Java基础语法-面向对象-集合-IO-线程与并发-异常-网络编程
java基础传送门:Java基础入门视频教程,零基础小白自学Java必备教程
Java进阶
java进阶13天:Java13天进阶教程,深入学习Java编程核心思想
API: Java基础教程2020新版JDK8日期API解析
技术框架 Spring:Java进阶教程spring框架,深入浅出讲解细致
SpringMVC+mybatis:Springmvc+Mybatis由浅入深全套视频教程
mybatis plus:MybatisPlus深入浅出教程,快速上手Mybatis-Plus
spring data:java进阶教程数据层全栈方案Spring Data高级应用
分布式架构
Zookeeper+Dubbo:Dubbo快速入门,Java分布式框架必会的教程
Springcloud:SpringCloud从小白到精通教程
Skywalking:java基础教程全面的深入学习Skywalking
服务器中间件
Rabbitmq:RabbitMQ全套教程,RabbitMQ消息中间件到实战面试
Rocketmq:RocketMQ系统精讲,电商分布式消息中间件,硬核揭秘双十一
Kafka:Kafka深入浅出,快速玩转分布式发布订阅消息系统
Redis:Redis入门到精通,Java企业级解决方案必看
MongoDB:java必备基础教程-MongoDB基础入门到高级进阶
Apollo分布式:轻松入门Apollo分布式配置中心-服务中间件
服务器技术
Tomcat:Java进阶教程Tomcat核心原理解析
容器技术
Docker:Docker容器化技术,从零学会Docker教程
Kubernetes:Kubernetes(K8S)超快速入门教程
练手项目合集
1.传智健康项目https://www.bilibili.com/video/BV1Bo4y117zVa
2.iHRM 人力资源管理系统https://www.bilibili.com/video/BV18A411L7UXa
3.Java项目《万信金融》企业级开发实战https://www.bilibili.com/video/BV1Ub4y1f7rka
4.好客租房项目https://www.bilibili.com/video/BV1sZ4y1F7PDa
5.品优购V1.3.1项目实战https://www.bilibili.com/video/BV1mi4y1L7Hta
6.Java大型分布式微服务闪聚支付项目https://www.bilibili.com/video/BV17v411V79c/a
7.Java集信达短信平台实战https://www.bilibili.com/video/BV1J
面试题:
深入解读阿里等一线大厂java面试必考HashMap技术点
Java面试热点问题,synchronized原理剖析与优化
Java面试热门内容精讲之——并发编程volatile
MySQL优化教程,超详细的MySQL数据库优化,Java面试热点必考问题
觉得有帮助可以抓紧收藏,说不定啥时候失效了