netty面试题 blog.csdn.net/pcceo1/arti…
baijiahao.baidu.com/s?id=166963…
netty介绍: netty Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
netty实在reactor的模型基础上进行优化的: 根据reactor和资源池的线程池的数量可以分为: 单reactor单线程 单reactor多线程 主从reactor多线程(netty基础该模型进行了改进)
reactor的介绍
单reactor单线程:主要有reactor和handler组成,reactor主要负责端口的监听和事件的分发
handler:处理reactor分发的事件;
优点:模型简单,没有多线程,进程通信,竞争的问题,全部的任务都在一个线程完成
缺点:1.性能不高,只有一个线程,不能发挥多核cpu的性能,handler在处理事件时,无法处理连接和其他事件的问题。
2.线程进入死循环或者终止时,服务就无法运行
单reactor多线程:
在该模型中,handler不在负责处理具体的业务,具体业务将交由线程池去处理,handler只负责读client数据,并将响应的数据发送回client
主从reactor多线程(netty基础该模型进行了改进)
MainReactor只负责对端口的监听和连接的创建,多连接后的事件分发和响应发送回client交给subreactor负责。其中MainReactor和subreactor是独立的线程
netty的主要结构
各组件的解释:
boss group:和Worker Group:是两组线程池
boss group:专门负责客户端接受客户端的连接
Worker Group:专门负责网络的读写
NioEventLoop:不断循环执行任务的线程,每个NioEventLoop有一个selector,专门负责对绑定在其上的socket监听,NioEventLoop 内部采用串行化设计,从消息的读取->解码->处理->编码->发送
NioEventLoopGroup 下包含多个 NioEventLoop 每个 NioEventLoop 中包含有一个 Selector,一个 taskQueue 每个 NioEventLoop 的 Selector 上可以注册监听多个 NioChannel 每个 NioChannel 只会绑定在唯一的 NioEventLoop 上 每个 NioChannel 都绑定有一个自己的 ChannelPipeline
NioEventLoop: Pipline: selectorTas
select、poll、epoll的原理与区别 粘包、拆包问题的解决方案: www.cnblogs.com/AIPAOJIAO/p…
netty的各组件和执行流程:
netty传输协议 而 Netty 能通过编程自定义各种协议,因为 Netty 本身自己能编码/解码字节流,所有 Netty 可以实现,HTTP 服务器、FTP 服务器、UDP 服务器、RPC 服务器、WebSocket 服务器、Redis 的 Proxy 服务器、MySQL 的 Proxy 服务器等等
8.Netty 中有那种重要组件?
Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。 EventLoop:主要是配合 Channel 处理 I/O 操作,用来处理连接的生命周期中所发生的事情。 ChannelFuture:Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果。 ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。 ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。
netty的底层是基于java的nio技术。
bio,nio,aio的解释
bio:同步阻塞,每一次连接,都开启一个线程。(连接数少场景) nio:同步非阻塞。一个线程处理多个请求。即客户端连接服务器会注册到多路复用器,多路复用器轮询i/o请求,并处理连接(用于连接数较多,连接时间短的场景) aio:异步非阻塞。发生的连接先有操作系统过滤,只有有效的连接,才会到达服务器(连接时间长且连接数较多的场景)
nio详细介绍:nio三大核心channel,buffer,selector nio是面向缓冲区编程的,数据读取到buffer,需要时在缓冲区前后移动,这增加了处理数据的灵活性,同时也实现了非阻塞。(因为线程不用一直等待读取数据,可以先做其他的事情,有数据了,在再去读取)
http2.0使用了多路复用的技术,做到了同一个连接可以发多个请求,并且发送的数量比http1.1要大
nio和bio比较
bio以流的方式处理数据,nio使用的是块的方式即存到buffer中,通过buffer读取数据;
bio是阻塞的,nio是非阻塞的;
bio使用流的操作,nio是基于buffer和channel,数据总是从channel到buffer或者从buffer到channel
selector用于监听多个通道的事件,连接请求和数据到达等,因此使用单个线程可以监听多个客户端通道。
selector,buffer和channel的关系图:
nio组件关系说明:
每个channel对应一个buffer
每个selector对应一个线程,一个线程对应多个channel
程序切换到那个channel由事件决定,也就是event
selector会根据不同的时间,在各个通道中切换
buffer就是一个内存块,底层是一个数组
数据的读取和写入都是通过buffer,读写的切换是使用flip方法。
channel是双向的。
buffer是一个顶级的父类,为了存储不同类型的数据,它有多个子类:
buffer有四个转态位:
buffer相关的api
bytebuffer的相关api
channel的特点: 可以同时进行读写,而流只能读或者写 可以异步读取数据 可以从buffer读数据,也可以从buffer写数据 常用的channel类有:filechannel(文件数据的读取)、datagramchannel(udp数据的读写)、serversocketchannel和socketchannel(tcp数据的读写)
filechannel主要是本地文件的io,常用的方法
BYTEbuffer支持的类型化的put和get,put放入的什么类型,get要使用相应的类型取出,否则会报异常。
selector选择器能够检测到注册的通道上是否有事件发生,多个channel可以以事件的形式注册到同一个channel
selector管理多个channel,避免了开启多个线程,减少了线程间上下文切换的花销
selector相关api
nio相关组件关系selector、selectionkey、seversocketchannel和socketchannel关系
客户端连接时,会通过serversocketchannel得到socketchannel selector进行监听,通过select方法,返回有事件发生的通道个数
将socketchannel注册到selector上,register(select sel,int ops),一个selector可以注册多个socketchannel
注册后,可以通过selectionkey,会和该selector关联 通过selectionkey (有事件发生)
通过selectionkey获取socketchannel
通过channel处理事件
selectionkey的相关方法
nio与零拷贝
netty组件