Netty:数据处理流程
Netty作为异步的、事件驱动一个网络通信框架,使用它可以帮助我们快速开发高性能高可靠性的网络服务。
为了更好的使用Netty来解决开发中的问题,学习Netty是很有必要的。
Netty现在主流有三个版本:Netty3、Netty4、Netty5。这三个版本中,变化最大的要数线程模型了,各版本的线程模型均不相同。但是有一点是变化不大的,那就是Channel模型,因而数据处理流程也不会有太大的变化。所以本篇就来说一下Netty的数据处理流程,各版本的线程模型会后续说明。
Channel 模型
关于Netty Channel的模型,做了一个简易图:

一个Channel中包括一个Socket、一个ChannelPipeline。一个ChannelPipeline中有一个ChannelSink和多个ChannelHandler。ChannelHandler分为两种:UpstremHandler、DownstreamHandler。
不论是读数据还是写数据都要经过Channel中的ChannelPipeline。读数据的过程是从Socket到ChannelPipeline,由ChannelPipeline交给里面的UpstreamHandler(或者叫做InBoundHandler)从下到上依次处理 。写数据时,由要经过ChannelPipeline里面在DownStreamHandler(或者是OutBoundHandler)由上到下依次处理。
Channel的创建
Channel主要分为两种:ServerSocketChannel、SocketSocketChannel。这里不对是否是NIO作区分。
ServerSocketChannel的创建在bind时自动完成,SocketChannel的创建由Netty帮助完成。不论是客户端在创建连接时, 还是服务端接收到客户端连接时,SocketChannel的创建都是由Netty帮助完成
在创建Channel时,就会自动调用相应的ChannelPipeline创建器来创建了。在创建ChannelPipeline时,可以由用户配置相关的ChannelHandler。ServerSocketChannel可以由用户定制一个ChannelHandler,SocketChannel则可以由用户定制多个ChannelHandler。
在各版本中用于定制的方法可能是不同的。
ChannelSink
这个组件主要见于V3中
ChannelSink的有2个作用:
1、当出现异常时,通过exceptionCaught向沿着Pipeline上传递ExceptionEvent,(channel.getPipeline().sendUpsteam(new DefaultExceptionEv ent(channel,ex)));
2、当一个Message或者一个Events沿着Pipeline从上到下执行完所有的ChannelHandler处理后,进入ChannelSink的eventSunk方法。
下面就说一下Server端、Client端的Sink的作用:
ServerSocketPipelineSink eventSunk:
- 当创建ServerSocket时,提交Boss任务。
- 当接收到Socket时,创建SocketChannel,并将一个Worker任务交给Worker Executor。
ClientSocketPipelineSink eventSunk:
1)当在Pipeline上流转的是ChannelEvent时:
·如果是创建连接的event,将一个worker任务交给worker executor
·如果是兴趣event,则注册兴趣事件。
2)当在Pipeline上流转的是message时:
将要写的数据放到写队列中,然后调用NioWorker的writeFromUserCode方法。
ChannelHandler
Netty是由事件驱动的框架,任何操作操作都是由事件来驱动的。
ChannelHandler就是一个Event Hander(事件处理器),它的作用是:
·处理IO事件(读写),例如读取数据,并解码。
·处理兴趣事件。
·交给下一个ChannelHandler处理。
写数据有两种方式可以触发


上述呢,简单了说了一下Channel中各组件的作用以及处理流程,知道这些东西,已经可以帮助我们理解并使用Netty了。
Netty:数据处理流程的更多相关文章
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- Netty源码分析第1章(Netty启动流程)---->第4节: 注册多路复用
Netty源码分析第一章:Netty启动流程 第四节:注册多路复用 回顾下以上的小节, 我们知道了channel的的创建和初始化过程, 那么channel是如何注册到selector中的呢?我们继 ...
- Netty启动流程剖析
编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等,针对高性能RPC,一般都是基 ...
- Netty执行流程分析与重要组件介绍
一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle 处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...
- Netty writeAndFlush() 流程与异步
Netty writeAndFlush()方法分为两步, 先 write 再 flush @Override public ChannelFuture writeAndFlush(Object msg ...
- netty 服务器端流程调度Flow笔记
create NioEventLoopGroup Instance 一.NioServerSocketChannel init note:Initializing ChannelConfig crea ...
- Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化
Netty源码分析第一章: Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...
- Netty源码分析第1章(Netty启动流程)---->第2节: NioServerSocketChannel的创建
Netty源码分析第一章: Server启动流程 第二节:NioServerSocketChannel的创建 我们如果熟悉Nio, 则对channel的概念则不会陌生, channel在相当于一个通 ...
- Netty源码分析第1章(Netty启动流程)---->第5节: 绑定端口
Netty源码分析第一章:Netty启动步骤 第五节:绑定端口 上一小节我们学习了channel注册在selector的步骤, 仅仅做了注册但并没有监听事件, 事件是如何监听的呢? 我们继续跟第一小节 ...
随机推荐
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- (转载)解决“Windows Update一直无法完成”的方法
近日彻底重装系统,启动Win7的"Windows Update",程序显示在检查更新,却一直没有结果. 在排除网络问题,排除杀毒软件和防火墙的问题之后,感觉还是程序或者配置除了问题 ...
- ReactJs 报错 Element type is invalid: expected a string (from built-in components) or a class/function (for composite components) but got: undefined. Check the render method of `Me`.
今天在重构一个页面的时候,碰到了一个error,具体的error信息如下图中所示: 最后经过一番查找定位,终于找到了问题所在,原因就是在父组件引用子组件时多加了一个大括号. import {Chart ...
- 阿里云系列——7.阿里云IIS系列详解(过程+通用+最新)
网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 先讲IIS系列,Linux部署以后再继续讲 先打开主机管理平台,确认域名绑定 ...
- GitHub实战系列~4.把github里面的库克隆到指定目录+日常使用 2015-12-11
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- ffmpeg用法及如何使用fluent-ffmpeg
http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具. 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an o ...
- iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)
这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...
- 构建自己的PHP框架--构建模版引擎(1)
前段时间太忙,导致好久都没有更新博客了,今天抽出点时间来写一篇. 其实这个系列的博客很久没有更新了,之前想好好规划一下,再继续写,然后就放下了,今天再捡起来继续更新. 今天我们来说一下,如何构建自己的 ...
- 注意 AppResLib.dll.*.mui 的生成操作应该为 Content
为 Windows Phone 8 App 添加本地化的时候,发现修改 AppResLib.dll.*.mui 后不仅没有其变化,还发现修改它导致它失效.通过对比代码发现,问题原因是 AppResLi ...
- LINQ to SQL语句(20)之存储过程
在我们编写程序中,往往需要一些存储过程,在LINQ to SQL中怎么使用呢?也许比原来的更简单些.下面我们以NORTHWND.MDF数据库中自带的几个存储过程来理解一下. 1.标量返回 在数据库中, ...