Netty部分内容整理
1、Netty是什么?
Netty是一款基于NIO开发的网络通信框架,对比于BIO,它的并发性能得到了很大提高。难能可贵的是,在保证快速易用性的同时,并没有丧失可维护性和性能等优势。
2、Netty的特点是什么?
(1)高并发:Netty是一款基于NIO开发的网络通信框架,对比于BIO,它的并发性能得到了很大提高;
(2)传输快:Netty的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输;
(3)封装好:Netty封装了NIO操作的很多细节,提供了易于使用调用接口。
3、什么是Netty的零拷贝?
Netty的零拷贝主要包括三个方面:
(1)Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(Heap Buffers)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
(2)Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。
(3)Netty的文件传输采样了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。
4、Netty的优势有哪些?
(1)使用简单:封装了NIO的很多细节,使用更简单。
(2)功能强大:预置了很多编解码功能,支持多种主流协议。
(3)定制能力强:可以通过ChannelHandler对通信框架进行灵活地扩展。
(4)性能高:通过与其他业界主流的NIO框架对比,Netty的综合性能最优。
(5)稳定:Netty修复了已经发现的所有NIO的bug,让开发人员可以专注于业务本身。
(6)社区活跃:Netty是活跃的开源项目,迭代周期短,bug修复速度快。
5、Netty的应用场景有哪些?
NIO可以做的事情,使用Netty都可以做并且更好,Netty主要用来做网络通信。典型的应用场景有:
(1)作为RPC框架的网络通信工具;比如阿里的分布式服务框架Dubbo,默认使用Netty来作为基础通信组件,还有RocketMQ也是使用Netty作为通讯的基础。
(2)用来实现HTTP服务器。
(3)用来实现一个即时通讯系统。
(4)实现消息推送系统:市面上有很多消息推送系统都是基于Netty来做的。
6、Netty高性能表现在哪些方面?
(1)IO线程模型:同步非阻塞,用最少的资源做更多的事。
(2)内存零拷贝:尽量减少不必要的内存拷贝,实现更高效率的传输。
(3)内存池设计:申请的内存可以重用,主要指直接内存。内存实现是用一颗二叉查找树管理内存分配情况。
(4)串形化处理读写:避免使用锁带来的性能开销。
(5)高性能序列化协议:支持protobuf等高性能序列化协议。
7、Netty和Tomcat的区别?
(1)作用不同:Tomcat是Servlet容器,可以视为Web服务器,而Netty是异步事件驱动的网络应用程序框架和工具,用于简化网络编程,例如TCP和UDP套接字服务器。
(2)协议不同:Tomcat是基于http协议的Web服务器,而Netty能通过编程自定义各种协议,因为Netty本省能自己编码/解码字节流,所以Netty可以实现HTTP服务器、FTP服务器、UDP服务器、RPC服务器、WebSocket服务器、Redis的Proxy服务器、MySQL的Proxy服务器等。
8、Netty中有哪些重要组件?
(1)Channel:
Channel是Netty网络操作抽象类。基础的IO操作,如绑定、连接、读写等都依赖于底层网络传输所提供的原语,在Java的网络编程中,基础核心类是Socket,而Netty的Channel提供了一组API,极大地简化了直接与Socket进行操作的复杂性,并且Channel是很多类的父类,如EmbededChannel、LocalServerChannel、NioDatagramChannel、NioSctpChannel、NioSocketChannel等。
(2)EventLoop:
EventLoop定义了处理在连接过程中发生的事件的核心抽象,EventLoop的主要作用实际就是负责监听网络事件并调用时间处理器进行相关I/O操作的处理。
Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的Channel 处理 I/O 操作,两者配合参与 I/O 操作。
(3)ChannelHandler和ChannelPipeline
从应用开发者看来,ChannelHandler是最重要的组件,其中存放用来处理进站和出站数据的用户逻辑。ChannelHandler的方法被网络事件触发,ChannelHandler可以用于几乎任何类型的操作,如将数据从一种格式转换为另一种格式或处理抛出的异常。例如,其子接口ChannelInboundHandler,接受进站的事件和数据以便被用户定义的逻辑处理,或者当响应所连接的客户端时刷新ChannelInboundHandler的数据。ChannelHandler充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。
ChannelPipeline为ChannelHandler链提供了一个容器并定义了用于沿着链传播入站和出站事件流的API。当创建Channel时,会自动创建一个附属的ChannelPipeline,这个关联是永久性的。
(4)Bootstrap和ServerBootstrap
Netty的引导类应用程序网络层配置提供容器类,其涉及将进程绑定到给定端口或连接一个进程在指定端口上运行的另一个进程。引导类分为客户端引导Bootstrap和服务端引导ServerBootstrap。
9、Netty发送消息有几种方式?
(1)直接写入Channel中,消息从ChannelPipeline当中尾部开始移动;
(2)写入和ChannelHandler绑定的ChannelHandlerContext中,消息从ChannelPipeline中的下一个ChannelHandler中移动。
10、默认情况下,Netty启动多少线程,何时启动?
Netty默认是CPU处理数的两倍,bind完之后启动。
11、Netty支持哪些心跳类型设置
(1)readerIdleTime:读超时时间(即测试端一定时间内未接收到被测试端消息)。
(2)writerIdleTime:写超时时间(即测试端一定时间内向被测试端发送消息)。
(3)allIdleTime:所有类型的超时时间。
12、Netty的执行流程?
(1)创建ServerBootstrap实例;
(2)设置并绑定Reactor线程池:EventLoopGroup,EventLoopGroup就是所有注册到本线程的Selector上面的Channel;
(3)设置并绑定服务器的Channel;
(4)创建处理网络事件的ChannelPipeline和handler,网络事件以流的形式在其中流转,handler完成多数的功能定制:比如编解码,SSL安全认证;
(5)绑定并启动监听端口;
(6)当轮询到准备就绪的channel后,由Reactor线程:NioEventLoop执行pipline中的方法,最终调度并执行ChannelHandler。
13、Netty的应用示例demo
一个netty的简单应用demo,可以参考学习:https://github.com/JianfuYang/2020-yjf-review/tree/master/springboot-netty-master
14、一个手写RPC框架demo
掘金上的课程《手写RPC框架》的示例代码,可参考学习:
声明:本文部分内容整理来源于网络,仅做个人学习使用!侵删~
本文部分内容参考链接:
(1)https://www.cnblogs.com/xiaoyangjia/p/11526197.html
(2)https://juejin.im/post/6844903792442343438