阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了

前言:

花了三天时间总算把netty的知识点总结出来了,现在分享给你们,面试大厂在也不要怕了,直接吊打面试官。

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


如果你们觉得我总结的不错的话,给我一个小心心鼓励一下吧,话不多说,我们开始正题。

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


IO模型

IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:BIO,NIO,AIO

BIO(Blocking IO)

同步阻塞模型,一个客户端连接对应一个处理线程


阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


缺点:

1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源

2、如果线程很多,会导致服务器线程太多,压力太大,比如C10K问题

应用场景:

BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。

NIO(Non Blocking IO)

同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到多路复用器selector上,多路复用

器轮询到连接有IO请求就进行处理,JDK1.4开始引入。

应用场景:

NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂。

总结:如果连接数太多的话,会有大量的无效遍历,假如有10000个连接,其中只有1000个连接有写数据,但是由于其他9000个连接并没有断开,我们还是要每次轮询遍历一万次,其中有十分之九的遍历都是无效的,这显然不是一个让人很满意的状态。

NIO 有三大核心组件: Channel(通道), Buffer(缓冲区),Selector(多路复用器)

1、channel 类似于流,每个 channel 对应一个 buffer缓冲区,buffer 底层就是个数组

2、channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理

3、NIO 的 Buffer 和 channel 都是既可以读也可以写


阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


NIO底层在JDK1.4版本是用linux的内核函数select()或poll()来实现,跟上面的NioServer代码类似,selector每次都会轮询所有的sockchannel看下哪个channel有读写事件,有的话就处理,没有就继续遍历,JDK1.5开始引入了epoll基于事件响应机制来优化NIO。

总结:NIO整个调用流程就是Java调用了操作系统的内核函数来创建Socket,获取到Socket的文件描述符,再创建一个Selector对象,对应操作系统的Epoll描述符,将获取到的Socket连接的文件描述符的事件绑定到Selector对应的Epoll文件描述符上,进行事件的异步通知,这样就实现了使用一条线程,并且不需要太多的无效的遍历,将事件处理交给了操作系统内核(操作系统中断程序实现),大大提高了效率。

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Epoll函数详解;

创建一个epoll实例,并返回一个非负数作为文件描述符,用于对epoll接口的所有后续调用。参数size代表可能会容纳size个描述符,但size不是一个最大值,只是提示操作系统它的数量级,现在这个参数基本上已经弃用了。

使用文件描述符epfd引用的epoll实例,对目标文件描述符fd执行op操作。参数epfd表示epoll对应的文件描述符,参数fd表示socket对应的文件描述符。

参数op有以下几个值:EPOLL_CTL_ADD:注册新的fd到epfd中,并关联事件event;

EPOLL_CTL_MOD:修改已经注册的fd的监听事件;

EPOLL_CTL_DEL:从epfd中移除fd,并且忽略掉绑定的event,这时event可以为null;

参数event是一个结构体

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


events有很多可选值,这里只举例最常见的几个:

EPOLLIN :表示对应的文件描述符是可读的;

EPOLLOUT:表示对应的文件描述符是可写的;

EPOLLERR:表示对应的文件描述符发生了错误;

成功则返回0,失败返回-1


阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了



等待文件描述符epfd上的事件。

epfd是Epoll对应的文件描述符,events表示调用者所有可用事件的集合,maxevents表示最多等到多少个事件就返回,timeout是超时时间。I/O多路复用底层主要用的Linux 内核函数(select,poll,epoll)来实现,windows不支持epoll实现,windows底层是基于winsock2的select函数实现的(不开源)


阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


接下来,我会已面试的形式展开,帮助大家更好的理解netty模型。

面试问题概括:

  • 说一下Netty 是什么?
  • netty有什么优势?为什么要用 Netty?
  • Netty有哪些应用场景
  • 说一下netty的核心组件,分别说出其组件的作用
  • EventloopGroup 和 EventLoop有什么关系?
  • 简述一下NioEventLoopGroup 默认的构造函数会起多少线程?
  • 你对Netty 线程模型了解多少?
  • 请说一下netty的服务端和客户端的启动?
  • 谈一谈Netty的心跳机制?
  • 说一下你了解的netty的零拷贝机制

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


最后:

其实大厂的面试并不是很难,只要做好准备就可以了。希望你也能拿到大厂的offer~其他基础知识我也给大家整理出来了,有需要的话私信我,提取码;1

SpringCloud

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Redis

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


JVM

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


MySQL

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Zookeeper

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Kafka

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Dubbo

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


spring

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


Rabbitmq

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


springboot

阿里大牛带你快速搞懂netty,面试大厂再也不怕被问netty了


祝大家都能顺利的拿到offer~


上一篇:从epoll到HTTP到Web框架,手写一个Web项目


下一篇:连接池 和 监听队列