文章目录
1、Netty是什么?
1.netty是基于java NIO的异步的client-server端框架,可以快速开发网络应用程序
2.极大的简化了TCP和UDP套接字等网络编程,并且性能及安全性可能更好
3.支持多种通讯协议,如FTP、Http、及各种二进制和基于文本的传统协议
4.Dubbo、RocketMQ、Elasticsearch、gRpc等底层都用netty实现
官方总结:
Netty成功的找到了一种在不妥协维护性和性能的情况下,实现了易于开发,性能、稳定性和灵活性的方法
netty是网络编程的王者,在网络IO中地位堪比spring在java中的地位,使用好netty几乎可以为所以为
2、为什么要用 Netty?(优点)
netty有很多优点,相比java中NIO的API来说更加易用,易开发
1.简单而强大的线程模型,reactor
2.统一的API,支持多种传输协议,并且可以自定义通讯协议,提供阻塞和非阻塞的操作
3.自带编解码器解决TCP粘包/拆包问题
4.比起java核心API有更高的吞吐量、低延迟、更低资源消耗和更少内存复制
5.安全性也好,有完整的SSL/TLS和StartTLS支持
6.社区活跃,成熟稳定,经历了大项目的使用和考验,很多开源项目都使用netty来进行IO通讯,如Dubbo、RocketMQ等
3、Netty有哪些应用场景?
1.作为rpc框架的网络通讯工具
2.实现一个自己的http服务器
3.实现一个即时通讯系统
4.实现消息推送系统 等等
4、NioEventLoopGroup 默认的构造函数会起多少线程?
默认的构造函数实际会起的线程数为 CPU核心数*2
5、Netty 线程模型了解么?
netty线程模型主要是基于reactor实现。
基于reactor可以实现3种线程模型:reactor单线程模型,reactor多线程模型、主从reactor多线程模型
在使用时主要是靠NioEventLoopGroup来实现上诉的3种线程模型
一般使用netty实现服务端时,一般会初始化两个线程组:
bossEventLoopGroup:监听接受客户端连接
workEventLoopGroup:负责具体的IO事件,交由handler处理
5.1 reactor单线程模型
一个线程需要处理所有的accept、recieve、decode、procces、encode、send事件。对于高负载、高并发、并且性能要求比较高的系统并不适用
5.2 reactor多线程模型
主线程仍然负责accept、recieve、send等事件,将业务的处理派由一个线程池去处理。高并发时也会出现性能瓶颈
5.3 主从reactor多线程模型
主reactor线程监听accept事件,并派发给从reactor线程,从reactor负责监听IO的recieve、send事件,并且将监听到的事件交由从reactor线程池处理业务
6、什么是TCP粘包/拆包?怎么解决?
TCP粘包/拆包就是TCP收发数据时,出现了多个字符串粘在一起或一个字符串被拆开多次发送的情况。
解决:
1.使用Netty自带的解码器
a.LineBasedFrameDecoder:换行符作为分隔
b.DelimiterBasedFrameDecoder:自定义分隔符解码器
c.FixedLengthFrameDecoder:固定长度解码器
d.LengthFieldBasedFrameDecoder:自定义序列化编解码器
2.自定义序列化编解码器
java自带的序列化方式性能差,不能跨平台,一般使用json、protostuff、hessian2等序列化方式
7、Netty 长连接、心跳机制了解么?(TCP)
TCP在进行读写前,server与client之间需要建立一个连接。
建立连接需要有三次握手,释放/关闭连接需要四次挥手。这两个过程是比较耗费网络资源并有一定的延迟
短链接:在3次握手建立连接后,消息发送完毕就会进行四次挥手,断开连接。
缺点:每次读写前后都需要三次握手,四次挥手,耗性能
长连接:在建立连接后,client与server进行读写后都不会主动断开连接,后续有读写请求依然使用这个连接。对于通讯很频繁的链接很适用,但长时间占用连接不进行通讯时,也会对系统造成一定的资源浪费
所以:在长连接的基础上,增加了心跳机制
8、为什么需要心跳机制?说一说netty中心跳机制
在tcp保持长连接时,可能会出现网络异常等现象,当异常发生时client与server没有进行通讯,那么他们是无法感知对方已经掉线的,为此需要引入心跳机制的概念
心跳机制:在server与client之间一定时间内没有数据交互时,就需要client或server发送一个特殊的数据包给对对方,当对方收到这个特殊的数据包时,也立即返回一个特殊的数据包以回应对方,当双方都收到消息后,就知道对方都在线,确保了TCP连接的有效性。
TCP有自带的长连接配置项,即SO_KEEPALIVE。但TCP协议层面的长连接不够灵活。所以一般都是在应用层来实现自定义心跳机制。也就是通过netty代码层面来实现,核心类为IdleStateHandler
9.netty 零拷贝原理?
9.1理解:
零拷贝的应用程序要求内核(kernel)直接将数据从磁盘文件拷贝到套接字(Socket),而无须通过应用程序。
9.2特点:
相比传统的拷贝:netty的零拷贝只是数据从磁盘拷贝到内核,内核通过socket直接发送给客户端,并没有将数据再从内核拷贝到用户态内存的过程。
10.netty对pipeline的优化?
在handler中有mask字段,表示是否被覆盖,0表示未被覆盖,1表示覆盖了。
在netty执行handler时,mask字段未1那就就会跳过父类的处理方法,省了一点性能和内存