Netty
文章平均质量分 92
对Netty4.1.45进行源码级别的介绍
longhuihu
毕业于北邮计算机系,先后供职诺基亚、网易、北京域起,从事过嵌入式,移动APP开发,2015年开始从事游戏前后端的研发及技术管理,目前专注于Netty,JVM,Redis,DDD等游戏服务端关键技术领域。
展开
-
开源库GameNetty—让编写Socket服务像HTTP一样简单
在java领域,Netty已经成为编写Socket服务的首选。稍有遗憾的是,相比Spring MVC,Netty的使用门槛还是比较高的;要用好Netty,必需掌握好多线程、Socket、底层字节操作等技能,而且相关程序的调试难度也比较大。本人使用Netty从事游戏服务开发近5年,不断打磨底层网络框架,诞生了GameNetty这个工具库,权当本人对这个领域一点微不足道的回馈吧。GameNetty目前用于公司的多个项目,非常稳定。当然受限于使用场景,肯定还有很多不足之处,期望得到同行的批评指正。一、用原创 2020-12-18 09:46:06 · 335 阅读 · 0 评论 -
Netty详解之十一:ByteBuf内存泄露
我们现在知道ByteBuf是通过引用计数来管理生命周期的,换句话说,需要开发者手动管理,这对java程序员来说是非常有挑战性的一件事;为此,Netty提供了内存泄露检测机制。ByteBuf泄露检测原理首先ByteBuf是一个java对象,Netty并不关注java对象的泄露,使用者作为java开发者必须保证没有发生java对象泄露,在这个前提下,Netty为ByteBuf包含的数据区域的泄露提供诊断。java对象泄露,是指意外地缓存了不再使用对象的强引用,更多相关知识请自行搜索。假设开发者分配了原创 2020-08-04 17:36:15 · 2898 阅读 · 2 评论 -
Netty详解之九:使用ByteBuf
上一章介绍了几种典型ByteBuf的原理,这一章介绍它的使用方法,包括Netty是如何使用ByteBuf的。引用计数上一章已经提及“引用计数”的概念;引用及计数是一种历史悠久的对象生命周期管理手段。它的核心理念是在对象上增加一个int字段来维护对象“拥有者的数量”,每当对象增加一个拥有者,引用计数加一,反之减一;对象创建之初引用计数等于1,引用计数变成0的那一刻立刻释放。ByteBuf从ReferenceCounted接口继承,后者定义了引用计数的概念抽象。public interface Refe原创 2020-08-03 09:31:33 · 3069 阅读 · 1 评论 -
Netty详解之九:ByteBuf介绍
本篇深入剖析Netty读写缓冲区的设计,内容包括ByteBuf抽象、池化ByteBuf、Direct ByteBuf、Channel的读写冲缓冲区。ByteBuf为了提高性能,Netty重新设计了字节缓冲区ByteBuf,类似Nio的ByteBuffer,但工作方式略有区别,比后者更加灵活、高效。ByteBuf有几个重要属性:capacity:容量;0:缓冲区开始位置;readIndex:下一个读位置;writeIndex:下一个写位置;一个ByteBuf对象即可像byte数组一样工作,原创 2020-08-03 09:18:35 · 4313 阅读 · 0 评论 -
Netty详解之八:编解码器
Socket只能发送&接收字节数据,我们的业务层肯定期望处理预定义的数据对象,从字节数据到数据对象之间的转换叫做解码,反过来就是解码。Netty对编解码的支持非常优秀,本文以一个案例来介绍“如何编写编解码器”。编解码器案例基本定义假设我们在业务层处理的数据对象定义如下://为了缩短代码篇幅,用public字段public class SocketMessage { public int userId; public String content;}这个结构的设计有一定的典型性,原创 2020-07-31 19:11:56 · 812 阅读 · 1 评论 -
Netty详解之七:Pipeline与ChannelHandler
来自Channel底层的IO事件,会转发给pipeline来处理,另一方面用户直接调用Channel的IO方法也是通过pipeline达到底层。因此pipepline是Netty内核与业务层之间的传送带,是一个双向的IO事件通道,其中从业务层往底层方向叫"outbound",从底层通往上层,叫“inbound"。Pipeline本质上是由一个一个ChannelHandler节点组成的双向链表,其中既有Netty预置的节点,也有用户代码添加的节点。每个节点处理特定IO事件,或者将IO事件进行转换再传递给下一原创 2020-07-30 14:49:11 · 1129 阅读 · 0 评论 -
Netty详解之六:Channel
Java NIO就已经将底层socket链路抽象为java.nio.channels.Channel,Netty也将其抽象为io.netty.channel.Channel。如果将Netty比如为一条高速运转的生产线,那么EventLoop是这条生产线的动力装置,而Channel则是一个个的机械臂,EventLoop驱动着Channel不断地执行IO操作。Channel可以认为Channel是对socket连接的抽象,一个支持IO操作的通道,Netty对Channel的定义如下:public inte原创 2020-07-29 14:19:27 · 4737 阅读 · 0 评论 -
Netty详解之五:EventLoop
上一篇介绍了Netty的EventExecutor框架,这一篇还是围绕EventExecutor,介绍它在通信模块里是如何运用的。EventLoopGroup和EventLoopEventExecutor到了通信模块内,就变成了EventLoop,表明它是一个事件处理循环;EventLoop相关类型全部定义在io.netty.channel这个package下面。EventLoopGroup接口扩展自EventExecutorGroup,增加了注册Channel的方法:public interfac原创 2020-07-29 09:26:45 · 844 阅读 · 0 评论 -
Netty详解之四:EventExecutor框架
Netty是按事件驱动模型来工作的,在涉及Netty的网络通信功能之前,我们先彻底剖析一下它的事件驱动机制,或者说是Netty的并发机制。netty并发相关类全部位于io.netty.util.concurrent下面,居于核心位置的接口有两个:EventLoopGroup和EventLoop。由于Netty并发机制相对比较独立,完全可独立于其他功能而被使用,所以这块的分析我们采用自顶向下的方式。Netty的并发机制实际上是java executor框架的一个实现,它比JDK的executor更加强大一原创 2020-07-28 12:21:38 · 4379 阅读 · 0 评论 -
Netty详解之三:Server端启动过程
Netty的源码包里面,io.netty.example下有很多示例代码可供参考,是学习使用Netty的利器;另外要掌握netty,需要对它的关键源码有一定程度的了解。从这一章开始,我们开始跟着源码学习Netty的各核心模块,源码使用当前最新稳定版4.1.45.Final。另外要能读懂Netty源码,有几个前提条件:掌握java的多线程原理,有一定深度,尤其对java.util.concurrent.Executor框架要熟悉;对TCP协议有一定了解,会Socket编程,掌握java NIO相关接口原创 2020-07-28 11:46:33 · 737 阅读 · 0 评论 -
Netty详解之二:Netty概述
总体上,Netty是一个高性能网络编程框架,不仅仅是对java socket接口的封装,它的功能可概括如下:事件驱动的异步编程模型(reactor模型)灵活的线程池管理;支持常见的传输层协议和应用层协议;屏蔽了底层bug(比如NIO Epoll Bug),更加稳定高效。总之,netty性能较好,功能较全,文档相对完善,基本成为了java领域socket编程的首选工具。Reactor模型很多文章将Recactor模型和IO模型混在一起介绍,是不合适的;因为这二者不在同一个层次,reactor原创 2020-07-27 19:25:43 · 679 阅读 · 0 评论 -
Netty详解之一:IO模型与Java NIO
Netty是一个网络IO框架,想要掌握Netty,必须要对于TCP协议、Socket这些基础知识有一个了解。这方面的经典书籍莫过于《UNIX网络编程卷1:套接字联网API》和《TCP-IP详解卷1》。当然,没有这么深厚的基础知识,也不妨碍你使用Netty。由于Netty是Java领域的框架,因此本系列文章在涉及相关概念时,会优先使用java领域的说法。因此有可能在某些地方显得不够严谨,这首先是本人水平有限所致,有时也是有意为之。IO模型在Java网络编程领域,我们通常有三种网络IO模型:bio(Blo原创 2020-07-27 19:17:20 · 634 阅读 · 0 评论