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:数据处理流程的更多相关文章

  1. Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化

    Netty源码分析第一章:Netty启动流程   第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...

  2. Netty源码分析第1章(Netty启动流程)---->第4节: 注册多路复用

    Netty源码分析第一章:Netty启动流程   第四节:注册多路复用 回顾下以上的小节, 我们知道了channel的的创建和初始化过程, 那么channel是如何注册到selector中的呢?我们继 ...

  3. Netty启动流程剖析

    编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等,针对高性能RPC,一般都是基 ...

  4. Netty执行流程分析与重要组件介绍

    一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle  处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...

  5. Netty writeAndFlush() 流程与异步

    Netty writeAndFlush()方法分为两步, 先 write 再 flush @Override public ChannelFuture writeAndFlush(Object msg ...

  6. netty 服务器端流程调度Flow笔记

    create NioEventLoopGroup Instance 一.NioServerSocketChannel init note:Initializing ChannelConfig crea ...

  7. Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化

    Netty源码分析第一章:  Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...

  8. Netty源码分析第1章(Netty启动流程)---->第2节: NioServerSocketChannel的创建

    Netty源码分析第一章:  Server启动流程 第二节:NioServerSocketChannel的创建 我们如果熟悉Nio, 则对channel的概念则不会陌生, channel在相当于一个通 ...

  9. Netty源码分析第1章(Netty启动流程)---->第5节: 绑定端口

    Netty源码分析第一章:Netty启动步骤 第五节:绑定端口 上一小节我们学习了channel注册在selector的步骤, 仅仅做了注册但并没有监听事件, 事件是如何监听的呢? 我们继续跟第一小节 ...

随机推荐

  1. Hadoop相关日常操作

    1.Hive相关 脚本导数据,并设置运行队列 bin/beeline -u 'url' --outputformat=tsv -e "set mapreduce.job.queuename= ...

  2. 【原】彻底解决WPS弹出热点广告、WPS购物图标的办法

    一直用WPS,但一直有一个问题迟迟没有解决,那就是讨厌的WPS广告问题! 每次开机都会自动在托盘上闪烁图标:“WPS购物”和“WPS热点”! 用自定义托盘图标隐藏都不管用,自动又会给改回来!这简直是流 ...

  3. Alcatraz 的安装和删除

    Xcode 所有的插件都安装在目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 你也可以手工切换到这个目录来删除插件 ...

  4. 快速查找sql server中的存储过程和视图

    select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_shipped ...

  5. 【.net 深呼吸】连接Access数据库应注意的几点

    本地数据库可以有Y种选择,比如Sqlite.SQL Server Express.SQL Local DB.SQL Server CE.Access等,本文老周选用比较著名的Access本地数据库,在 ...

  6. Android keycode列表

    整理备忘! 基本按键 KEYCODE_0 按键'0' 7 KEYCODE_1 按键'1' 8 KEYCODE_2 按键'2' 9 KEYCODE_3 按键'3' 10 KEYCODE_4 按键'4' ...

  7. GO语言下载、安装、配置

    一.Go语言下载 go语言官方下载地址:https://golang.org/dl/ 找到适合你系统的版本下载,本人下载的是windows版本.也可以下载Source自己更深层次研究go语言. 二.G ...

  8. 数百个 HTML5 例子学习 HT 图形组件 – 3D建模篇

    http://www.hightopo.com/demo/pipeline/index.html <数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇>里提到 HT 很 ...

  9. React-Native学习系列(一)

    近段时间一直在忙,所以博客也没有更新,这两天我翻了一下写的这几篇博客,感觉写的都很片面,所以,我想重新写一个系列教程,从最基础的开始,来让大家更容易学会React-Native. 这个系列大部分只介绍 ...

  10. c#面向对象基础技能——学习笔记(五)委托技术在开发中的应用

    委托 delegate 1.是一种全新的面向对象语言的特性: 2.开发事件驱动程序变得非常简单: 3.简化多线程难度. 理解委托:可以理解成一个方法的指针.(接收的变量是方法) 步骤: 1.声明委托, ...