Netty笔记Netty简介

编程

Netty是一个异步和事件驱动的网络应用程序框架,用于快速开发可维护的高性能网络服务器和客户端。

Netty 是一个基于  Java NIO 服务端、客户端开源(Apache License 2.0)框架,是用于创建高性能、高可用的网络应用程序的框架,其极大的简化 Java 网络编程,使得程序员无需使用原生的 Java API 编写复杂的网络应用程序。许多公司和项目都使用了 Netty 作为网络通信框架,例如我们熟知的 Dubbo,Spark,Elasticsearch 等。

Netty 的特性

  • 统一的 API,几乎不需要怎么修改代码就可以切换阻塞/非阻塞的 Socket 连接。
  • 功能强大,支持多种传输协议。
  • 高性能,比原生 Java API 具有更高的吞吐量、更低的延迟,资源消耗更少,零拷贝减少内存的复制
  • 简单易用,健壮,安全,有活跃的社区

1.1、IO 类型--BIO、NIO

在简要介绍 Netty 之前,先来简要介绍一下 Java 网络编程的 IO 模型,Java 虽然是原生支持网络编程,不过在早期的 Java API,只提供阻塞 IO 支持,直到 JDK  1.4 版本,Java 才支持非阻塞 IO 的支持。

阻塞 IO(BIO)

BIO 也可以称作为 OIO,只有在所需数据或者资源准备就绪后,线程才会进行下一步的操作,这种 IO 模型会造成大量的资源浪费,同时也难于支撑十万、百万级别的并发量。

从下图可以看出,一个线程只能支持一个连接,因此在任何时候,都会有大量的线程处于休眠或者阻塞等待状态,资源利用效率不高,造成内存等资源的浪费,也无法通过创建更多的线程支持更多的链接

非阻塞 IO (NIO)

非阻塞 IO ,是为了消除 BIO 带来的弊端,其通过 Selector(选择器),Selector 不断检查同一时间已经准备就绪的连接,实现更少的线程处理更多的连接。

  • 减少内存内核线程上下文切换带来的资源消耗,可以同时处理更多的连接
  • 在高并发下,处理和调度 IO 是非常容易出错,这也是为什么许多项目不直接使用 Java NIO API 作为底层通信框架的原因

1.2、Netty 核心组件

Netty 的核心组件包括如下几个部分:

  • Channel
  • 回调
  • Future
  • 事件和 ChannelHandler (事件处理器)

Channel

Channel 是 Java NIO 的基本构造,其提供了基本的 IO 操作( bind()、connect()、read()、write() )等,代表着一个 IO 实体(一个文件,Socket 连接,一个硬件设备等)连接,可以进行读写操作。Netty 提供  Channel 接口极大的简化了直接使用 Socket 的复杂性。

回调

一个提供给另外一个方法使用的方法的引用,使得其他方法可以在适当的时候调用此引用指向的方法。

Future

是异步操作完成后结果返回的占位符,如果异步操作已经完成,可以通过此提供的方法对返回结果进行访问。

事件和 ChannelHandler

事件可以看成是需要处理的任务,而 ChannelHandler 是对事件进行处理的执行者。例如客户端向服务端发送一个请求(事件),Netty 会派发给相应的事件处理器(ChannelHandler)。

1.3、一些补充

Channel 的生命状态

  • Unregistered:Channel 已经被创建,但未注册到 EventLoop
  • Registered:已经注册到 EventLoop
  • Active :活跃状态,已经连接到远程节点,可以发送和接收数据
  • Inactive:没有连接到远程节点

EventLoop、EventLoopGroup

EventLoop 只由一个线程驱动,EventLoopGroup 管理着多个 EventLoop。Channel 创建后会注册到一个 EventLoop 中,在其整个生命周期都不会改变所注册的 EventLoop。EventLoop 是 Netty 的核心抽象,例如将 Selector 从应用程序中抽取出来:

  • 注册需要监听的事件
  • 将时间派发给 ChannelHandler
  • 处理 Channel 的 IO 事件

理解 ChannelHandlerContext、Channel 、ChannelHandler、ChannelPipeline 之间的关系

其它的功能将在下面章节使用到的时候进行介绍,下一节将开始 Netty 编程之旅,编写一个 HelloWorld 级的 Netty 程序。

参考资料《Netty 实战》

以上是 Netty笔记Netty简介 的全部内容, 来源链接: utcz.com/z/519024.html

回到顶部