Netty in action ——— 异步和事件驱动

本文是Netty文集中“Netty in action”系列的文章。主要是对Norman Maurer and Marvin Allen Wolfthal 的 《Netty in action》一书简要翻译,同时对重要点加上一些自己补充和扩展。

概要

Netty核心组件

  • Channels —— 通道
  • Callbacks —— 回调
  • Futures
  • Events and handlers —— 事件和执行器

Channels

Channel是基于java NIO结构,它表示: 一个打开的到一个实体的连接。实体如,一个计算机硬件驱动、一个文件、一个网络socket、或者一个有能力处理一个或多个I/O操作(比如,读/写功能)的程序组件。 可以将Channel想象成一个运输工具,用于输入和输出数据。同样地,Channel能被open、close、connected、disconnected

Callbacks

回调是在一个适当的时间被调用的,回调是一个最常见的方法之一用于通知一个感兴趣的操作已经完成。 Netty使用一个内部的回调处理事件;当一个回调被触发时事件能被一个实现channelHandler 接口的实例处理。

Futures

Future提供了另一个方式去通知应用当一个操作已经完成。Future对象作为一个异步操作结果的占位符返回,异步操作将在未来的某个时刻完成并提供一个可访问的结果。 JDK提供了 interface java.util.concurrent.Future,但JDK对Future的实现需要你手动检查是否一个操作已经完成或者堵塞直到操作完成。这很笨重的,所以Netty提供了它自己的实现 ———— ChannelFuture,用于一个异步操作执行时。

ChannelFuture提供了一个附加的方法,这个方法允许你注册一个或多个ChannelFutureListenner实例。“operationComplete()”在操作完成时会被回调。监听者能够确定操作是否成功或失败。如果失败了,我们能够恢复错误。简而言之,ChannelFutureListener的通知机制消除了手动检查操作完成的需要。 ChannelFutureListenner 将 future 和 callback 组合起来了。

Netty的出站I/O操作将返回一个ChannelFuture:

Events and handlers

Netty使用不同的事件来通知我们关于状态的变化或者操作的状态。这允许我们基于事件的发生触发适当的操作。 Netty将事件划分为“入站数据流”或“出站数据流” 入站操作或者一个相关的状态变化包括:

  • 连接状态的活跃(active)或不活跃(inactive)
  • 数据的读取
  • 用户事件触发
  • 错误事件触发

一个出站事件是一个Future中动作的结果。出站事件比如:

  • 开启或关闭一个远端连接
  • 写或刷新数据到套接字中

每个事件能被分配到一个用户实现的一个处理类的方法中。目前你可以认为每一个handler的实例都是一个callback的类型,用于执行一个特定事件的返回。 Netty提供了一个可扩展的预定义处理器集合使你能够拆箱即用,包括如HTTP、SSL/TLS协议的处理。

SELECTORS,EVENTS,AND EVENT LOOPS

Netty通过触发事件将Selector从应用中提取了出来。一个EventLoop被分配给每个Channel用于处理这个Channel的所有事件。 EventLoop本身由一个线程驱动,该线程处理一个Channel的所以I/O事件,并且在整个EventLoop的生命周期都不会改变持有的线程。

后记

本文主要是对Netty的部分核心组件做了一个简单的介绍。各个组件和模块会在后续的文章中进行详细的介绍。 若文章有任何错误,望大家不吝指教:)

参考

《Netty in action》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏咖啡的代码人生

Log4j 1.2.17 使用

首先下载Log4j有关的jar包,虽然现在 Log4j更新到了2.0,但是和以前的1.X版本完全不兼容,所以今天我们还是先来使用1.X的版本,等时间再久一点,...

3399
来自专栏开源优测

[接口测试 - 基础篇] 12 还是要掌握python日志管理模块的

python logging模块介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的...

3408
来自专栏dalaoyang

SpringBoot集成Thymeleaf

上一篇给大家介绍了springboot整合freemarker,这一片来继续为大家介绍一种模板thymeleaf。 首先在项目中增添thymeleaf依赖spr...

3448
来自专栏Java后端生活

JavaWeb(七)JSP-2

1306
来自专栏aoho求索

Spring Cloud Gateway 入门

Spring Cloud Gateway介绍 前段时间刚刚发布了Spring Boot 2正式版,Spring Cloud Gateway基于Spring Bo...

9447
来自专栏运维

Redis3.0.7集群部署完整版

Redis集群没有出来前,一直使用Codis集群,现在部署Redis集群看看效果如何。

1052
来自专栏Java 源码分析

SpringBoot 笔记 ( 三 ):日志系统

SpringBoot 笔记 ( 三 ):日志系统 1、日志框架 日志框架就是防止我们再去像以前那样,一直进行System.out.println(“”)将关键数...

5845
来自专栏LanceToBigData

细说log4j

可能做过java项目的基本上都是用过log4j,它是用来做java日志的。比如我们做一个项目分为很多的模块,那我们怎么想要知道它什么时候启动了,这时候我们可以使...

2095
来自专栏猿天地

Spring Boot 使用WebAsyncTask异步返回结果

在Spring Boot中(Spring MVC)下请求默认都是同步的,一个请求过去到结束都是由一个线程负责的,很多时候为了能够提高吞吐量,需要将一些操作异步化...

2112
来自专栏web编程技术分享

三分钟学会用SpringMVC搭建最小系统(超详细)

3948

扫码关注云+社区