what is netty & what can netty do
【From official website】Netty is a NIO client server which enables quick and easy development of network applications such as protocol servers and clients
一、Netty与NIO的关系
I : Input(向内存中写入数据)
O : Output(从内存中读数据)
是用来描述计算机中的信息交换,Input和Output是相对于我们计算机的内存而言的
IO分为和
- Java中对应的api(本地IO)
Java中对本地io的操作是基于File对象的,一般需要先新建File对象
字节流:InputStream/OutputStream
缓冲流:Reader/Writer - Java中对应的api(网络IO)
TCP:ServerSocket/Socket
UDP:DatagramPacket/DatagramSocket
本地IO与网络IO的区别
本地IO指:单挑机器上,冲A文件夹到B文件夹,或者从内存到磁盘,磁盘到内存等的过程
网络IO指:在网络上的两台机器,通过ip地址和端口互通互联,然后通过网络协议进行交换(应用层:http、https、ftp),TCP和UDP是底层协议,大部分应用层协议都是基于tcp和udp来通信的
IO的演变历史
IO的演变历史BIO指 BlockIO
NIO指NewIO或NonBlockIO
AIO指异步IO
二、Netty能做什么
定义:Netty是高性能的网络通信底层框架(很少作为应用层开发,更多作为底层框架)
netty的性能是传统io(bio)性能的8倍,
传统io(bio)存在的问题:
- 阻塞IO不具备弹性伸缩能力,高并发导致宕机。
- Java序列化编码、解码的性能问题
- 传统IO线程模型过多占用CPU资源。
IO性能主要影响的面:
netty在当前通信领域是无所不能,当前的网络通信基本都是基于tcp或udp的,而netty正是对tcp和udp的封装。
netty.png
image.png
Netty操作的基本流程
Netty操作的基本流程Netty中的Channel简介
image.pngBossGroup和workerGroup工作原理
image.png
netty是如何解决JDK空轮训Bug的?
代码详见:NioEventLoop.java -> select方法
- 创建一个新的Selector
- 将原来的Selector中注册的事件全部取消
- 将可用事件重新注册到新的Selector中,并激活。
Reactor线程模型
- 单线程模型
- 多线程模型
-
主从线程模型
image.png
EventLoopGroup与Reactor是如何关联的?
在netty中
当设置BossLoopGroup线程数为1,WorkerLoopGroup为大于1,如128,即表示Reactor线程模型中的多线程模型(及多路复用模型)
当设置BossLoopGroup线程数为大于1,如128,WorkerLoopGroup为大于1,如128,即表示Reactor线程模型中的主从线程模型
channel与channelpipeline关系
channel与channelpipeline关系pipeline中InBoundHandler与OutBoundHandler传播顺序
先执行InBoundHander,再执行OutBoundHandler; InBoundHandler顺序输出,OutBoundHandler逆向输出
...
ch.pipeline().addLast(new OutboundHandlerC());
ch.pipeline().addLast(new InboundHandlerB());
ch.pipeline().addLast(new OutboundHandlerB());
ch.pipeline().addLast(new InboundHandlerA());
ch.pipeline().addLast(new OutboundHandlerA());
ch.pipeline().addLast(new InboundHandlerC());
...
输出结果B -> A -> C; A -> B -> C
网友评论