在上一篇博客中,我们给出了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. Pandas随机采样

    实现对DataFrame对象随机采样 pandas是基于numpy建立起来的,所以numpy大部分函数可作用于DataFrame和Series数据结构. numpy.random.permutatio ...

  2. 创建docker容器遇到的错误

    1.问题截图 2.问题描述 出现该问题就是docker版本和系统版本不兼容导致的. 现在的系统版本和docker的版本如下: 3.问题解决 安装低版本的docker或者高版本的系统(Centos7.4 ...

  3. scrapy xpath用法

    一.实验环境 1.Windows7x64_SP1 2.anaconda3 + python3.7.3(anaconda集成,不需单独安装) 3.scrapy1.6.0 二.用法举例 1.开启scrap ...

  4. IDEA编辑器

    一.打开含有jsx语法的文件都会显示红线,提示export declarations are not supported bu current javascript version 解决办法: 二.I ...

  5. linux系统磁盘满了,怎么解决?

    1.使用命令:df -lk 或 df -hl 发现果然有个磁盘已满 2.使用命令:du --max-depth=1 -h  查找大文件,发现/home文件夹下有17G的东西,因为我的apache是装在 ...

  6. Tomcat源码分析 (十)----- 彻底理解 Session机制

    Tomcat Session 概述 首先 HTTP 是一个无状态的协议, 这意味着每次发起的HTTP请求, 都是一个全新的请求(与上个请求没有任何联系, 服务端不会保留上个请求的任何信息), 而 Se ...

  7. helm安装kafka集群并测试其高可用性

    介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作( ...

  8. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...

  9. python 12 生成器

    目录 1. 生成器 yeild 2. 推导式 2.1 列表推导式: 2.2 生成器推导式: 2.3 字典推导式: 2.4 集合推导式: 3. 内置函数(一) 1. 生成器 yeild 生成器的本质就是 ...

  10. Codeforces 255C

    题意略. 本题考查动态规划,顺便考查一下优化. 这个题目可以归约到最长递增子序列那一类,定义状态:dp[i][j] --- 当前以第i个数结尾,前一个数是第j个数的最长序列. if(a[i] == a ...