没有合适的资源?快使用搜索试试~ 我知道了~
Netty 17道面试题和答案.docx
需积分: 0 0 下载量 65 浏览量
2023-06-15
19:16:18
上传
评论
收藏 300KB DOCX 举报
温馨提示
试读
17页
Netty 17道面试题和答案.docx
资源推荐
资源详情
资源评论
Netty 是什么?
1、Netty是一个基于 NIO的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程
序。
2、它极大地简化并优化了 TCP和 UDP套接字服务器等网络编程,并且性能以及安全性等很多方面
甚至都要更好
3、支持多种协议如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议。
用官方的总结就是:Netty 成功地找到了一种在不妥协可维护性和性能的情况下实现易于开发,性
能,稳定性和灵活性的方法。
除了上面介绍的之外,很多开源项目比如我们常用的 Dubbo、RocketMQ、
Elasticsearch、gRPC 等等都用到了 Netty。
网络编程我愿意称 Netty 为王。
为什么要用 Netty?
为什么要用 Netty 呢?能不能说一下自己的看法。
因为 Netty 具有下面这些优点,并且相比于直接使用 JDK 自带的 NIO 相关的 API 来说更加易用。
1、统一的 API,支持多种传输类型,阻塞和非阻塞的。
2、简单而强大的线程模型。
3、自带编解码器解决 TCP 粘包/拆包问题。
4、自带各种协议栈。
5、真正的无连接数据包套接字支持。
6、比直接使用 Java 核心 API 有更高的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。
7、安全性不错,有完整的 SSL/TLS 以及 StartTLS 支持。
8、社区活跃
9、成熟稳定,经历了大型项目的使用和考验,而且很多开源项目都使用到了 Netty,比如我们经常
接触的 Dubbo、RocketMQ 等等。
10、……
Netty 应用场景了解么?
能不能通俗地说一下使用 Netty 可以做什么事情?
1、作为 RPC 框架的网络通信工具:我们在分布式系统中,不同服务节点之间经常需要相互调用,
这个时候就需要 RPC 框架了。不同服务节点之间的通信是如何做的呢?可以使用 Netty 来做。比如
我调用另外一个节点的方法的话,至少是要让对方知道我调用的是哪个类中的哪个方法以及相关
参数吧!
2、实现一个自己的 HTTP 服务器:通过 Netty 我们可以自己实现一个简单的 HTTP 服务器,这个
大家应该不陌生。说到 HTTP 服务器的话,作为 Java 后端开发,我们一般使用 Tomcat 比较多。一
个最基本的 HTTP 服务器可要以处理常见的 HTTP Method 的请求,比如 POST 请求、GET 请求等等。
3、实现一个即时通讯系统 :使用 Netty 我们可以实现一个可以聊天类似微信的即时通讯系统,
这方面的开源项目还蛮多的,可以自行去 Github 找一找。
4、实现消息推送系统:市面上有很多消息推送系统都是基于 Netty 来做的。
5、 ……
Netty 核心组件有哪些?分别有什么作用?
Netty 核心组件有哪些?分别有什么作用?
Channel
Channel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()、connect()、read()、
write()等。
比较常用的 Channel 接口实现类是 NioServerSocketChannel(服务端)和 NioSocketChannel(客户端),这
两个 Channel 可以和 BIO 编程模型中的 ServerSocket 以及 Socket 两个概念对应上。Netty 的 Channel
接口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。
EventLoop
这么说吧!EventLoop(事件循环)接口可以说是 Netty 中最核心的概念了!
《Netty 实战》这本书是这样介绍它的:
EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。
是不是很难理解?说实话,我学习 Netty 的时候看到这句话是没太能理解的。
说白了,EventLoop 的主要作用实际就是负责监听网络事件并调用事件处理器进行相关 l/O 操作的
处理。
那 Channel 和 EventLoop 直接有啥联系呢?
Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的 Channel 处理 I/O
操作,两者配合参与 I/O 操作。
ChannelFuture
Netty 是异步非阻塞的,所有的 I/O 操作都为异步的。
因此,我们不能立刻得到操作是否执行成功,但是,你可以通过 ChannelFuture 接口的 addListener()
方法注册一个 ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。
并且,你还可以通过 Channel Future 的 channel()方法获取关联的 Channel
public interface ChannelFuture extends Future<Void>{
Channel channel();
ChannelFuture addListener(GenericFutureListener<?extends Future<?super Void>>var1);
ChannelFuture sync()throws InterruptedException;
﹞
另外,我们还可以通过 ChannelFuture 接口的 sync()方法让异步的操作变成同步的。
ChannelHandler 和 ChannelPipeline
下面这段代码使用过 Netty 的小伙伴应该不会陌生,我们指定了序列化编解码器以及自定义的
ChannelHandler 处理消息。
b. group(eventLoopGroup)
. handler(new ChannelInitializer<SocketChannel>(){
@Override
protected void initChannel(SocketChannel ch){
ch. pipeline(). addLast(new
NettyKryoDecoder(kryoSerializer,RpcResponse. class));
ch. pipeline(). addLast(new
NettyKryoEncoder(kryoSerializer,RpcRequest. class));
ch. pipeline(). addLast(new KryoClientHandler());
}
});
channelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
ChannelPipeline 为 ChannelHandler的链,提供了一个容器并定义了用于沿着链传播入站和出站事件流
的 API 。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。
我们可以在 ChannelPipeline 上通过 addLast()方法添加一个或者多个 ChannelHandler,因为一个数据或
者事件 可能会被多个 Handler 处理。当一个 ChannelHandler 处理完之后就将数据交给下一个
ChannelHandler。
剩余16页未读,继续阅读
资源评论
入伍击寇
- 粉丝: 129
- 资源: 4706
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功