netty基础入门(一)定义理解
来源:互联网 发布:模拟学生选课java代码 编辑:程序博客网 时间:2024/06/05 09:33
目的: 理解netty框架的基本概念有个初步认识,着重理解 事件驱动机制!
1、Netty定义:是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。
2、Netty采用三层的网络框架设计
第一层:Reactor 通信调度层,它由一系列辅助类完成,包括 Reactor 线程 NioEventLoop 以及其父类、NioSocketChannel/NioServerSocketChannel 以及其父 类、ByteBuffer 以及由其衍生出来的各种 Buffer、Unsafe 以及其衍生出的各种内 部类等。该层的主要职责就是监听网络的读写和连接操作,负责将网络层的数据 读取到内存缓冲区中,然后触发各种网络事件,例如连接创建、连接激活、读事 件、写事件等等,将这些事件触发到 PipeLine 中,由 PipeLine 充当的职责链来 进行后续的处理。
第二层:职责链 PipeLine,它负责事件在职责链中的有序传播,同时负责动态的 编排职责链,职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向 后/向前传播事件,不同的应用的 Handler 节点的功能也不同,通常情况下,往往 会开发编解码 Hanlder 用于消息的编解码,它可以将外部的协议消息转换成内部 的 POJO 对象,这样上层业务侧只需要关心处理业务逻辑即可,不需要感知底层 的协议差异和线程模型差异,实现了架构层面的分层隔离。
第三层:业务逻辑处理层,可以分为两类:1、纯粹的业务逻辑 处理,例如订单处理。2、应用层协议管理,例如HTTP协议、FTP协议等。接下来,我从影响通信性能的三个方面(I/O模型、线程调度模型、序列化方式)来谈谈Netty的架构。
3、概念理解:
1、什么是概念驱动机制:理解Netty的关键点在哪呢?我觉得,除了NIO的相关知识,另一个就是事件驱动的设计思想。什么叫事件驱动?我们回头看看EchoServerHandler
的代码,其中的参数:public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
,MessageEvent就是一个事件。这个事件携带了一些信息,例如这里e.getMessage()
就是消息的内容,而EchoServerHandler
则描述了处理这种事件的方式。一旦某个事件触发,相应的Handler则会被调用,并进行处理。
这种事件机制在UI编程里广泛应用,而Netty则将其应用到了网络编程领域。在Netty里,所有事件都来自ChannelEvent
接口,这些事件涵盖监听端口、建立连接、读写数据等网络通讯的各个阶段。而事件的处理者就是ChannelHandler
,这样,不但是业务逻辑,连网络通讯流程中底层的处理,都可以通过实现ChannelHandler
来完成了。事实上,Netty内部的连接处理、协议编解码、超时等机制,都是通过handler完成的。当博主弄明白其中的奥妙时,不得不佩服这种设计! 下图描述了Netty进行事件处理的流程。Channel
是连接的通道,是ChannelEvent的产生者,而ChannelPipeline
可以理解为ChannelHandler的集合。
2、netty源码框架理解 Netty的各个模块了。Netty的包结构如下:
01
org
02
└── jboss
03
└── netty
04
├── bootstrap 配置并启动服务的类(netty的启动器/初始化)
05
├── buffer 缓冲相关类,对NIO Buffer做了一些封装
06
├── channel 核心部分,处理连接
07
├── container 连接其他容器的代码
08
├── example 使用示例
09
├── handler 基于handler的扩展部分,实现协议编解码等附加功能
10
├── logging 日志
11
└── util 工具类
3、Channe概念理解
在Netty里,Channel
是通讯的载体,而ChannelHandler
负责Channel中的逻辑处理。那么ChannelPipeline
是什么呢?我觉得可以理解为ChannelHandler的容器:一个Channel包含一个ChannelPipeline,所有ChannelHandler都会注册到ChannelPipeline中,并按顺序组织起来。在Netty中,ChannelEvent
是数据或者状态的载体,例如传输的数据对应MessageEvent
,状态的改变对应ChannelStateEvent
。当对Channel进行操作时,会产生一个ChannelEvent,并发送到ChannelPipeline
。ChannelPipeline会选择一个ChannelHandler进行处理。这个ChannelHandler处理之后,可能会产生新的ChannelEvent,并流转到下一个ChannelHandler。 流程框架图如图2所示;
理解: 一个数据最开始是一个MessageEvent
,它附带了一个未解码的原始二进制消息ChannelBuffer
,然后某个Handler将其解码成了一个数据对象,并生成了一个新的MessageEvent
,并传递给下一步进行处理。到了这里,可以看到,其实Channel的核心流程位于ChannelPipeline
中。于是我们进入ChannelPipeline的深层梦境里,来看看它具体的实现。
4、ChannelPipeline理解 有什么作用?
一:提供了ChannelHandler的编程模型,基于ChannelHandler开发业务逻辑,基本不需要关心网络通讯方面的事情,专注于编码/解码/逻辑处理就可以了。Handler也是比较方便的开发模式,在很多框架中都有用到。
二 : 实现了所谓的”Universal Asynchronous API”。这也是Netty官方标榜的一个功能。用过OIO和NIO的都知道,这两套API风格相差极大,要从一个迁移到另一个成本是很大的。即使是NIO,异步和同步那个编程差距也很大。而Netty屏蔽了OIO和NIO的API差异,通过Channel提供对外接口,并通过ChannelPipeline将其连接起来,因此替换起来非常简单。
理解:更多的是理解其事件的控制作用
学习地址:http://ifeve.com/channel-pipeline/
- netty基础入门(一)定义理解
- netty基础入门(channel理解)
- 简单理解netty(一)
- Netty(一) 简单入门
- Netty详解一(理解Netty的设计理念)
- Netty入门应用一
- Netty入门一
- Netty【一】 NIO入门
- Netty的入门-基础编程
- Netty入门到精通一
- EF基础一(定义)
- netty基础入门(二)简单项目搭建
- (一)基础入门
- Netty学习手册(一、基本使用入门)
- Netty教程系列(一)——netty入门应答程序
- Netty(一):基础概念及消息处理流程
- netty入门(1)
- (socket-nio-netty学习-2)Netty基础入门
- MJPEG格式和码流分析
- Android Studio的logcat是只好猫
- 求职网站
- Win10配置ADB工具
- Unity中的网络编程
- netty基础入门(一)定义理解
- 哈希函数
- 排序算法学习(2)
- nosetests
- hadoop连接mysql数据库执行数据读写数据库操作
- 封装Id、类混用,多个类并用
- QQ面板拖拽在线状态改变
- 2017-05-21 DBA日记,SQL语句诊断思维图
- Active learning-Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively a