Netty的主要组成模块:
  • Channels
  • Callbacks
  • Futures
  • Events 和 handlers
这些模块代表了不同类型的概念:资源,逻辑和通知。你的应用将会利用这些模块来获取网络和网络上的数据。
对每个组件,我们会给出一个基本的定义,并且在合适的情况下,用一个简单的代码实例说明它的用法。
 
1. Channels 通道
一个Channel是Java NIO的一个基本抽象。它代表了:一个连接到比如硬件设备,文件,网络socket等实体的开放连接,或者是一个能够完成一种或多种譬如读或写等不同I/O操作的程序。
目前,可以把一个Channel想象成一个输入和输出数据的媒介。同样地,它可以被打开或者关闭,连接或者断开。
 
2. Callbacks 回调
一个callback就是一个方法,一个提供给另一个的方法的引用。这让另一个方法可以在适当的时候回过头来调用这个callback方法。Callbacks在很多编程情形中被广泛使用,是用于通知相关方某个操作已经完成最常用的方法之一。
Netty在处理事件时内部使用了callback;当一个callback被触发,事件可以被ChannelHandler的接口实现处理。下面的代码清单是这样一个例子:当一个新的连接建立后,ChannelHandler的callback方法channelActive()会被调用,然后打印一条消息。
代码清单 1.1 ChannelHandler被一个callback触发
 
 

 
3. Future
一个Future提供了当另一个操作完成时如何通知应用的方法。Future对象充当了一个存放异步操作结果的占位符(placeholder)角色;它会在将来某个时间完成并且提供对操作结果的访问。
JDK搭载了接口java.util.concurrent.Future, 但是提供的接口实现只允许你手动检查操作是否已经完成,或者就一直阻塞到操作完成。这非常麻烦,所以Netty提供了它自己的ChannelFuture实现,用于执行异步操作。
ChannelFuture提供了额外的方法让我们可以注册一个或者多个ChannelFutureListener实例。监听者的callback方法operationComplete()在操作完成时被调用。然后监听者可以查看这个操作是否成功完成,还是出错了。如果出错了,我们可以从future获取Throwable。简单来说,ChannelFutureListener提供的通知机制免去了手动检查操作完成情况的麻烦。
每个Netty输出的I/O操作都会返回一个ChannelFuture;就是说,没有一个操作是阻塞的。就像我们之前所说的,Netty由下至上都是异步和事件驱动的。
代码清单1.2中,一个ChannelFuture做为一个I/O操作的一部分被返回。这里,connect()会无阻塞地直接返回,调用会在后台完成。什么时候会完成取决于多个因素,但是这个担心已经从代码里被抽离(abstract away)出来了。因为这个线程没有阻塞在等待这个操作完成,它可以同时做其他事情,因此更有效率地利用资源。
代码清单1.2  异步连接
 
代码清单1.3展示了如何利用ChannelFutureListener。首先你连接到一个远端。然后用connect()返回的ChannelFuture注册一个新的ChannelFutureListener。当监听器被通知连接建立时,检查状态(1)。如果这个操作成功,你写数据到这个Channel。否则你从ChannelFuture中读取Throwable。
代码清单1.3 运作中的Callback
 
注意错误处理完全取决于你,取决于某个具体错误施加的限制。比如说,连接错误发生时,你可以试着重连或者和另一个远端建立连接。
如果你认为一个ChannelFutureListener是一个callback的复杂版本,那你想对了。事实上,callbacks和Futures是互补的机制;两者结合起来构成了Netty的关键模块之一。
 
4. Events 和 handlers
Netty用细分的events来通知我们状态的变化或者操作的状况。这让我们可以基于发生的events来触发适当的行为。这类行为可能包括
  • 日志记录
  • 数据传送
  • 流控制
  • 应用逻辑
Netty是一个网络编程框架,所以events按它们和输入或者输出数据流的关系来分类。
可能被输入数据或者相关状态改变触发的events包括:
  • 活跃或者停用的连接
  • 读数据
  • 用户events
  • 错误events
而输出event则是会触发将来行为的操作的结果,可能会是:
  • 打开或者关闭到远端的连接
  • 写或者刷数据到一个socket
每一个event都可以被分派到一个用户实现的handler对象的方法。这是一个事件驱动的模型如何直接转变为应用模块的好例子。图1.3展示了一个event如何被一串这样的event handler处理。
图1-3 经过一串ChannelHandler的输入输出事件
 
Netty的ChannelHandler提供了如图1.3中展示的handler的基本抽象。我们在适当的时候会更多地谈论到ChannelHandler,但是现在你可以认为每个handler实例就是一种响应某个具体event的callback。
Netty提供了大量你可以马上拿来用的预定义handler,包括HTTP和SSL/TLS等协议的handler。在内部,ChannelHandler自己也用events和futures,和你的应用是同样抽象的消费者。
 
5. 汇总
在这一章,初次接触了Netty针对高性能网络编程的方案,以及Netty实现的一些主要模块。让我们把讨论过的东西总结下。
FUTURES,CALLBACKS和HANDLERS
Netty的异步编程模型是建立在Futures和callbacks概念之上的,在更深一层分派事件到handler方法。这些元素结合起来提供了一个处理环境,让你的应用逻辑可以逐步发展而不用关心网络操作。这一个Netty设计方案的一个关键目标。
快速地拦截操作和传送输入输出数据只要求你提供callbacks或者用操作返回的Futures。这让链式操作变得容易和有效,同时促进了可重用和通用代码的编写。
SELECTORS, EVENTS, AND EVENT LOOPS
Netty通过引发事件把Selector从应用中抽象出来,省掉了所有原本需要手写得调度代码。在内部,一个EventLoop被分配到每个Channel来处理所有的events,包括
  • 注册感兴趣的events
  • 分派events到ChannelHandlers
  • 安排将来的行为
EventLoop自己仅由一个线程驱动,这个线程处理一个Channel所有的I/O事件,这个关系在Eventloop的生命周期内不会改变。这个简单强大的设计消除了任何你可能对ChannelHandler同步的顾虑,因此你能够专注于在数据被处理时,提供正确的执行逻辑。在我们详细探讨Netty的线程模型时将会看到的,这个API简洁并且紧凑。

Netty的核心组件的更多相关文章

  1. Netty:Netty的介绍以及它的核心组件(一)—— Channel

    1. Netty 介绍 Netty 是一个无阻塞的输入/输出(NIO)框架,它使开发低级网络服务器和客户端变得相对简单.Netty为需要在套接字级别上工作的开发人员提供了令人难以置信的强大功能,例如, ...

  2. 基于大量图片与实例深度解析Netty中的核心组件

    本篇文章主要详细分析Netty中的核心组件. 启动器Bootstrap和ServerBootstrap作为Netty构建客户端和服务端的路口,是编写Netty网络程序的第一步.它可以让我们把Netty ...

  3. Netty学习摘记 —— 初步认识Netty核心组件

    本文参考 我在博客内关于"Netty学习摘记"的系列文章主要是对<Netty in action>一书的学习摘记,文章中的代码也大多来自此书的github仓库,加上了一 ...

  4. Netty 5用户指南

    Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序.换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协 ...

  5. 第一章:Netty介绍

    1. Netty介绍  Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,Netty是基于NIO实现的,所以整个Netty都是异步操作,网络应用 ...

  6. Netty实战一之异步和事件驱动

    Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端. 使用Netty你可以并不是很需要网络编程.多线程处理.并发等专业Java知识的积蓄. Net ...

  7. Netty 系列二(传输).

    一.前言 上一篇文章我们提到 Netty 的核心组件是 Channel.回调.Future.ChannelHandler.EventLoop,这篇文章主要是对 Channel (Netty传入和传出数 ...

  8. 基于netty实现单聊、群聊功能

    学习资料 https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521 收获: 转载 1. Nett ...

  9. 一篇文章,读懂Netty的高性能架构之道

    一篇文章,读懂Netty的高性能架构之道 Netty是由JBOSS提供的一个java开源框架,是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架, ...

随机推荐

  1. 搭建jenkins实现自动化部署

    搭建jenkins实现自动化部署 一.安装jenkins 1.添加yum repos,然后安装 sudo wget -O /etc/yum.repos.d/jenkins.repo https://p ...

  2. 二丶CSS

    一.css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,对html标签的渲染和布局 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 二.css的 ...

  3. javaweb c3p0连接oracle12c

    最近在搞javaweb,在连接池上碰到了一系列的问题,在Junit测试时,oracle12c报错: ORA-28040: 没有匹配的验证协议 百度解决:修改 $ORACLE_HOME/network/ ...

  4. python3 集合(set)

    一.定义:集合是一个无序不重复元素序列 语法: #---------------两种写法-------------------------# parame = {value1,value2,value ...

  5. nginx windows could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

    nginx 为windows版本 在配置文件nginx.conf 的http{}段增加一行配置 server_names_hash_bucket_size 64; 如果64不够可以设128等

  6. 神经网络的另一种非线性阶跃函数---ReLU函数

    import numpy as np import matplotlib.pylab as plt from matplotlib.font_manager import FontProperties ...

  7. Python Trick —— 命令行显示

    1 应用场景 在命令行展示下,有以下两种场景. 进度条显示.在同一行展示不断的更新的进度条. 信息显示/隐藏控制.比如希望向多个用户展示不同信息,各个用户彼此保密. 2 进度条展示 跟c语言类似,打印 ...

  8. 迅雷最新bug已被找到!mac不用登录也可以极速下载了!

    想体验迅雷不限速的快感吗?下载这款迅雷Mac(不限速免vip)免登录版吧!拥有了这款迅雷Mac破解版,电影.游戏等所有大文件都不在话下.体验极速的下载功能,尽在迅雷Mac(不限速免vip)破解版!需要 ...

  9. 咸鱼入门到放弃12--Filter(过滤器)*

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  10. 《JAVA程序设计》结对编程联系_四则运算(第一周:阶段总结)

    结对对象与其博客链接 20175312陶光远:https://www.cnblogs.com/20175312-tgy/p/10630566.html 需求分析 (一)功能需求 1.自动生成题目(本周 ...