09
2020
03
Netty 是什么?
Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。
作者:ghjk | 分类:Netty 面试题 | 浏览:316 | 评论:0
09
2020
03
Netty 的特点是什么?
高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。
作者:ghjk | 分类:Netty 面试题 | 浏览:313 | 评论:0
09
2020
03
Netty 的优势有哪些?
使用简单:封装了 NIO 的很多细节,使用更简单。功能强大:预置了多种编解码功能,支持多种主流协议。定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。
作者:ghjk | 分类:Netty 面试题 | 浏览:302 | 评论:0
09
2020
03
Netty 的应用场景有哪些?
典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,还有 RocketMQ 也是使用 Netty 作为通讯的基础。
作者:ghjk | 分类:Netty 面试题 | 浏览:280 | 评论:0
09
2020
03
Netty 高性能表现在哪些方面?
IO 线程模型:同步非阻塞,用最少的资源做更多的事。内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。串形化处理读写:避免使用锁带来的性能开销。高性能序列化协议:支持 protobuf 等高性能序列化协议。
作者:ghjk | 分类:Netty 面试题 | 浏览:318 | 评论:0
09
2020
03
BIO、NIO和AIO的区别?
BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,BIO是面向流的,NIO是面向缓冲区的;BIO的各种流是阻塞的。而NIO是非阻塞的;BIO的Stream是单向
作者:ghjk | 分类:分类 | 浏览:292 | 评论:0
09
2020
03
NIO的组成?
Buffer:与Channel进行交互,数据是从Channel读入缓冲区,从缓冲区写入Channel中的flip方法 : 反转此缓冲区,将position给limit,然后将position置为0,其实就是切换读写模式clear方法 :清除此缓冲区,将position置为0,把capacity的值给limit。rewind方法 : 重绕此缓冲区,将position置为0DirectByteBuffer可减少一次系统空间到用户空间的拷贝。但Buffer创建和销毁的成本更高,不可控,通常会用内存池来
作者:ghjk | 分类:分类 | 浏览:318 | 评论:0
09
2020
03
Netty的线程模型?
Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件,由对应的Handler处理。单线程模型:所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。既要接收客户
作者:ghjk | 分类:分类 | 浏览:302 | 评论:0
09
2020
03
TCP 粘包/拆包的原因及解决方法?
TCP是以流的方式来处理数据,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送。TCP粘包/分包的原因:应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象;进行MSS大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包以太网帧的payload(净荷)大于MTU(1500字节)进行ip分片。解决方法消息定长:FixedLen
作者:ghjk | 分类:分类 | 浏览:349 | 评论:0
09
2020
03
什么是 Netty 的零拷贝?
Netty 的零拷贝主要包含三个方面:Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对
作者:ghjk | 分类:Netty 面试题 | 浏览:351 | 评论:0