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

相关文章

来自专栏linjinhe的专栏

epoll

epoll是Linux提供的I/O event notification facility。在需要监听的fd数量很多(成千上万)而同一时刻可读/可写的数量又比较...

1819
来自专栏JAVA高级架构

结合RPC框架通信谈 netty如何解决TCP粘包问题

因为自己造一个RPC框架的轮子时,需要解决TCP的粘包问题,特此记录,希望方便他人。这是我写的RPC框架的 GitHub地址 https://github.co...

703
来自专栏叁金大数据

自学Python十一 Python爬虫总结

  通过几天的学习与尝试逐渐对python爬虫有了一些小小的心得,我们渐渐发现他们有很多共性,总是要去获取一系列的链接,读取网页代码,获取所需内容然后重复上面的...

951
来自专栏H2Cloud

FFLIB网络框架单线程0.0.1版本-epoll_socket

更新:      封装了epoll和socket,目前是单线程版本 问题:      对于epoll_wait操作,何时将会触发EPOLLERR?      服...

3225
来自专栏jeremy的技术点滴

py3_cookbook_notes_03

2633
来自专栏企鹅号快讯

每日一学之socket编程(四)

图片来自于百度图片 NIO 专门为服务器而设计的API。能极大的提高IO的性能,避免使用大量线程。虽然是为了服务器而设计,但是依然可以被使用在客户端。 Chan...

1880
来自专栏小李刀刀的专栏

在ASP中实现UNIX时间戳

  在康盛创想发布UC以后,我曾经尝试为其编写ASP把版本的客户端类库,过程中发现了几个问题,首当其冲的当然是服务器端不支持非php平台的接口,这个问题直接导致...

3426
来自专栏行者悟空

利用Apache Spark实现pv统计分析

1022
来自专栏IT笔记

SpringMvc+Velocity的一些配置总结

前言 公司用了许久的struts2+hibernate,前两年时间SpringMvic+Shiro也有做过,大多都是基于JSP实现的界面展示层,最近一段使用使用...

3377
来自专栏抠抠空间

Django之admin的使用和源码剖析

1550

扫码关注云+社区