当前位置:首页 > 服务端 > 【Netty学习】 ChannelHandler 改动及影响

【Netty学习】 ChannelHandler 改动及影响

2022年11月09日 15:36:00服务端14

channelHandler 在Netty 4.x版本有了相当大的改动

http://netty.io/wiki/new-and-noteworthy.html   官网的更新改进说明。

 

以下节选官网更新说明的部分中文翻译:

在3.x时代,所有的I/O操作都会创建一个新的ChannelEvent对象。对每个读或写的操作,还会额外创建一个新的ChannelBuffer对象。由于将资源管理和buffer的池化交给了JVM,这实际上极大地简化了Netty的内部实现。但是,基于Netty开发的应用在高负载下运行时,有时会观察到GC(Garbage Collection)的压力增大或变化不定,这些问题的根源也来自于这里。

4.0通过把事件对象替换为直接与类型相对应(译者注:原文为strongly typed,但是我觉得直译为强类型不太容易理解)的方法调用,几乎完全避免了事件对象的创建。3.x中,有类似于handleUpstream()和handleDownstream()这种能够捕获所有相关类型事件的处理器方法,4.0中你将不会再看到它们的身影了。所有的事件类型现在都有各自对应的处理器方法:

”所有这些变化意味着用户无法去扩展ChannelEvent这个已经不存在的接口了。那用户要怎样才能定义他或她自己的事件类型呢,就像IdleStateEvent?4.0中的ChannelHandler有一个处理器方法叫做userEventTriggered(),它就是被设计用来满足这种特殊的用户需求。

4.x版本中简化了channel 状态模型(Simplified channel state model):

3.x版本的:

【Netty学习】 ChannelHandler 改动及影响 _ JavaClub全栈架构师技术笔记

 

 

在4.x版本中:

ChannelOpen ChannelBound 和ChannelConnected 合并到ChannelActive.ChannelDisconnected ChannelUnbound ChannlClosed合并到ChannelInactive中

如下图所示:

【Netty学习】 ChannelHandler 改动及影响 _ JavaClub全栈架构师技术笔记

在Netty4.0.12的源代码中我们可以看到AbstractChannel中的:

AbstractUnsafe{

...//调用fireChannelActive()

private void register0(ChannelPromise promise)

public final void bind(final SocketAddress localAddress, final ChannelPromise promise)

...//调用fireChannelInactive()

public final void disconnect(final ChannelPromise promise)

public final void close(final ChannelPromise promise)

}

..值得注意的是官网还特意提示了ChannelRegister和ChannelOpen和ChannelClosed有很大的区别

引入翻译:"channelRegistered和channelUnregistered这两个事件与channelOpen和channelClosed具有的意义是不一样的。它们(channelRegistered和channelUnregistered)是在支持Channel的动态注册、注销以及再注册时被引入的"

 

【Netty学习】 ChannelHandler 改动及影响 _ JavaClub全栈架构师技术笔记

如图所示。注册和注销仅仅用于每次的操作。

 

以下是个人口水:

貌似这么做的好处在于。把channel的异常放在一个方法内统一处理。在3.x的开发过程中发现。很多时候我们想要的只是一个结果。服务端数据在客户端channel断开连接。解绑定。关闭3中状态时,需要将相对应的信息数据处理掉。在4.x版本中将这三个事件整合之后。只需要统一的处理就好了。

【Netty学习】 ChannelHandler 改动及影响 _ JavaClub全栈架构师技术笔记
 1 // 管道从不活跃状态  转到  活跃状态 触发
 2 @Override
 3     public void channelActive(ChannelHandlerContext ctx) throws Exception {
 4         final Channel channel = ctx.channel();
 5         if(channel.isOpen()){
 6     // 管道 活跃的  并且是开启状态
 7         }
 8         super.channelActive(ctx);
 9     }
10 
11 // 管道从活跃状态  转到  不活跃状态 触发
12     @Override
13     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
14 
15         Channel channel = ctx.channel();
16         if(!channel.isOpen()){
17             
18             
19         }
20         super.channelInactive(ctx);
21     }
View Code

 

 

 

 

作者:Tiny&zzh
来源链接:https://www.cnblogs.com/zou90512/p/3421478.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68795.html

标签: Netty
分享给朋友:

“【Netty学习】 ChannelHandler 改动及影响” 的相关文章

Springboot+Netty集成protobuf开发服务器

原文地址:http://t.csdn.cn/pkPl9 作者:全栈小定^.^ 来源链接:https://blog.csdn.net/dingdingdandang/article/details/124261130...

Java与Netty实现高性能高并发

Java与Netty实现高性能高并发

http://blog.csdn.net/nicajonh/article/details/54985352 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了1...

netty实现http客户端请求远程http服务

netty实现http客户端请求远程http服务

    一般http请求,我们会使用httpclient来实现连接池方式的连接,根据请求的类型,封装get,post等请求,设置参数,设置请求头,调用方法,发送请求之后等待请求返回结果,根据结果解析出我们需要的数据。netty也可以实现httpclient类似...

springboot整合netty(二)

springboot整合netty(二)

目录 前言 正文 代码 1. 新建一个springboot项目,在pom文件中添加netty依赖: 2.新建netty服务 3.netty调用...

netty初步使用与了解

netty初步使用与了解

概述 就我个人的感受来说netty是一个nio的封装框架,他能够很简洁的进行tcp udp协议的开发使用。所以对于netty的使用大部分是基于rpc框架的开发 比如duboo.。 rpc 与webService rpc简称远程方法调用 通过tcp udp web...

java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

今天开始写一些高并发实战系列。 本系列主要讲两大主流框架: Netty和Quasar(java纤程库) 先介绍netty吧,netty是业界比较成熟的高性能异步NIO框架。 简单来说,它就是对NIO2的封装,但提供了更好用,bug更少的API。 为什么ne...

Netty通过Nginx配置 wss 协议访问(实践可行)

先写个比较简单的,后面再写一篇Vue + springboot +netty  Netty在互联网以及物联网公司用的很多,底层走的还是 websocket协议,好处很多,就不一一列了,相关的文章很多,大家可以搜下; 在实际开发应用中,基本上都是采用前后端分离...

Android使用Netty网络框架实践(客户端、服务端)

Android使用Netty网络框架实践(客户端、服务端) 使用开发工具为Android Studio 1、配置build.gradle文件 build.gradle文件的dependencies标签下添加Netty引用 depe...

【Netty】codec框架

【Netty】codec框架

一、前言   前面已经学习完了Netty框架中的主要组件,接着学习codec框架。 二、codec框架   每个网络应用程序必须定义如何将在对等体之间传输的原始字节解析并转换为目标程序的数据格式,这种转换逻辑有codec处理,其由编码器和解码器组成,每个编码器和解码器...

netty系列之:使用netty实现支持http2的服务器

netty系列之:使用netty实现支持http2的服务器

文章目录 简介 基本流程 CleartextHttp2ServerUpgradeHandler Http2ConnectionHandler 总结 简介...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。