扫码关注公众号
什么Netty?Netty 的特点是什么?
Netty是一款基于NIO(NonblockingI/O,非阻塞IO)开发的网络通信框架,对比于BIO(BlockingI/O,阻塞IO),
什么是 Netty 的零拷贝?
Netty的零拷贝主要包含三个方面:Netty的接收和发送ByteBuffer采用DIRECTBUFFERS,使用堆外直接内存进行Socke
Netty的应用场景有哪些?
Netty可构建高性能、低延时的各种Java中间件,例如MQ、分布式服务框架、ESB消息总线等,Netty主要作为基础通信框架提供高性能、低子延时的通信服务分布式服务框架Dubbo,默认使用Netty作为基础通信组件,还有RocketMQ也是使用Netty作为通讯的基础
Netty的线程模型知道吗?
Reactor模式是基于事件驱动开发的,核心组成部分包括Reactor和线程池,其中Reactor负责监听和分配事件,线程池负责处理事件,而根据Reactor的数量和线程池的数量,又将Reactor分为三种模型:单线程模型(单Reactor单线程)多线程模型(单Reactor多线程)主从多线程模型(多Reactor多线程)Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件,由对应的Handler处理。三种模型详细介绍:单线程模型:所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。既要接收客户端的连接请求,向服务端发起连接,又要发送/读取请求或应答/响应消息。一个NIO线程同时处理成百上千的链路,性能上无法支撑,速度慢,若线程进入死循环,整个程序不可用,对于高负载、大并发的应用场景不合适。多线程模型:有一个NIO线程(Acceptor)只负责监听服务端,接收客户端的TCP连接请求;NIO线程池负责网络IO的操作,即消息的读取、解码、编码和发送;1个NIO线程可以同时处理N条链路,但是1个链路只对应1个NIO线程,这是为了防止发生并发操作问题。但在并发百万客户端连接或需要安全认证时,一个Acceptor线程可能会存在性能不足问题。主从多线程模型:Acceptor线程用于绑定监听端口,接收客户端连接,将SocketChannel从主线程池的Reactor线程的多路复用器上移除,重新注册到Sub线程池的线程上,用于处理I/O的读写等操作,从而保证mainReactor只负责接入认证、握手等操作;
TCP 粘包/拆包的原因及解决方法?
TCP是以流的方式来处理数据,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送。TCP粘包/分包的原因:应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象;进行MSS大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包;以太网帧的payload(净荷)大于MTU(1500字节)进行ip分片。解决方法消息定长:FixedLengthFrameDecoder类包尾增加特殊字符分割:①行分隔符类:LineBasedFrameDecoder②或自定义分隔符类:DelimiterBasedFrameDecoder将消息分为消息头和消息体:LengthFieldBasedFrameDecoder类。分为有头部的拆包与粘包、长度字段在前且有头部的拆包与粘包、多扩展头部的拆包与粘包。