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 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

JavaWeb(七)JSP-2

17960
来自专栏乐百川的学习频道

Spring学习笔记 Spring Roo 简介

一直以来,Java/Spring开发被认为是笨重的代表,无法快速生成项目原型和骨架。所以,Spring推出了Spring Roo这个项目,帮助我们快速生成项目原...

31470
来自专栏王清培的专栏

spring rest 容易被忽视的后端服务 chunked 性能问题

spring boot 容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 背景 sp...

55480
来自专栏Linyb极客之路

使用Spring Boot实现模块化

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

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

48780
来自专栏大魏分享(微信公众号:david-share)

重点来了:事务一致性的深入研究&EJB的全生命周期 | 从开发角度看应用架构5

14840
来自专栏LanceToBigData

细说log4j

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

32950
来自专栏猿天地

Spring Boot 使用WebAsyncTask异步返回结果

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

52920
来自专栏dalaoyang

SpringBoot集成Thymeleaf

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

42480
来自专栏aoho求索

Spring Cloud Gateway 入门

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

1.3K80

扫码关注云+社区

领取腾讯云代金券