Netty核心组件和事件驱动

Netty学习指北01

Posted by MistRay on September 9, 2019

Netty学习指北01

前言

本系列主要是为了记录学习Netty的过程,并作为Netty实战的读书笔记使用.

Netty是什么?我为什么要用Netty?

Netty是一个致力于创建高性能网络应用程序的成熟的IO框架.
Java NIO的学习成本极高,并且代码可读性极差.(真的从入门到放弃)
业界内常见的设计网络通信的中间件大部分都使用了Netty作为网络层框架. netty

Netty简介

在网络编程领域,Netty是Java的卓越框架.她驾驭了Java高级API的能力.并将其隐藏在一个易于使用的 API之后.Netty使你可以专注于自己真正感兴趣的—>你的应用程序的独一无二的价值.

分类 Netty的特性
设计 统一的API,支持多种传输类型,阻塞和非阻塞的,简单而强大的线程模型真正的无连接数据报套接字支持,链接逻辑组件以支持复用
易于使用 翔实的JavaDoc和大量的示例集 不需要超过JDK1.6+的依赖
性能 拥有比Java的核心API更高的吞吐量以及更低的延迟 得益于池化和复用,拥有更低的资源消耗,最少的内存复制
健壮性 不会因为慢速,快速或者超载的连接而导致OutOfMemoryError
安全性 完整的SSL/TLS以及StartTLS支持 可用于受限环境下,如Applet的OSGI
社区驱动 发布快速而且频繁

异步和事件驱动

因为我们要大量的使用”异步”这个词,所以现在是一个澄清上下文的好机会.异步(即非同步)事件大家肯定熟悉. 异步事件也可以具有某种有序关系.通常,你只有在已经问了一个问题之后才会得到一个和它对应的答案, 而你在等待它的同时也可以做点别的事情.

本质上,一个既是异步的又是事件驱动的系统会表现出一种特殊的,对我们来说极具价值的行为:它可以以任意的顺序响应 在任意的时间点产生的事件.

这种能力对于实现最高级别的可伸缩性至关重要,定义为 一种系统,网络或者进程在需要处理的工作不断增长时,可以通过某种可行的方式或者扩大它的处理能力来适应这种增长的能力.

  • 非阻塞网络调用使我们可以不必等待一个操作的完成.完全异步的I/O正式基于这个特性构建的,并且更近一步:异步方法会立即返回, 并且在它完成时,会直接或者在稍后的某个时间点通知用户

  • 选择器使我们能够通过较少的线程便可以监视许多连接上的事件

Netty的核心组件

1.Channel

ChannelJavaNIO的一个基本构造. 它代表一个到实体(如一个硬件设备,一个文件,一个网络套接字或者一个能够执行一个或多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作

2.Future

Future提供了另一种在操作完成时通知应用程序的方式.这个对象你可以看做是一个异步操作结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问.
每个Netty的出站I/O操作都将返回一个ChannelFuture;也就是说,它们都不会阻塞.正如我们之前提到的一样,Netty是完全是异步和事件驱动的.

// 获取一个Channel
Channel channel = ;
ChannelFuture future = channel.connect(127.0.0.1,666);
channelFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        if(future.isSuccess()) {
            // doSomeThing
        }else{
            Throwable cause = future.cause();
            cause.printStackTrace();
        }          
    }
});

3.事件和ChannelHandler

Netty使用不同的事件来通知我们状态的改变或者是操作的状态.这使我们能够基于已经放生的事件来触发适当的操作.这些动作可能是:

  • 记录日志
  • 数据转换
  • 流控制
  • 应用逻辑

Netty是一个网络编程框架,所以事件是按照他们与入站或出站数据流的相关性进行分类的.可能由入站数据或者相关的状态更改而触发的事件包括:

  • 连接已被激活或连接失活
  • 数据读取
  • 用户事件
  • 错误事件

出站事件是未来江湖触发的某个动作的操作结果,这些动作包括:

  • 打开或者关闭到远程节点的连接
  • 将数据写到或者冲刷到套接字

4.选择器,事件和EventLoop

Netty通过触发事件将Selector从应用程序中抽象出来,消除了素有本来将需要手动编写的派发代码.在内部,将会为每个channel 分配一个EventLoop,用以处理所有事件,包括:

  • 注册感兴趣的事件
  • 将事件派发给ChannelHandler
  • 安排进一步动作

EventLoop本身只由一个线程驱动,其处理了一个channel的所有I/O事件,并且在该EventLoop的整个生命周期内部都不会改变. 所以Channel的回调操作是线程安全的.因此,你可以专注于提供正确的逻辑,用来在有感兴趣的数据要处理的时候执行.

Reference

转载

本文遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。