ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-15 16:52:52  阅读:201  来源: 互联网

标签:netty NIO epoll 大牛带 描述符 线程 IO 搞懂


前言:

花了三天时间总算把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~


标签:netty,NIO,epoll,大牛带,描述符,线程,IO,搞懂
来源: https://blog.51cto.com/u_15134731/2777905

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有