本文知识点:

  • Netty框架的作用
  • Netty框架体系结构
  • Netty框架Channel、ChannelHandler、Future、事件详解

前言

Netty框架是什么?Netty是一款用于快速开发高性能的网络应用程序的Java框架。它封装了网络编程的复杂性,使网络编程和Web技术的最新进展能够被 比以往更广泛的开发人员接触到。它不只是一个接口和类的集合,还定义了一种架构模型和一套丰富的设计模式。通过Netty框架开发人员可以编写更高效的、可复用的、可维护的代码。

Netty 体系结构

使用Netty可以比直接使用底层的Java API容易使用;在之前讲网络I/O的文章中讲过Java BIO 与Java NIO;Java NIO使用了事件驱动模型;相比于BIO单线程可以支持更多的连接,并且NIO是异步的,对于数据读取、连接、监听是无阻塞的。Netty且有Java NIO的这些特性,并且比Java NIO有更好的性能和更易用的API。

Netty的核心组件与Java NIO基本相同:

  • Channel
  • ChannelHandler
  • Future
  • 事件

Channel

在讲Java NIO时也有讲过Channel;在Java NIO中Channel的作用相当于一个通道,承载着数据的读与写以及4大事件。在Netty框架中Channel基本相同,它是Netty中可以代表一个硬件设备、一个文件、一个网络Socket或者一个可执行文件或者多个不同的I/O操作组件,它承载着读写操作。

ChannelHandler

一个ChannelHandler可以简单的理解为一个回调方法,在Netty内部使用回调来处理事件;当一个事件被触发时,与事件相关的ChannelHandler将被调用来响应这个事件的处理,下面可以通过一个服务端的示例来理解ChannelHandler的作用:

public class ConnectHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception{System.out.println("Client :"+ctx.channel().remoteAddress() + " connected.");}
}

当有一个客户端连接服务端后,服务端的Netty内部将有产生一个连接的事件,事件将触发ConnectHandler的回调触发。

Future

在Netty中,Future提供了一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作结果的占位符;它将在未来某个时刻完成并提供对结果的访问。Netty框架提供了ChannelFuture,它是一个Netty自己实现的Future,继承自JDK的java.util.concurrent.Future。

ChannelFuture接口额外提供了注册一个或者多个GenericFutureListener实例的方法,监听器的回调方法operationComplete()将会在对应的操作完成时被调用。下面通过一个示例来说明:

EventLoopGroup workerGroup = new NioEventLoopGroup();
try{Bootstrap b=new Bootstrap();b.group(workerGroup);b.channel(NioSocketChannel.class);ChannelFuture f=b.connect("127.0.0.1","8080").sync();//注册一个ChannelFutureListener以便在操作完成时获取通知f.addListener(new ChannelFutureListener(){@Overridepublic void operationComplete(ChannelFuture future){if(future.isSuccess()){ByteBuf buffer=Unpooled.copiedBuffer("Hello XXX.",Charset.defaultCharset());future.channel().writeAndFlush(buffer);}else{future.cause().printStackTrace();}}});
}finally{workerGroup.shutdownGracefully();
}

ChannelHandler和Future是相互补充的机制;它们相互结合使用构成了Netty本身的关键构件之一。

事件

Netty的核心之一,事件用于触发ChannelHandler。在网络中通常会有入站与出站的流量,在Netty中也将事件按入站与出站进行了分类。通过这些不同的事件分类可以清晰的当前网络中有哪些动作发生并对这些动作做出响应。可以记录日志、对数据做转换、对流进行控制和应用程序的业务逻辑处理等。

入站事件:

  • 连接已经激活或者连接失活
  • 数据读取
  • 用户事件
  • 错误事件

出站事件:

  • 打开或者关闭远程连接
  • 将数据写到或者冲刷到网络Socket

入站与出站中的事件都可以对应到ChannelHandler中进行处理;这实现了一个完善的事件驱动范式。下面通过一张图来理解这些入站与出站中的事件:

ChnnelHandler为入站与出站处理器提供了基本的抽象,在Netty框架中提供了大量开箱即用的ChannelHeandler;如Http、SSL/TLS等。

Java NIO 与Netty

Java NIO的三大组件为Channel、Selector、Buffer;在Netty中只看到了Channel与Buffer;但Netty中也有Selector;只是Netty对Selector进行了包装,对应的包含类为EventLoop;EventLoop在Netty中的作用就如Selector在Java NIO中的作用。

在Netty中不需要开发者再写分发的模板代码,通过封装增加了框架接口的易用性,使用接口在使用上更加紧凑。

往期推荐:

网络I/O : Netty 体系结构概述
网络I/O : Java NIO 原理浅析与三大概念分析
网络I/O : Java BIO 浅析
网络I/O : 计算机I/O概述 BIO NIO AIO 前菜

Netty 框架概述与体系结构相关推荐

  1. Netty框架整体架构及源码知识点

    Netty概述 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持.作为当前最流行的NIO框架,Netty在互联网领域.大数据分布式计算领域.游戏行业.通信行业 ...

  2. netty系列之:netty架构概述

    文章目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架 ...

  3. spark中local模式与cluster模式使用场景_Spark内核及通信框架概述-针对面试(后面有源码分析)...

    Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark的任务调度机制.Spark的内存管理机制.Spark核心功能的运行原理等.熟练掌握Spar ...

  4. Spring WebFlux框架概述

    Spring WebFlux框架概述 什么是 Spring WebFlux WebFlux 是Spring5添加的新模块,是一个使用响应式编程和异步非阻塞的Web开发框架,它的功能和 Spring M ...

  5. Netty框架之责任链模式及其应用

    Netty框架之概述及基本组件介绍 Reactor网络编程模型解析 前言 在上篇博客介绍完netty框架的基本组件介绍和概述,也跟着代码看了下NioEventLoopGroup的启动过程,以及基于Re ...

  6. JavaSocket编程之Netty框架线程模型

    1.Netty概述 Netty是一个由JBoss提供的高效的Java NIO client-server(客户端-服务器)开发框架,使用Netty可以快速开发网络应用.Netty提供了一种新的方式来使 ...

  7. netty框架及原理解析

    本篇首发于橙寂博客转载请加上此标示. 正式开始了netty的学习,netty是基于nio上的一个框架.期间翻阅了很多文档以及资料.先推荐给大家. 相关文档 Netty源码在线阅读: Netty-4.1 ...

  8. Scrapy 框架介绍 [Scrapy 框架概述][Scrapy 框架的特点][Scrapy 框架的架构概述]

    您的"关注"和"点赞",是信任,是认可,是支持,是动力- 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 文章目录 1 S ...

  9. Netty框架的基本使用

    Netty概述 为什么使用Netty 前面了解过的NIO模型,它有可靠性高.吞吐量高的优点,但也存在编程复杂的问题,我们要掌握大量的API,如:各种Channel.Buffer.Selector,还要 ...

最新文章

  1. qlabel可以选中吗_QLabel-标签控件的应用
  2. c语言 枚举定义变量,C语言之枚举的定义以及测试
  3. 【分布式计算】MapReduce的替代者-Parameter Server
  4. 安娜·塞克泽沃斯卡的“小人物”
  5. hibernate中的id特殊属性hilo剖解(多用于继承关系)
  6. 深入理解 Git 的实现原理
  7. Teradata应用迁移到AnalyticDB for PostgreSQL指导
  8. “让天下没有难开的店”,宣言来自无人车公司AutoX
  9. 接口jdk1.8与jdk1.9新特性
  10. iOS 证书, provision profile作用
  11. 【BZOJ-1324】Exca王者之剑 最小割
  12. Mybatis传递多个参数
  13. mybatis spring maven
  14. IDEA设置背景颜色
  15. C语言cat函数的功能,R语言cat()函数
  16. word复制公式程序无响应
  17. otdr全部曲线图带解说_【赛事主播】你最期望哪个电竞选手组合来解说比赛?...
  18. UEFI 安装win7 不用格式化
  19. 关于卫星定位,你想知道的一切
  20. 【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS开发板】初探

热门文章

  1. Vue3中slot插槽使用方式
  2. <Linux开发> linux应用开发-之-uart通信开发例程
  3. 花188购买的0基础短视频入门实战培训文档,学了一周的总结。
  4. linux 解压 .tar ;.gz ; .tar.gz ; .tgz ; .bz2 ; .tar.bz2 ; .bz ; .tar.bz ;.Z ;.tar.Z ;
  5. 前端开发语言基础介绍
  6. 专科就业工资php,专科工资高的十大专业 大专学什么专业就业前景好
  7. mysql导入数据库_mysql 导入数据库 命令操作
  8. Three——三、动画执行、画布大小、渲染帧率和相机适配体验
  9. kafka-offset手动提交和自动提交
  10. 夜晚小记——centos安装WebMonitor监控页面并推送和phantomjs