面试宝典到手,搞定面试,不再是难题,系列文章传送地址,请点击本链接。
目录
1、Netty是什么?和Tomcat有什么区别?特点是什么?
5、EventloopGroup 了解么?和 EventLoop 啥关系?
6、Bootstrap 和 ServerBootstrap 了解么?
7、NioEventLoopGroup 默认的构造函数会起多少线程?
1、Netty是什么?和Tomcat有什么区别?特点是什么?
Netty是一个基于NIO的异步网络通信框架,提供了TCP/UDP和文件传输的支持,性能高,封装了原生NIO编码的复杂度,开发者可以直接使用Netty来开发高效率的各种网络服务器,并且编码简单。
Tomcat是一个web服务器,是一个Servlet容器,基本上Tomcat内部只能运行Servlet程序,并处理HTTP请求,而Netty封装的是底层IO模型,关注的是网络数据的传输,而不关心具体的协议,可定制性更高。
Netty的特点:
1、异步、NIO的网络通信框架
2、高性能
3、高扩展,高定制性
4、易用性
2、Netty高性能体现在哪些方面?
1、NIO模型,用最小的资源做更多的事情。
2、内存零拷贝,尽量减少不必要的内存拷贝,实现更高效的传输。(零拷贝)
3、内存池设计,申请的内存可以重用,只要指直接内存。内部实现是用一颗二叉树查找管理内存分配情况。
4、串行化处理读写:避免使用锁带来的性能开销。即消息的处理尽可能在同一个线程内完成,期间不进行线程的切换,这样就避免了多线程竞争和同步锁。表面上看,串行化设计似乎CPU利用率不搞,并发程度不够。但是,通过调整NIO线程池的线程参数,可以同时启动多个串行化的线程并行运行,这样局部无锁化的串行程序设计相比一个队里多个工作线程模型性能更优秀。
5、高性能序列化协议:支持protobuf等高性能序列化协议
6、高效并发编程的体现:volatile的大量、正确使用;CAS和原子类的广泛使用;线程安全容器的使用;通过读写锁提升并发性能。
3、Netty 有哪些应用场景?
Netty 主要用来做网络通信 :
作为 RPC 框架的网络通信工具 :我们在分布式系统中,不同服务节点之间经常需要相互调用,这个时候就需要 RPC 框架了。不同服务节点之间的通信是如何做的呢?可以使用 Netty 来做。比如我调用另外一个节点的方法的话,至少是要让对方知道我调用的是哪个类中的哪个方法以及相关参数吧!实现一个自己的 HTTP 服务器 :通过 Netty 我们可以自己实现一个简单的 HTTP 服务器,这个大家应该不陌生。说到 HTTP 服务器的话,作为 Java 后端开发,我们一般使用 Tomcat 比较多。一个最基本的 HTTP 服务器可要以处理常见的 HTTP Method 的请求,比如 POST 请求、GET 请求等等。
实现一个即时通讯系统 :使用 Netty 我们可以实现一个可以聊天类似微信的即时通讯系统,这方面的开源项目还蛮多的,可以自行去 Github 找一找。
实现消息推送系统 :市面上有很多消息推送系统都是基于 Netty 来做的。......
4、Netty 核心组件有哪些?分别有什么作用?
Netty核心组件包括:channel、
1.Channel
Channel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()、connect()、read()、write() 等。
比较常用的Channel接口实现类是NioServerSocketChannel(服务端)和NioSocketChannel(客户端),这两个 Channel 可以和 BIO 编程模型中的ServerSocket以及Socket两个概念对应上。Netty 的 Channel 接口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。
2.EventLoop
“EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件”,是不是很难理解?说白了,EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。
Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的Channel 处理 I/O 操作,两者配合参与 I/O 操作。
3.ChannelFuture
Netty 是异步非阻塞的,所有的 I/O 操作都为异步的。因此,我们不能立刻得到操作是否执行成功,但是,你可以通过 ChannelFuture 接口的 addListener() 方法注册一个 ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。并且,你还可以通过ChannelFuture 的 channel() 方法获取关联的Channel。
public interface ChannelFuture extends Future<Void> { Channel channel(); ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> var1); ...... ChannelFuture sync(); throws InterruptedException; } |
另外,我们还可以通过 ChannelFuture 接口的 sync()方法让异步的操作变成同步的。
4.ChannelHandler 和 ChannelPipeline
ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
ChannelPipeline 为 ChannelHandler 的链,提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API 。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。
我们可以在 ChannelPipeline 上通过 addLast() 方法添加一个或者多个ChannelHandler ,因为一个数据或者事件可能会被多个 Handler 处理。当一个 ChannelHandler 处理完之后就将数据交给下一个 ChannelHandler 。