netty使用介绍

221 阅读6分钟

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组件