一起来读Netty In Action之netty的组件和设计(二)
在上一篇博客中,我们给出了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的组件和设计(二)的更多相关文章
- Essential Netty in Action 《Netty 实战(精髓)》读书笔记一
NIO 最初是为 New Input/Output 的缩写.然而,Java 的 API 已经存在足够长的时间,它不再是新的.现在普遍使用的缩写来表示Nonblocking I/O (非阻塞 I/O). ...
- 【推荐】《Netty in action》书籍
最近准备开始阅读一下<Netty in action>并且准备构架设计一个分布式系统.用于新项目. 貌似压力很大啊.压力就是东西.希望自己能够调节好. Netty in action是Ne ...
- Netty In Action中文版 - 第五章:Buffers(缓冲)
本章介绍 ByteBuf ByteBufHolder ByteBufAllocator 使用这些接口分配缓冲和运行操作 每当你须要数据传输时,它必须包括一个缓冲区.Java NIO API自带的缓冲区 ...
- 《Netty in action》 读书笔记
声明:这篇文章是记录读书过程中的知识点,并加以归纳总结,成文.文中图片.代码出自<Netty in action>. 1. 为什么用Netty? 每个框架的流行,都一定有它出众的地方.Ne ...
- Netty In Action中文版 - 第七章:编解码器Codec
http://blog.csdn.net/abc_key/article/details/38041143 本章介绍 Codec,编解码器 Decoder,解码器 Encoder,编码器 Netty提 ...
- 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 非阻塞网络编程原 ...
- Netty In Action中国版 - 第二章:第一Netty程序
本章介绍 获得Netty4最新的版本号 设置执行环境,以构建和执行netty程序 创建一个基于Netty的server和client 拦截和处理异常 编制和执行Nettyserver和client 本 ...
- Netty In Action中文版 - 第一章:Netty介绍
本章介绍 Netty介绍 为什么要使用non-blocking IO(NIO) 堵塞IO(blocking IO)和非堵塞IO(non-blocking IO)对照 Java NIO的问题和在Nett ...
- [Netty] - Netty IN ACTION(导言)
最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...
随机推荐
- GC是什么?为什么我们要去使用它
GC(Garbage Collection)是各大语言的宠儿,也是计算机科学领域里很热门的一个话题.最早在JVM中有看过这个算法,后来发现即使是js这种脚本语言也是有GC的.单纯就JVM来说的话,GC ...
- 什么是https?http升级为https需要什么?
一.什么是https? https是一种加密传输协议,网站使用https后可以避免敏感信息被第三方获取.https加密协议=SSL / TLS+http协议,也就是说,在传统的http协议上加上SSL ...
- Apache NiFi 核心概念和关键特性
本文来源于官方文档翻译 NiFi 的核心概念 NiFi 最早是美国国家安全局内部使用的工具,用来投递海量的传感器数据.后来由 apache 基金会开源.天生就具备强大的基因.NiFi基本设计理念与 F ...
- Cannot attach the file “MvcMovie.mdf” as database “aspnet-MvcMovie”
今天在微软开发人员官网上学习asp.net mvc5入门的时候,遇到一个棘手的问题,我是按照教程一步一步操作的,但期间遇到一个自己觉得莫名其妙的问题,教程中也没有提到这个, 在添加新字段这一章节,跟着 ...
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- dotnetcore 与 hbase 之二——thrift 客户端的制作
说明 在上一篇文章dotnetcore 与 hbase 之一--hbase 环境准备结束后,我们已经有了 hbase 数据库环境.接下来就可以利用 thrift 生成 c# hbase 客户端了.如果 ...
- 简洁实用Socket框架DotNettySocket
目录 简介 产生背景 使用方式 TcpSocket WebSocket UdpSocket 结尾 简介 DotNettySocket是一个.NET跨平台Socket框架(支持.NET4.5+及.NET ...
- java的八种数据类型
1)四种整数类型(byte.short.int.long): byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 327 ...
- 第一次亲密接触——二狗子初识 CDN
二狗子是国内知名XXX大学的在校学生,作为一名编程爱好者,他利用业余时间搭建了一个网站,把平时的学习心得和技术分享全都 PO 在自己的网站上.渐渐地,二狗子的网站因为文章质量高,技术分享全面,受到了很 ...
- windbg 使用与技巧
基本知识和常用命令 (1) Windbg下载地址http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 安装完后执行w ...