> 文档中心 > 学习netty第一步----了解什么是异步和事件驱动

学习netty第一步----了解什么是异步和事件驱动


今天看了看netty的大神之作,《netty实战》,给大家推荐推荐。

学习netty第一步----了解什么是异步和事件驱动

大家都知道netty是网络编程,在网络编程这一领域,netty的地位,无可撼动。

  • 1、netty----异步和事件驱动
    • 1、 java网络编程
      • 1.1、Java NIO
      • 1.2、Java Selector
    • 2、netty简介
      • 2.1、 netty的特性
      • 2.2、异步和事件驱动

1、netty----异步和事件驱动

Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。
Netty 优雅地处理了这些网络编程、多线程处理和并发等,这领域的知识。使得即使是网络编程新手也能使用。

1、 java网络编程

1.1、Java NIO

Java NIO 由以下几个核心部分组成:

Channels

Buffers

Selectors

基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。

在JAVA NIO 框架中,为了保证每个通道的数据读写速度JAVA NIO 框架为每一种需要支持数据读写的通道集成了Buffer的支持。

Buffer有两种工作模式: 写模式和读模式。在读模式下,应用程序只能从Buffer中读取数据,不能进行写操作。但是在写模式下,应用程序是可以进行读操作的,这就表示可能会出现脏读的情况。所以一旦您决定要从Buffer中读取数据,一定要将Buffer的状态改为读模式。

1.2、Java Selector

class java.nio.channels.Selector 是Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API以确定在一组非阻塞套接字中有哪些已经就绪能够进行 I/O 相关的操作。因为可以在任何的时间检查任意的读操作或者写操作的完成状态,所以如图 1-2 所示,一个单一的线程便可以处理多个并发的连接。
学习netty第一步----了解什么是异步和事件驱动

尽管已经有许多直接使用 Java NIO API 的应用程序被构建了,但是要做到如此正确和安全并
不容易。特别是,在高负载下可靠和高效地处理和调度 I/O 操作是一项繁琐而且容易出错的任务,
最好留给高性能的网络编程专家——Netty。

2、netty简介

2.1、 netty的特性

学习netty第一步----了解什么是异步和事件驱动

2.2、异步和事件驱动

Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。
比如:.记录日志,数据转化,流控制,应用程序逻辑等情况。事件是按照它们入站和出站数据流的相关性进行分类的。出站的动作包括 打开或者关闭到远程节点的连接,讲数据写到或者冲刷到套接字。

大概绘制一下,Netty是如何进行异步事件驱动设计的,下图参考了 NIOEventLoopNIOEventLoopGroup

学习netty第一步----了解什么是异步和事件驱动
EventExecutorGroup :一般来说是包含了 n 个 EventExecutor ,比如: NioEventLoopGroup 通过构造参数设置 EventExecutor 的数量,在初始化时会对应产生这么多的 EventExecutor

EventExecutor:负责处理具体的事件逻辑,在 NioEventLoop 中,每一个 NioEventLoop 都是一个线程,循环去队列中拉去任务执行,并且负责绑定 channel 的 selector.select .

HandlerContext:虚构的,这个上图依据了,ChannelHandlerContext,主要责任是:1. 事件处理责任链。2. 识别事件,依据不同事件,将EventHandler的对应的逻辑,交给绑定了 EventExecutor 处理。Context在创建时,就会从EventExecutorGroup 中 获得一个 EventExecutor 和他绑定,这样做的好处就是,减少从Group取Executor的频率(即不用每个事件过来都去找一个Executor去处理)

Event:表示事件,一般都是一个标识,比如说 Selector.select() 的 keys。
事件,驱动一系列行为,行为逻辑执行交由线程池中选择出的线程(EventExcutor) 完成,执行完毕后,可以通过 Future 和 Promise setSucees setFairure 方法,获取结果或触发相关回调代码,这便是 Netty 的 异步事件驱动。