Netty源码分析(完整版)

前言

前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长连接解决连接数和阻塞io问题

为此详细阅读了netty源码, 熟悉了netty的各个主要的特性以及疏通各个组件的关联关系, 所以想把这段时间的学习内容, 学习经验毫无保留的分享给大家, 自己提高的同时也帮助大家一起成长

内容中我会把每个知识点通过每个章节去进行剖析, 每个章节也会尽可能的将关键的流程细化, 希望大家在学习的过程中能领会到源码的关键步骤, 最好能自己能debug到源码进行剖析

此文档会根据自己对netty的学习深入, 不断地更新, 不断的细化, 不断的深入各个模块的原理

由于个人技术能力有限, 难免会有疏漏和错误的地方(个人学习过程中就发现了一些其他文档中的错误), 发现问题, 也希望各位同学及时指正(轻喷.....)

下面概括一些要点:

1.  学习netty源码需要什么知识?

java基础就不用说了.....

由于本文档只是netty源码剖析并不是netty教程, 所以这里并不打算讲nio和netty怎么用, 不了解的小伙伴可以首先熟悉下nio编程的基础, 没做过实战项目没关系, 能写出helloworld, 并知道每一步是做什么的, 足矣

其次要有netty基本使用的能力, 我们要知道netty完成链路之后在哪里执行我们自定义的业务逻辑, 收到服务端(或者客户端)消息之后我们需要在什么地方处理, 如果这块不熟悉, 可以网上找个demo学习, 或者学习下《netty实战》, 对此会有一个清晰的认识

再次我们熟悉多线程相关的知识, 最好是用过jdk的线程并发库

如果以上知识都没问题, 那就开始愉快的学习吧

2.  这个文档如何学习?

文章会以章节的形式将每个模块的关键部分进行剖析, 并且随着自己研究的不断深入进行补充和修改, 文章并不打算对每个细节进行细致入微的讲解, 而是提炼关键代码, 辅助大家串通整个netty的脉络, 串通的脉络之后, 我们会很容易理解各个模块在框架中所承担的责任和义务, 之后如果进行自学就会变得非常容易

内容会尽量用简单通俗的语言进行描述, 并且会附带我曾经学习某一部分的思考逻辑, 这些思路有可能会和读者产生共鸣, 从而能得心应手的解决学习当中的困惑

每一个源码, 我都会通过注释去讲解一些关键逻辑, 小伙伴们可以多关注下注释

在源码剖析过程中, 同学们需要自己debug进源码, 自己去疏通相关的逻辑关系, 只有课后自己动手, 才会真正掌握其原理, 否则, 是很难消化每一部分的精髓的

在内容中我也会提示大家, 需要关注的哪些步骤, 初学者只需要将自己的精力放在需要关注的步骤就好. 如果对其他步骤感兴趣也可以课后进行自行剖析

由于文章中会经常跟源码, 有的方法会跟的比较深, 所以跟踪方法的步骤会用加粗标志, 方便读者找到相应方法

最好, 是一边看着文档另一边看着源码, 防止方法跟踪太深自己找不到回来的路........

3.  这篇文档学习完之后能达到什么水平?

写这篇文档的目的就是通过带同学们解析源码的方式串通netty的整改脉络, 学完之后之后不能保证你能精通netty, 但至少我们能串通起整个脉络, 熟悉每一个组件, 每一个模块在netty中所承担的角色, 以及一个消息从发送到接受经历了什么步骤, 从而使我们能更容易的理解到这个框架的精髓, 为以后的继续深入打下坚实的根基......

当然, 如果你学习的足够认真, 真正理解了脉络, 自己写一个简单的netty也不是不可能

用我最近的喜欢的鸡汤激励下小伙伴: 种树最好的时间是十年前, 其次是现在....

最后提醒下读者, 本文基于Netty的版本是4.1.16.Final

废话了这么多, 正文开始.....

目录:

第一章: 服务端启动流程

第一节: 服务端初始化

第二节: NioServerSocketChannel的创建

第三节: 服务端Channel的初始化

第四节: 注册多路复用

第五节: 绑定端口

第二章: NioEventLoop

第一节: NioEventLoopGroup之创建线程执行器

第二节: NioEventLoopGroup之NioEventLoop的创建

第三节: 初始化线程选择器

第四节: NioEventLoop线程启动

第五节: 优化selector

第六节: 执行select操作

第七节: 处理IO事件

第八节: 执行任务队列

第三章: 客户端接入流程

第一节: 初始化NioSocketChannelConfig

第二节: 处理接入事件之handle的创建

第三节: NioSocketChannel的创建

第四节: NioSocketChannel注册到selector

第五节: 监听读事件

第四章: pipeline

第一节: pipeline的创建

第二节: handler的添加

第三节: handler的删除

第四节: 传播inbound事件

第五节: 传播outbound事件

第六节: 传播异常事件

第七节: 前章节内容回顾

第五章: ByteBuf

第一节: AbstractByteBuf

第二节: ByteBuf的分类

第三节: 缓冲区分配器

第四节: PooledByteBufAllocator简述

第五节: directArena分配缓冲区概述

第六节: 命中缓存的分配

第七节: page级别的内存分配

第八节: Subpage级别的内存分配

第九节: ByteBuf的回收

第十节: SocketChannel读取数据的过程

第六章: 解码器

第一节: ByteToMessageDecoder

第二节: 固定长度解码器

第三节: 行解码器

第四节: 分隔符解码器

第七章: 编码器和写数据

第一节: writeAndFlush事件传播

第二节: MessageToByteEncoder

第三节: 写buffer队列

第四节: 刷新buffer队列

第五节: Future和Promise

第八章: 高性能工具类FastThreadLocal和Recycler

第一节: FastThreadLocal的使用和创建

第二节: FastThreadLocal的set方法

第三节: recycler的使用和创建

第四节: recycler中获取对象

第五节: 同线程回收对象

第六节: 异线程回收对象

第七节: 获取异线程释放的对象

下一节: 服务端初始化

Netty源码分析(前言, 概述及目录)的更多相关文章

  1. Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述

    Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...

  2. Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化

    Netty源码分析第一章:  Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...

  3. Netty 源码分析系列(二)Netty 架构设计

    前言 上一篇文章,我们对 Netty做了一个基本的概述,知道什么是Netty以及Netty的简单应用. Netty 源码分析系列(一)Netty 概述 本篇文章我们就来说说Netty的架构设计,解密高 ...

  4. Netty源码分析第2章(NioEventLoop)---->第1节: NioEventLoopGroup之创建线程执行器

    Netty源码分析第二章: NioEventLoop 概述: 通过上一章的学习, 我们了解了Server启动的大致流程, 有很多组件与模块并没有细讲, 从这个章开始, 我们开始详细剖析netty的各个 ...

  5. Netty源码分析第3章(客户端接入流程)---->第1节: 初始化NioSockectChannelConfig

    Netty源码分析第三章: 客户端接入流程 概述: 之前的章节学习了server启动以及eventLoop相关的逻辑, eventLoop轮询到客户端接入事件之后是如何处理的?这一章我们循序渐进, 带 ...

  6. Netty源码分析第4章(pipeline)---->第1节: pipeline的创建

    Netty源码分析第四章: pipeline 概述: pipeline, 顾名思义, 就是管道的意思, 在netty中, 事件在pipeline中传输, 用户可以中断事件, 添加自己的事件处理逻辑, ...

  7. Netty源码分析第4章(pipeline)---->第4节: 传播inbound事件

    Netty源码分析第四章: pipeline 第四节: 传播inbound事件 有关于inbound事件, 在概述中做过简单的介绍, 就是以自己为基准, 流向自己的事件, 比如最常见的channelR ...

  8. Netty源码分析第5章(ByteBuf)---->第1节: AbstractByteBuf

    Netty源码分析第五章: ByteBuf 概述: 熟悉Nio的小伙伴应该对jdk底层byteBuffer不会陌生, 也就是字节缓冲区, 主要用于对网络底层io进行读写, 当channel中有数据时, ...

  9. Netty源码分析第5章(ByteBuf)---->第4节: PooledByteBufAllocator简述

    Netty源码分析第五章: ByteBuf 第四节: PooledByteBufAllocator简述 上一小节简单介绍了ByteBufAllocator以及其子类UnPooledByteBufAll ...

随机推荐

  1. abp框架里使用Redis

    首先引用 nuget Abp.RedisCache 在 appsettings.json加上Redis服务器配置 "RedisCache": { "ConnectionS ...

  2. qt调用sql server存储过程并获取output参数

    最近新做的一个项目需要使用qt5连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章: <Q ...

  3. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  4. Python datetime.md

    datetime datetime模块包含了一些用于时间解析.格式化.计算的函数. Times 时间值由time类来表示, Times有小时, 分, 秒和微秒属性. 以及包含时区信息. 初始化time ...

  5. Odoo Model内容详解

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9390688.html  一:Odoo模型属性   1:_name     模型的唯一标识:如果没有继承其他模型 ...

  6. 使用uploadify多文件上传,单个删除上传成功的图片

    总体思路:在用uploadify上传成功一张图片,用js生成相应的元素,放到指定的位置,并且加上删除的标志.在保存的时候,把是img的所有的值,放到对应到字段里. jsp: <tr> &l ...

  7. WorldWind源码剖析系列:网络下载类WebDownload

    网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...

  8. Git同时使用不同平台代码仓库

    问题描述 公司项目使用代码仓库为gitinn/gitlab等,个人项目使用github进行托管,而公司项目和个人项目设置的邮箱和用户名是不同的,而ssh的密钥对又是基于这两个信息生成的,所以此时想要同 ...

  9. PAT B1007 素数对猜想 (20 分)

    让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...

  10. RPC使用rabbitmq实现

    两天时间重写公司架构在本地实现测试学习 双向连接客户端和服务端配置: 连接rabbitmq服务器 定义消息队列 配置发送请求的模板:交换机.消息队列. 配置监听处理:监听的队列.消息转换处理 配置处理 ...