Netty组件介绍

Netty有 Bootstrap/ServerBootstrap,Channel,EventLoop,ChannelFuture,
ChannelHandler,ChannelPipeline,编码器和解码器等核心组件。

Bootstrap/ServerBootstrap

Bootstrap和ServerBootstrap是Netty应用程序的引导类,它提供了用于应用程序网络层的配置。
一般的Netty应用程序总是分为客户端和服务端,所以引导分为客户端引导Bootstrap和服务端引导ServerBootstrap,
ServerBootstrap作为服务端引导,它将服务端进程绑定到指定的端口,而Bootstrap则是将客户端连接到
指定的远程服务器。
Bootstrap和ServerBootstrap除了职责不同,它们所需的EventLoopGroup的数量也不同,
Bootstrap引导客户端只需要一个EventLoopGroup,而ServerBootstrap则需要两个EventLoopGroup。

Channel

在我们使用某种语言,如c/c++,java,go等,进行网络编程的时候,我们通常会使用到Socket,
Socket是对底层操作系统网络IO操作(如read,write,bind,connect等)的封装,
因此我们必须去学习Socket才能完成网络编程,而Socket的操作其实是比较复杂的,想要使用好它有一定难度,
所以Netty提供了Channel(io.netty.Channel,而非java nio的Channel),更加方便我们处理IO事件。

EventLoop

EventLoop用于服务端与客户端连接的生命周期中所发生的事件。
EventLoop 与 EventLoopGroup,Channel的关系模型如下:

一个EventLoopGroup通常包含一个或多个EventLoop,一个EventLoop可以处理多个Channel的IO事件,
一个Channel也只会被注册到一个EventLoop上。在EventLoop的生命周期中,它只会和一个Thread线程绑定,这个
EventLoop处理的IO事件都将在与它绑定的Thread内被处理。

ChannelFuture

在Netty中,所有的IO操作都是异步执行的,所以一个操作会立刻返回,但是如何获取操作执行完的结果呢?
Netty就提供了ChannelFuture接口,它的addListener方法会向Channel注册ChannelFutureListener,
以便在某个操作完成时得到通知结果。

ChannelHandler

我们知道Netty是一个款基于事件驱动的网络框架,当特定事件触发时,我们能够按照自定义的逻辑去处理数据。
ChannelHandler则正是用于处理入站和出站数据钩子,它可以处理几乎所有类型的动作,所以ChannelHandler会是
我们开发者更为关注的一个接口。

ChannelHandler主要分为处理入站数据的 ChannelInboundHandler和出站数据的 ChannelOutboundHandler 接口。

Netty以适配器的形式提供了大量默认的 ChannelHandler实现,主要目的是为了简化程序开发的过程,我们只需要
重写我们关注的事件和方法就可以了。 通常我们会以继承的方式使用以下适配器和抽象:

  • ChannelHandlerAdapter
  • ChannelInboundHandlerAdapter
  • ChannelDuplexHandler
  • ChannelOutboundHandlerAdapter

ChannelPipeline

上面介绍了ChannelHandler的作用,它使我们更关注于特定事件的数据处理,但如何使我们自定义的
ChannelHandler能够在事件触发时被使用呢? Netty提供了ChannelPipeline接口,它
提供了存放ChannelHandler链的容器,且ChannelPipeline定义了在这条ChannelHandler链上
管理入站和出站事件流的API。
当一个Channel被初始化时,会使用ChannelInitializer接口的initChannel方法在ChannelPipeline中
添加一组自定义的ChannelHandler。

入站事件和出站事件的流向

从服务端角度来看,如果一个事件的运动方向是从客户端到服务端,那么这个事件是入站的,如果事件运动的方向
是从服务端到客户端,那么这个事件是出站的。

上图是Netty事件入站和出站的大致流向,入站和出站的ChannelHandler可以被安装到一个ChannelPipeline中,
如果一个消息或其他的入站事件被[读取],那么它会从ChannelPipeline的头部开始流动,并传递给第一个ChannelInboundHandler
,这个ChannelHandler的行为取决于它的具体功能,不一定会修改消息。 在经历过第一个ChannelInboundHandler之后,
消息会被传递给这条ChannelHandler链的下一个ChannelHandler,最终消息会到达ChannelPipeline尾端,消息的读取也就结束了。

数据的出站(消息被[写出])流程与入站是相似的,在出站过程中,消息从ChannelOutboundHandler链的尾端开始流动,
直到到达它的头部为止,在这之后,消息会到达网络传输层进行后续传输。

进一步了解ChannelHandler

鉴于入站操作和出站操作是不同的,可能有同学会疑惑:为什么入站ChannelHandler和出站ChannelHandler的数据
不会窜流呢(为什么入站的数据不会到出站ChannelHandler链中)? 因为Netty可以区分ChannelInboundHandler和
ChannelOutboundHandler的实现,并确保数据只在两个相同类型的ChannelHandler直接传递,即数据要么在
ChannelInboundHandler链之间流动,要么在ChannelOutboundHandler链之间流动。

当ChannelHandler被添加到ChannelPipeline中后,它会被分配一个ChannelHandlerContext,
它代表了ChannelHandler和ChannelPipeline之间的绑定。 我们可以使用ChannelHandlerContext
获取底层的Channel,但它最主要的作用还是用于写出数据。

编码器和解码器

当我们通过Netty发送(出站)或接收(入站)一个消息时,就会发生一次数据的转换,因为数据在网络中总是通过字节传输的,
所以当数据入站时,Netty会解码数据,即把数据从字节转为为另一种格式(通常是一个Java对象),
当数据出站时,Netty会编码数据,即把数据从它当前格式转为为字节。

Netty为编码器和解码器提供了不同类型的抽象,这些编码器和解码器其实都是ChannelHandler的实现,
它们的名称通常是ByteToMessageDecoder和MessageToByteEncoder。

对于入站数据来说,解码其实是解码器通过重写ChannelHandler的read事件,然后调用它们自己的
decode方法完成的。
对于出站数据来说,编码则是编码器通过重写ChannelHandler的write事件,然后调用它们自己的
encode方法完成的。

为什么编码器和解码器被设计为ChannelHandler的实现呢?

我觉得这很符合Netty的设计,上面已经介绍过Netty是一个事件驱动的框架,其事件由特定的ChannelHandler
完成,我们从用户的角度看,编码和解码其实是属于应用逻辑的,按照应用逻辑实现自定义的编码器和解码器就是
理所应当的。

SimpleChannelInboundHandler

在我们编写Netty应用程序时,会使用某个ChannelHandler来接受入站消息,非常简单的一种方式
是扩展SimpleChannelInboundHandler< T >,T是我们需要处理消息的类型。 继承SimpleChannelInboundHandler
后,我们只需要重写其中一个或多个方法就可以完成我们的逻辑。

【Netty】Netty组件介绍相关推荐

  1. netty的基本介绍

    一.什么是netty?为什么要用netty netty是jboss提供的一个java开源框架,netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可用性的网络服务器和客户端程 ...

  2. Java NIO框架Mina、Netty、Grizzly介绍与对比

    Java NIO框架Mina.Netty.Grizzly介绍与对比 原文地址:https://blog.csdn.net/e765741668/article/details/45234711 Min ...

  3. Netty框架基本介绍

    NIO 1.概述:NIO全称java non-blocking IO ,是指JDK1.4开始,java提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO ).新增了许多用于处理输入输 ...

  4. 客快物流大数据项目(六):Docker与虚拟机的形象比喻及组件介绍

    目录 Docker与虚拟机的形象比喻及组件介绍 一.Docker与虚拟机的形象比喻

  5. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  6. c# BackgroundWorker组件介绍(属性、方法、事件)

    c# BackgroundWorker组件介绍(属性.方法.事件) 2008-07-03 16:28 在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便 ...

  7. java hbase创建_hadoop组件介绍及python 连接Hbase

    Ambari Apache Ambari是一种基于Web的工具,支持Hadoop集群的供应.管理和监控.是Apache顶级开源项目之一,由Hortonworks公司开源. Ø 官方网站地址: http ...

  8. Spring Security教程 Vol 9. AccessDecisionManager组件介绍

    第九期 AccessDecisionManager组件介绍 作为访问控制的最后一期,但确实整个章节部分里最简单的一部分.ConfigAttribute负责表述规则,AccessDecisionVote ...

  9. 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)

    在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...

最新文章

  1. 9月第1周安全回顾 IM安全威胁严重 企业增加无线安全投入
  2. 【生生被气死的一周】头秃
  3. Maven(三):将web项目的war包热部署到远程Tomcat服务器
  4. IntelliJ IDEA常用的快捷键(代码提示/注释代码/加入类注释和方法注释Javadoc)
  5. Eigen(7)Map类
  6. 160 - 3 Afkayas.2
  7. 反射机制及其应用场景
  8. BZOJ3437:小P的牧场(斜率优化DP)
  9. NODE_ENV不是内部或外部命令,也不是可运行的程序
  10. 7款效果惊人的HTML5/CSS3应用
  11. (占坑)NOIP2018复赛解析
  12. Android 录屏+录音,原生代码,无需root权限,好用更好懂
  13. 小学计算机课教学设计加教学反思,小学计算机教育教学反思随笔
  14. 利用织梦高级搜索功能 , 来定制身份证驾驶证信息查询系统
  15. 疫情只是催化剂 2020注定开启协同办公新纪元
  16. 解决Mysql执行删除操作报错:1093的问题
  17. 中国招聘网站之“忧”
  18. 解决IE6、IE8 宽度兼容
  19. 服务器default文件夹可以删除吗,C盘用户文件夹里的Default是什么文件夹,有什么用,能删除么?...
  20. 2023北京火力发电技术及设备展览会

热门文章

  1. QIIME 2教程. 01简介和安装 Introduction Install(2020.11开始更新)
  2. Microbiome:芝麻菜中肠杆菌科主导核心微生物组并贡献抗生素抗性组(简单套路16S+meta+培养组发高分文章)
  3. 宏基因组扩增子1图表解读-理解文章思路,零基础测序分析图表解读大全(箱线,散点,热,曼哈顿,火山,韦恩,三元,网络),老板再也不愁我的文献阅读了!
  4. 解决pandas:ValueError: Cannot convert non-finite values (NA or inf) to integer
  5. stat_count() must not be used with a y aesthetic
  6. R语言将dataframe数据从宽表变为长表实战(melt函数、pivot_longer函数、gather函数)
  7. ElasticSearch+聚合+Aggregation+示例
  8. python中操作mysql数据库CRUD(增、删、改、查)
  9. 实验五 oracle高级数据查询技术
  10. 战锤全面战争无法响应服务器,战锤:全面战争打不开 游戏无法启动解决办法...