分布式学习笔记(八)——Netty初识

一、 什么是Netty

Netty是一个高性能、异步事件驱动的NIO网络编程框架。基于 JAVA NIO 提供的 API 实现。提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,Netty还可以实现自定义各种协议,因为Netty能够通过codec自己来编码/解码字节流。

二、Netty的特性

1、异步非阻塞通信

Java NIO采用I/O多路复用技术,把多个 I/O 的阻塞复用到同一个 select 的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O 多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。

JDK1.4 提供了对非阻塞 IO(NIO)的支持,JDK1.5_update10 版本使用 epoll 替代了传统的 select/poll,极大的提升了NIO 通信的性能。

与socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel 两种不同的套接字通道实现。这两种新增的通道都支持阻塞和非阻塞两种模式。一般来说,低负载、低并发的应用程序可以选择同步阻塞 IO 以降低编程复杂度。但是对于高负载、高并发的网络应用,需要使用 NIO 的非阻塞模式进行开发。

Netty 架构按照 Reactor 模式设计和实现,底层是基于Java NIO来实现,但是功能更加强大,也更加方便。

2、零拷贝

(1)传统的socket读写时,JVM 会将堆内存数据拷贝一份到内存缓冲区中,然后再拷贝到 Socket缓冲区中。而Netty在进行I/O时,是使用的堆外直接内存进行Socket读写,不需要进行内存缓冲区的拷贝
(2)Netty使用组合Buffer,操作组合Buffer和操作一个Buffer一样方便,无需通过拷贝将多个Buffer组合成一个大的Buffer对象。
(3)Netty 的文件传输采用了 transferTo()方法,它可以直接将文件缓冲区的数据发送到目标 Channel,避免了传统通过循环 write()方式导致的内存拷贝问题。

注:Netty封装了NIO,所以Netty也使用Buffer进行I/O操作。

3、内存池

同线程池一样,为了减少缓冲区Buffer对象的创建和销毁所带来的资源消耗,采用池技术,尽量重用buffer对象。

4、线程模型

Netty采用了Reactor线程模型:分为Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型。
Reactor单线程模型:是所有的IO操作都在同一个 NIO 线程上面完成。
Reactor多线程模型:由专门一个NIO线程-Acceptor线程用于监听客户端连接,然后由一个NIO线程池里的线程来处理后面的I/O操作。
主从Reactor线程模型:由一个NIO线程池来监听客户端连接,然后由另一个NIO线程池来进行I/O操作。

5、串行无锁化设计

在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计。
在这里插入图片描述
Netty的NioEventLoop读取到消息之后,直接调用ChannelPipeline的fireChannelRead,只要用户不主动切换线程,一直会由 NioEventLoop 调用到用户的 Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。

6、高效的并发编程

Netty 的高效并发编程主要体现在如下几点:volatile的大量、正确使用、CAS 和原子类的广泛使用、线程安全容器的使用、通过读写锁提升并发性能。

7、高性能的序列化框架

Netty 默认提供了对 Google Protobuf 的支持,通过扩展 Netty 的编解码接口,用户可以实现其它的高性能序列化框架。

8、灵活的 TCP 参数配置能力

Netty 在启动辅助类中可以灵活的配置 TCP 参数,满足不同的用户场景。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值