1

Netty是什么,Netty为什么速度这么快,线程模型分析 - 旷世奇才927

 1 year ago
source link: https://www.cnblogs.com/xiaoqiJava/p/16322848.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Netty是什么,Netty为什么速度这么快,线程模型分析

哈喽!大家好,我是小奇,一位热爱分享的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新

书接上回,现在下着大雨看来是去不了镇上买熟食吃了,但是在家待着也没有意思,去找我表弟玩吧,看看他在家干啥呢?

表弟家离我家很近,走一条街再拐几个弯就到了,大中午的应该在家刚做完饭,正好蹭饭。

在这里插入图片描述

正要推开门发现门里面锁着呢,这大白天的锁着门干啥呢,敲了敲门。

我:有人在家吗?

表弟:谁呀?

我:我,你哥。

表弟:哦,那没有人在家,你回吧!

我:赶紧给我开门,别墨迹。

我说怎么这小子不开门,躲家里啃鸡腿呢,就怕我饭点来。

在这里插入图片描述

表弟:哥你咋来了?

我:咋?我还不能来啊!

表弟:你不是去北京找工作去了吗,怎么这么快就回来了。

我:别提了,现在工作不好找。

表弟:那不行你就回来跟我一起养猪吧,我老是出去卖猪肉,家里猪下崽了我也不能及时发现,你在家就能给我看着了。

我:现在哪里还用人看着猪圈啊,都是摄像头了。

表弟:啥是摄像头呢,去哪里找呢?

我:走,我带你去村里看看墙上刚打的广告。

在这里插入图片描述

表弟:说的真对,我现在就买一个。

我:你买吧,我回家做饭去了,你这就一个鸡腿还让你啃成这样子了,我走了。

回到家中做一个大米汤吧,炒一个蒜苔鸡蛋,正炒着菜呢电话响了。

我:“喂您好”。

对面:“您好,请问是小奇吗”。

我:“是我,你是?”。

对面:“我是XXX公司的,我看到hr推给我你的简历,我感觉还不错,你什么时候方便来现场面试一下”。

我:“现在不方便现场面试了”。

对面:“好吧,那你现在方便吗?我们现在线上面试一下吧”。

我:“好的”。

面试官:我看你简历上写的精通Netty,那你能简单说一下Netty是什么吗?

我:Netty首先是一个java开源框架,他是一个提供了异步的、基于事件驱动的网络应用程序框架,所以说Netty就是一个网络应用框架,可以开发出高性能、高可靠的网络服务器和客户端程序。

面试官:嗯。那Netty为什么能够开发出高性能、高可靠的网络服务器呢,他为什么速度这么快呢?

我:这得益于Netty的线程模型的架构设计,使得Netty可以基于NIO的设计理念对线程模型基于改进,使得Netty在处理客户端请求连接,和客户端请求数据处理的时候可以快速的进行处理。

面试官:嗯。你能跟我分析一下Netty的线程模型吗?

在这里插入图片描述

我:Netty模型中首先有这些属性概念。

BossGroup:相当于一个事件循环线程池,这个池中有多个事件循环线程。这个线程池是专门处理客户端的连接事件的。

WorkerGroup:也是一个事件循环线程池,这个线程池是专门处理客户端的读写请求事件的。

NioEventLoop:这个就是事件循环线程,每一个事件循环线程都有一个selector用来监听事件。

NioSocketChannel:这个是在客户端与BossGroup中的一个事件循环线程建立连接后生成的,将这个可以注册到WorkerGroup的一个事件循环线程上,让WorkerGroup的事件线程来处理后续的读写请求。

Pipeline:这个处理从WorkerGroup过来的数据,他包含很多ChannelHandler,这些是真正处理数据的。

ChannelHandler:真正用来处理数据的。

面试官:嗯。可以讲一下从客户端连接到发送数据的整个流程吗?

在这里插入图片描述

1、客户端向BossGroup发起连接请求,BossGroup中的NioEventLoop处理了连接请求后生成一个NioSocketChannel。

2、BossGroup将NioSocketChannel注册到WorkerGroup中的一个NioEventLoop中的一个Selector上。至此BossGroup的工作完成,他接着处理其他客户端的连接请求。

3、WorkerGroup循环监听注册在自己的Selector上的这些NioSocketChannel有没有读写的事件发生。

4、WorkerGroup监听到NioSocketChannel有读写事件发生就交给Pipeline处理。至此WorkerGroup工作完成,他继续处理其他客户端的读写事件。

5、Pipeline接收到WorkerGroup发送过来的数据,然后交给ChannelHandler进行处理。

面试官:嗯。那Netty为什么比传统的网络编程工具更加快呢?

我:因为Netty将客户端的连接请求和读写数据的请求分开用两个线程池来处理,这样大大提高了效率。

面试官:“小伙子不错呀,什么时候能回北京入职呢”

我:“额。。。等等吧,现在家里雨太大了,容易弄一身巧克力。”

面试官:“行,那你来了北京一定来我们公司上班啊”

我:“额。。。这个跟你承诺不了,万一还有别的好公司给我打电话呢”。

面试官:“来吧,条件好商量”

我:“我考虑考虑吧”。

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK