在上一篇博客中,我们给出了java高性能网络编程的技术基础,也简单的介绍了netty的核心构件,在这一篇博客中,我们将更加详细的研究netty的各个组件,并且密切关注它们是如何通过协作来支撑这些体系结构上的最佳实践的。

首先,我们会对Channel,EventLoop和ChannelFuture类进行讨论,这些类结合在一起,可以被认为是netty网络抽象的代表:

(1)Channel - Socket

表示基本的I/O操作,在基于java的网络编程中,基本构造是class socket。netty的channel接口提供的api,大大降低了直接使用socket类的复杂性,此外,channel也是拥有许多预定义的专门化实现的广泛类层次的根如:LocalServerChannel,NioDatagramChannel,NioSocketChannel,NioSctpChannel。

(2)EventLoop-控制流,多线程处理,并发

EventLoop定义了netty的核心抽象,用于处理的连接的生命周期中所发生的事件。下图展示了几个重要的实体之间的关系:

注:一个eventLoop在在它的生命周期只与一个thread绑定;

所有由eventLoop处理的I/O事件都将在它专有的thread上被处理;

一个channel在它的生命周期内只注册于一个eventLoop;

一个eventLoop可能会被分配给一个或者多个channel;

在此基础上,一个channel的所有的I/O操作都是由同一个线程(同一个eventLoop)去处理的,消除了对于同步的需要。

(3)ChannelFuture - 异步通知

正如我们之前所说的,netty的所有的I/O操作都是异步的,所以我们需要提供一种用于在之后的某个时间点确定其结果的方法;因此,netty提供了ChannelFuture接口,其addListener()方法注册了一个ChannelFutureListener,以便在某个操作完成时得到通知。(其实可以将其看成是将来要执行的操作的结果的占位符,它究竟在什么时候执行可能取决于若干因素,但是它肯定会被执行。)

(4)ChannelHandler和ChannelPipeline

从开发人员的角度来看,netty的主要组件是channelHandler  ,因为其方法是由网络事件触发的,channelHandler几乎可以处理任何类型的动作,甚至包括异常。例如,channelInboundHandler是我们经常需要实现的子接口,其用来接收入站事件和数据,当要给连接的客户端发送响应时,也可以通过channelInboundHandler冲刷数据。

channelPipeline提供了channelHandler 链的容器,使得事件流经channelPipeline是channelHandler的工作,他们是在应用程序的初始化或者引导阶段被安装的,这些对象接收事件,执行他们所实现的处理逻辑,并将数据传递给链中的下一个channelHandler,他们的执行顺序是他们被添加的顺序决定的。当然入站和出站的channelHandler可以被安装到同一个channelPipeline中。

这里多说一句,实际上当channelHandler被注册到channelPipeline时,它将会被分配一个channelHandlerContext,其代表了channelHandler和channelPipeline之间的绑定,这个对象主要被用来写出站数据,其上的每一个方法,都提供了简单的将事件传递给下一个channelHandler方法的实现。在netty中,有两种发消息的方式,直接写到channel中或者写到和channelHandler相关联的channelHandlerContext对象中,前一种方式导致消息从channelPipeline的尾端开始流动,后一种方式导致消息从channelPipeline的下一个channelHandler开始流动。

netty以适配器的形式提供了大量的默认的channelHandler的实现,这些是适配器的子类将自动的把事件转发到链中的下一个channelHandler,因此我们只需要重写我们需要处理的方法和事件。

(5)编码器和解码器

当netty接收或者发送一个消息时,就会发生一次数据转换,入站消息被解码,出站消息将会被编码,netty也为编码器和解码器提供了不同类型的抽象类,并且所有的编码器和解码器都实现了channelOutboundHandler或channelInboundHandler接口。

(6)引导

netty的引导类,为应用程序的网络层配置提供了容器,这涉及将一个进程绑定到某个指定的端口,或将一个进程连接到另一个运行在某个指定主机的指定端口上的进程。

有两种类型的引导:一种用于客户端(Bootstrap)用于连接到远程主机和端口,一种用于服务端(ServerBootstrap)绑定到本地的端口。ServerBootstrap需要两个EventLoopGroup而Bootstrap只需要一个,我们来看一下为什么:

因为服务器需要两组不同的channel,第一组将只包含一个ServerChannel代表绑定到服务器自身本地端口正在监听的套接字,而第二组将包含创建的用来处理传入客户端连接的channel。与serverChannel 相关联的EventLoopGroup将分配一个负责为传入连接请求创建channel的EventLoop,一旦连接被接受,第二个EventLoopGroup就会给他的channel分配一个EventLoop。如下图所示:

(7)总结

这一章我们从技术和体系结构两个角度分析讨论了netty的组件,下面我们将深入研究这些组件。

一起来读Netty In Action之netty的组件和设计(二)的更多相关文章

  1. Essential Netty in Action 《Netty 实战(精髓)》读书笔记一

    NIO 最初是为 New Input/Output 的缩写.然而,Java 的 API 已经存在足够长的时间,它不再是新的.现在普遍使用的缩写来表示Nonblocking I/O (非阻塞 I/O). ...

  2. 【推荐】《Netty in action》书籍

    最近准备开始阅读一下<Netty in action>并且准备构架设计一个分布式系统.用于新项目. 貌似压力很大啊.压力就是东西.希望自己能够调节好. Netty in action是Ne ...

  3. Netty In Action中文版 - 第五章:Buffers(缓冲)

    本章介绍 ByteBuf ByteBufHolder ByteBufAllocator 使用这些接口分配缓冲和运行操作 每当你须要数据传输时,它必须包括一个缓冲区.Java NIO API自带的缓冲区 ...

  4. 《Netty in action》 读书笔记

    声明:这篇文章是记录读书过程中的知识点,并加以归纳总结,成文.文中图片.代码出自<Netty in action>. 1. 为什么用Netty? 每个框架的流行,都一定有它出众的地方.Ne ...

  5. Netty In Action中文版 - 第七章:编解码器Codec

    http://blog.csdn.net/abc_key/article/details/38041143 本章介绍 Codec,编解码器 Decoder,解码器 Encoder,编码器 Netty提 ...

  6. Netty | 第1章 Java NIO 网络编程《Netty In Action》

    目录 前言 1. Java 网络编程 1.1 Javs NIO 基本介绍 1.2 缓冲区 Buffer 1.2 通道 Channel 1.3 选择器 Selector 1.4 NIO 非阻塞网络编程原 ...

  7. Netty In Action中国版 - 第二章:第一Netty程序

    本章介绍 获得Netty4最新的版本号 设置执行环境,以构建和执行netty程序 创建一个基于Netty的server和client 拦截和处理异常 编制和执行Nettyserver和client 本 ...

  8. Netty In Action中文版 - 第一章:Netty介绍

    本章介绍 Netty介绍 为什么要使用non-blocking IO(NIO) 堵塞IO(blocking IO)和非堵塞IO(non-blocking IO)对照 Java NIO的问题和在Nett ...

  9. [Netty] - Netty IN ACTION(导言)

    最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...

随机推荐

  1. linux CPU100%异常排查

    1.top查找出占CPU比例最高的进程(5881): 2.查看该进程正在执行的线程: top -H -p  5881 3.将线程转换成16进制 printf ‘%x\n’ 5950 4.查看异常线程执 ...

  2. C语言数组排序——冒泡排序、选择排序、插入排序

    一.冒泡排序 原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置. 然后比较第二.第三个……直到比较第n-1个和第n个,此时,每一次比较都 ...

  3. appcan IDE 无法 请求数据

    我们4月27号从4.0.1升级到4.0.2后,IDE本地预览get请求不到数据.但是在线打包安装到手机又是正常的. 先下载 "uexXmlHttpMgr.rar",下载链接:htt ...

  4. zookeeper中的分布式一致性协议

    1. zookeeper中的一致性协议-ZAB协议 在深入了解ZK之前,相信很多同学都会认为ZK就是Paxos算法的一个实现.但事实上,ZK并没有完全采用Paxos算法,而是使用了一种称为ZooKee ...

  5. 从头开始制作OJ-在线IDE的搭建

    大家好,我是Fred913. 之前,我看过各种OJ(OpenJudge) 但是,还是没有自己做的好. 所以,我就来写了这篇教程. 环境 这次,我打算使用这些:PHP 5.6 Nginx/Apache ...

  6. mysql根据逗号将一行数据拆分成多行数据

    mysql根据逗号将一行数据拆分成多行数据 原始数据 处理结果展示 DDL CREATE TABLE `company` ( `id` ) DEFAULT NULL, `name` ) DEFAULT ...

  7. Python 列表深浅复制详解

    在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法,意思是复制一个相同的列表.例如 names = ["小明", "小红& ...

  8. 《C# 7.0核心技术指南》到货

    前几天有大佬推荐本书,并且折扣相当的划算,随入手一本.

  9. java 中 size() 和 length()

    偶然发现自己不清楚 java size() 和length()是干嘛用的,总结一下: 1.java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这 ...

  10. unity_实用小技巧(避免游戏对象被销毁时声音消失)

    在游戏中我们使用碰撞检测,当两个物体发生碰撞时产生声音音效,代码如下: 如果使用上述代码,我们会发现,在脚本中使用AudioSource声明该声音,当该物体被销毁时声音也会立刻停止. 但是我们希望声音 ...