Netty
文章平均质量分 85
GreyZeng
程序员,架构师,项目经理
展开
-
Netty 学习(十):ChannelPipeline源码说明
作者:ChannelPipeline可以看作一条流水线,原料(字节流)进来,经过加工,形成一个个Java对象,然后基于这些对象进行处理,最后输出二进制字节流。ChannelPipeline 在创建 NioSocketChannel 的时候创建, 其默认实现是 DefaultChannelPipelineChannelPipeline 中保存了 Channel 的引用,且其中每个节点都是一个 ChannelHandlerContext 对象。原创 2022-10-11 18:32:19 · 477 阅读 · 0 评论 -
Netty 学习(九):解码源码说明
作者:解码就是不断地从TCP缓冲区中读取数据,每次读取完都需要判断是否为一个完整的数据包。如果当前读取的数据不足以拼接成一个完整的业务数据包,那就保留该数据,继续从TCP缓冲区中读取,直到得到一个完整的数据包。如果当前读到的数据加上已经读取的数据足够拼接成一个数据包,那就将已经读取的数据拼接上本次读取的数据,构成一个完整的业务数据包传递到业务逻辑,多余的数据仍然保留,以便和下次读到的数据尝试拼接。使用 Netty 的话,整个过程就变的简单了,不需要用户自己处理粘包的问题。原创 2022-10-07 21:11:39 · 611 阅读 · 0 评论 -
Netty 学习(八):新连接接入源码说明
作者:新连接的接入分为3个过程检测到有新连接。将新连接注册到 worker 线程。注册新连接的读事件。检测新连接的代码在中的方法中启动一个 Netty 服务端和 Netty 客户端,在这一行打断点,可以得到这里的unsafe就是,进入的read()方法,这个方法主要做的事情就是:创建,设置并绑定。创建调用的是方法,通过Debug,可以看到来自于中可以看到此时调用的是 Java 底层的accept()方法,创建了一条 JDK 层面的Channel, Netty 将其封装成自定义的,并加入一个。原创 2022-10-05 10:30:47 · 440 阅读 · 0 评论 -
Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明
作者: Grey原文地址:博客园:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明CSDN:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明在 Netty 服务端代码中,我们一般会创建了两个 NioEventLoopGroup:bossGroup 和 workerGroup其中: 用于监听端口,接收新连接的线程组; 用于处理每一个连接的数据读写的线程组。NioEventLoop 的启动入口在其中方法调用的是的实现而这个实现又调用了子类的如下方法原创 2022-10-03 12:54:58 · 513 阅读 · 0 评论 -
Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明
作者:基于 JDK 的 API 自己实现 NIO 编程,需要一个线程池来不断监听端口。接收到新连接之后,这条连接上数据的读写会在另外一个线程池中进行。在 Netty 实现的服务端中, 有如下经典代码其中 bossGroup 对应的就是监听端口的线程池,在绑定一个端口的情况下,这个线程池里只有一个线程;workerGroup 对应的是连接的数据读写的线程。通过 debug 并设置断点的方式,我们来查看下创建 NioEventLoopGroup 的核心过程,在没有指定线程数的情况下会调用如下构造方法。原创 2022-10-01 16:08:21 · 547 阅读 · 0 评论 -
Netty 学习(五):服务端启动核心流程源码说明
作者: Grey原文地址:博客园:Netty 学习(五):服务端启动核心流程源码说明CSDN:Netty 学习(五):服务端启动核心流程源码说明本文使用的 Netty 版本是 4.1.82.Final,服务端在启动的时候,主要流程有如下几个创建服务端的 Channel初始化服务端的 Channel注册 Selector端口绑定我们可以写一个简单的服务端代码,通过 Debug 的方式查看这几个关键流程的核心代码。通过的方法,进入源码进行查看。首先,进入的是中,调用的最关键的方法是如下两个:进入方法中原创 2022-09-30 17:09:35 · 521 阅读 · 0 评论 -
Netty 学习(四):ChannelHandler 的事件传播和生命周期
作者: Grey原文地址:博客园:Netty 学习(四):ChannelHandler 的事件传播和生命周期CSDN:Netty 学习(四):ChannelHandler 的事件传播和生命周期在通信客户端和服务端,处理的流程大致有如下步骤在『根据不同的消息指令解析数据包』这个步骤中,经常需要用来判断不同的指令类型并进行解析。逻辑一旦复杂,就会让代码变的极为臃肿,难以维护。Netty 中的 Pipeline 和 ChannelHandler 就是用来解决这个问题,它通过责任链设计模式来组织代码逻辑,并且能够原创 2022-09-19 22:59:25 · 604 阅读 · 0 评论 -
Netty 学习(三):通信协议和编解码
作者:无论使用 Netty 还是原生 Socket 编程,都可以实现自定义的通信协议。所谓协议就是:客户端和服务端商量好,每一个二进制数据包中的每一段字节分别代表什么含义的规则。有了规则,在服务端和客户端就可以通过这个设置好的规则进行二进制和对象的转换。通信协议格式可以参考如下格式每个部分的说明如下魔数:用来标识这个数据包是否遵循我们设计的通信协议,类似 Java 字节码开头的4字节:0xcafebabe版本标识:用来标识这个协议是什么版本,用于后续协议的升级。原创 2022-09-15 15:13:20 · 348 阅读 · 0 评论 -
Netty 学习(二):服务端与客户端通信
作者: Grey原文地址:博客园:Netty 学习(二):服务端与客户端通信CSDN:Netty 学习(二):服务端与客户端通信Netty 中服务端和客户端通信,包括几个方面,一个是 IO 处理逻辑的配置,一个是通信载体的设置,还有就是通信协议和编解码:见Netty 学习(三):通信协议和编解码无论是客户端,还是服务端,都是通过 Bootstrap 的 handler()方法指定的。我们通过模拟一个简单的客户端发送消息给服务端,服务端回写消息给客户端的示例程序来说明服务端代码如下(每个配置见注释说明)客户原创 2022-09-14 20:04:26 · 747 阅读 · 0 评论 -
Netty 学习(一):服务端启动 & 客户端启动
作者: Grey原文地址:博客园:Netty 学习(一):服务端启动 & 客户端启动CSDN:Netty 学习(一):服务端启动 & 客户端启动Netty 封装了 Java NIO 的很多功能,大大降低了 Java 网络编程的难度,同时 Netty 也支持多种协议,Netty 架构图如下注:上图来自 Netty 官网传统的Java BIO模型代码如下客户端代码服务端代码上述代码比较直白,缺点也很明显为了解决 BIO 的问题,引入了 NIO,即:一个新的连接来了以后,不会创建一个while 死循环取监听有原创 2022-09-13 20:05:56 · 659 阅读 · 0 评论 -
单机百万连接调优和 Netty 应用级别调优
将服务端代码做如下调整@Override});其中中,使用了自定义的线程池来处理耗时的getResult方法。再次运行服务端和客户端,可以查看客户端日志,QPS和AVG指标都有明显的改善........实际生产过程中,中配置的数量需要通过压测来验证。原创 2021-11-05 16:46:17 · 647 阅读 · 0 评论