Netty 总结与补充(十)

  • 简单介绍一下 Netty?
  • 你为什么会用到Netty?
  • 说说你对Netty的认识?
  • 为什么选用Netty来做通信框架?

Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。

特点和优势:

  • 使用简单:封装了 NIO 的很多细节,使用更简单。
  • 功能强大:预置了多种编解码功能,支持多种主流协议。
  • 定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。
  • 性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。
  • 为什么大多数rpc框架都用netty?(聊了下Netty的特点)
  • 为什么 Netty 性能高
  • Netty怎么实现高性能的?Netty高性能主要依赖了哪些特性?
  • Netty为啥效率高(零拷贝,线程模型)
  • Netty为什么快(基于NIO+零拷贝)

传统 RPC 调用性能差的三宗罪

网络传输方式问题:传统的 RPC 框架或者基于 RMI 等方式的远程服务(过程)调用采用了同步阻塞 IO,当客户端的并发压力或者网络时延增大之后,同步阻塞 IO 会由于频繁的 wait 导致 IO 线程经常性的阻塞,由于线程无法高效的工作,IO 处理能力自然下降。

序列化方式问题:Java 序列化存在如下几个典型问题:

  1. Java 序列化机制是 Java 内部的一种对象编解码技术,无法跨语言使用;例如对于异构系统之间的对接,Java 序列化后的码流需要能够通过其它语言反序列化成原始对象(副本),目前很难支持;

  2. 相比于其它开源的序列化框架,Java 序列化后的码流太大,无论是网络传输还是持久化到磁盘,都会导致额外的资源占用;

  3. 序列化性能差(CPU 资源占用高)。

线程模型问题:由于采用同步阻塞 IO,这会导致每个 TCP 连接都占用 1 个线程,由于线程资源是 JVM 虚拟机非常宝贵的资源,当 IO 读写阻塞导致线程无法及时释放时,会导致系统性能急剧下降,严重的甚至会导致虚拟机无法创建新的线程。

Netty 高性能之道

  • 异步非阻塞通信:用最少的资源做更多的事。

  • 零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。

  • 内存池:申请的内存可以重用。

  • 高效的 Reactor 线程模型

  • 无锁化的串行设计理念:避免使用锁带来的性能开销。

  • 高效的并发编程

  • 高性能的序列化框架:支持 protobuf 等高性能序列化协议。

  • 灵活的 TCP 参数配置能力

Netty 适用场景

  • 高并发,实时处理,如:游戏服务器,聊天服务器,SOA 调用框架,RPC 框架等。

  • 对网络协议(传输层与应用层)有一定的定制需求。

  • 一套代码可能需要同时支持 BIO 和 NIO。

而其他情况,Netty 并一不定适合,如:

  • 需求较简单的网络应用,则不必使用 Netty,毕竟在能满足需求的基础上,越简单越好。

  • 单次请求处理耗时较长的应用,这种情况下 NIO 没有优势,此时使用 BIO 的方式可能效果会更好。

  • 除了Netty还知道其它的网络通信框架吗?

Netty & MINA & Jetty

Netty 和 MINA 经常会放在一起比较,主要是因为两个框架有很多相似的地方,或者说它们本身就是一对兄弟 -- 都是基于 Java NIO 封装的一个网络框架。其实更深入的了解会发现,Netty 的作者Trustin Lee也是 MINA 的作者(当然已经不继续参与了),据说他是对 MINA 的代码不满意,才重新写了 Netty,所以看 Netty 的代码经常能看到 MINA 的影子,但就现在来说 Netty 的社区远比 MINA 要活跃,迭代频率也更高,大部分的特性也优于 MINA。

至于 Jetty 之所以会拿来比较,主要是因为和 Netty 名字类似,但其实这两者并没有很大的可比性,因为 Jetty 是一个轻量级的 servlet 容器,而 Netty 是一个基于 NIO 的异步网络编程框架,基于 Netty 可以实现自己的 servlet 容器或者其它网络应用。

  • NIO里 同步、异步调用方式的具体实现
  • Netty服务调用如何变成同步的?
  • Netty异步编程怎么做的?

netty 是异步通过事件机制来发送和接收信息的。但如果是请求-响应的模块就需要将netty修改为同步调用的方式。

具体思路是:

1、在往通道里写数据时,在通道里通过setAttachment的方式往里面添加锁(CountDownLatch)

此时线程会被阻塞

2、在处理器(handle)里接收到返回数据后,通过通道的getAttachment获取到前面加的锁

解锁,并将结果返回,这样外面的线程就可以拿到数据啦。

  • Netty中的select过程?(Reactor模型+ IO多路复用)

参考

netty 同步调用-CSDN博客

一文读懂网络框架Netty_文化 & 方法_蔡昱星_InfoQ精选文章

Netty系列之Netty高性能之道_后端_李林锋_InfoQ精选文章

相关推荐
qdprobot19 分钟前
ESP32桌面天气摆件加文心一言AI大模型对话Mixly图形化编程STEAM创客教育
网络·人工智能·百度·文心一言·arduino
hakesashou2 小时前
Python中常用的函数介绍
java·网络·python
C++忠实粉丝2 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态2 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
Estar.Lee2 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
蝶开三月2 小时前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
G丶AEOM2 小时前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全
儒道易行2 小时前
【DVWA】RCE远程命令执行实战
网络·安全·网络安全
Koi慢热3 小时前
路由基础(全)
linux·网络·网络协议·安全
hzyyyyyyyu5 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全