Netty 4核心原理与手写RPC框架实战
  • 推荐0
  • 收藏1
  • 浏览726

Netty 4核心原理与手写RPC框架实战

谭勇德 (作者) 

  • 丛  书:咕泡学院Java架构师成长丛书
  • 书  号:978-7-121-38506-3
  • 出版日期:2020-03-27
  • 页  数:456
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:董英
电子书 ¥75.60
购买电子书
纸质版 ¥108.00
《Netty 4核心原理与手写RPC框架实战》首先从硬件层面深入分析网络通信原理,结合Java对网络I/O的API实现,将理论与实践串联起来,帮助大家透彻理解网络通信的起源,然后介绍Netty产生的背景并基于Netty手写Tomcat和RPC框架,帮助大家初步了解Netty的作用,接着分析Netty的核心原理和核心组件,基于Netty手写一个消息推送系统并进行性能调优,最后介绍设计模式在Netty中的应用和经典的面试题分析。

如果你想深入了解网络通信原理,
如果你还不知道Netty能做什么,
如果你想深入了解Netty的实现原理,
如果你看源码找不到入口,无从下手,
如果你想了解设计模式在Netty中的应用,
本书都能帮到你。
Netty 4首著/分布式技术基础Java经典框架必备/作者多年实战及授课经验与学员踩坑经验总结与升华,手写案例/核心技术/源码分析/实战演练/面试集锦一应俱全
序 言


在互联网分布式系统的推动下,Netty作为一个能够支撑高性能、高并发的底层网络通信框架而存在。Netty底层是基于Java NIO实现的,对NIO进行了非常多的优化,因此深受广大开发者尤其是一线大厂开发者的青睐。
作为一个Java开发者,如果没有研究过Netty,那么你对Java语言的使用和理解可能仅仅停留在表面,会点SSH,写几个MVC,访问数据库和缓存,这些只是初级Java开发者做的事。如果你要进阶,想了解Java服务器的高阶知识,Netty是一个必须要跨越的门槛。学会了Netty,你可以实现自己的HTTP服务器、FTP服务器、UDP服务器、RPC服务器、WebSocket服务器、Redis的Proxy服务器、MySQL的Proxy服务器等。
如果你想知道Nginx是怎么写出来的,
如果你想知道Tomcat和Jetty是如何实现的,
如果你也想实现一个简单的Redis服务器,
……
那么你应该好好研究一下Netty,它们高性能的原理都是类似的。
因为Netty 5.x已被官方弃用,本书内容基于Netty 4分析其核心原理,培养高级开发者自己“造轮子”的能力。本书不仅讲述理论知识,还围绕能够落地的实战场景,开创手写源码的学习方式,使读者学习源码更加高效。本书的主要特色是首次提供了基于Netty手写RPC框架、基于Netty手写消息推送系统等实战案例。
关于本书
适用对象 ?不知道Netty能做什么的人群
? 想深入了解Netty源码实现原理的人群
? 看源码找不到入口、无从下手的人群
? 想了解设计模式在Netty源码中如何应用的人群
CentOS版本 7.0
源码版本 Netty 4.1.6
IDE版本 IntelliJ IDEA 2017.1.4
JDK版本 JDK 1.8及以上
Gradle版本 Gradle 4.0及以上
Maven版本 3.5.0及以上
随书源码会在https://github.com/gupaoedu-tom/netty4-samples中持续更新。
关于我
为什么都叫我“文艺汤”?
我自幼爱好书法和美术,长了一双能书会画的手,而且手指又长又白,因此以前的艺名叫“玉手藝人”。中学期间,曾获市级书法竞赛一等奖,校园美术竞赛一等奖,校园征文比赛二等奖。担任过学生会宣传部长,负责校园黑板报、校园刊物的编辑、排版、设计。
2008年参加工作后,我做过家具建模、平面设计等工作,亲自设计了咕泡学院的Logo。做讲师之后,我给自己起了一个跟姓氏谐音的英文名字“Tom”,江湖人称“编程界写字写得最好的、书法界编程最牛的文艺汤”。
我的技术生涯
我的IT技术生涯应该算是从2009年开始的,在此之前做过UI设计,做过前端网页,到2009年才真正开始参与Java后台开发。在这里要感谢所有帮助我入门编程的同事和老师。2010年至2014年担任过项目组长、项目经理、架构师、技术总监,对很多的开源框架建立了自己的独特见解。我会习惯性地用形象思维来理解抽象世界。譬如:看到二进制数0和1,我会想到《周易》中的两仪——阴和阳;看到颜色值用RGB表示,我会想到美术理论中的太阳光折射三原色;下班回家看到炒菜流程,我会想到模板方法模式;坐公交车看到学生卡、老人卡、爱心卡,我会想到策略模式;等等。大家看到的这本书,很多地方都融入了这种形象思维。
为什么写书?
自2019年《Spring 5核心原理与30个类手写实战》出版以来,深受广大读者喜爱,有些学员将此书作为学习的参考教材。为继续满足大家对技术的追求,借此机会将本人多年对Netty的研究笔记整理成书奉献给各位“汤粉”。
在此,特别感谢责任编辑董英、李秀梅及电子社的团队成员的付出,尤其在疫情期间,即使是远程办公也同样坚守岗位审稿至深夜。

谭勇德(Tom)
2020年3月 于 长沙

目录

目录
第 1 篇 I/O 基础篇
第 1 章 网络通信原理................................................................................................................... 2
1.1 网络基础架构 .......................................................................................................................... 2
1.1.1 C/S 架构 ............................................................................................................................... 2
1.1.2 C/S 信息传输流程 ................................................................................................................. 2
1.2 TCP/IP 五层模型详解 ............................................................................................................. 3
1.2.1 物理层 .................................................................................................................................... 3
1.2.2 数据链路层 .................................................................................................................................. 4
1.2.3 网络层 ........................................................................................................................................ 5
1.2.4 传输层 ................................................................................................................................ 10
1.2.5 应用层 ....................................................................................................................................... 15
1.2.6 小结 ............................................................................................................................................ 16
1.3 网络通信实现原理 ................................................................................................................ 18
1.4 向浏览器输入 URL 后发生了什么 .................................................................................... 19
1.5 网络通信之“魂”——Socket ...............................................................................................21
第 2 章 Java I/O 演进之路 ........................................................................................................23
2.1 I/O 的问世 ............................................................................................................................. 23
2.1.1 什么是 I/O ................................................................................................................................. 23
2.1.2 I/O 交互流程 .............................................................................................................................. 24
2.2 五种 I/O 通信模型 ...................................................................................................................... 25
2.2.1 阻塞 I/O 模型 .......................................................................................................................... 25
2.2.2 非阻塞 I/O 模型 ....................................................................................................................... 26
2.2.3 多路复用 I/O 模型 .................................................................................................................... 27
2.2.4 信号驱动 I/O 模型 ................................................................................................................... 28
2.2.5 异步 I/O 模型 ............................................................................................................................. 28
2.2.6 易混淆的概念澄清 ..................................................................................................................... 29
2.2.7 各 I/O 模型的对比与总结 ....................................................................................................... 32
2.3 从 BIO 到 NIO 的演进 ........................................................................................................ 33
2.3.1 面向流与面向缓冲 ..................................................................................................................... 33
2.3.2 阻塞与非阻塞 ............................................................................................................................. 33
2.3.3 选择器在 I/O 中的应用 ............................................................................................................ 34
2.3.4 NIO 和 BIO 如何影响应用程序的设计 ........................................................................................ 34
2.4 Java AIO 详解 ......................................................................................................................... 37
2.4.1 AIO 基本原理 ............................................................................................................................. 37
2.4.2 AIO 初体验 ................................................................................................................................ 38
第 2 篇 Netty 初体验
第 3 章 Netty 与 NIO 之前世今生 ........................................................................................... 44
3.1 Java NIO 三件套 .................................................................................................................... 44
3.1.1 缓冲区 ........................................................................................................................................ 44
3.1.2 选择器 ........................................................................................................................................ 54
3.1.3 通道 ............................................................................................................................................ 58
3.2 NIO 源码初探 ........................................................................................................................ 63
3.3 反应堆 ..................................................................................................................................... 69
3.4 Netty 与 NIO .......................................................................................................................... 70
3.4.1 Netty 支持的功能与特性 ............................................................................................................ 70
3.4.2 Netty 采用 NIO 而非 AIO 的理由 ................................................................................................ 71
第 4 章 基于 Netty 手写 Tomcat................................................................................................... 72
4.1 环境准备 ................................................................................................................................. 72
4.1.1 定义 GPServlet 抽象类 ............................................................................................................ 72
4.1.2 创建用户业务代码 ..................................................................................................................... 73
4.1.3 完成 web.properties 配置 ......................................................................................................... 74
4.2 基于传统 I/O 手写 Tomcat ................................................................................................... 74
4.2.1 创建 GPRequest 对象 ............................................................................................................... 74
4.2.2 创建 GPResponse 对象 ........................................................................................................... 76
4.2.3 创建 GPTomcat 启动类 .............................................................................................................. 77
4.3 基于 Netty 重构 Tomcat 实现 ............................................................................................ 80
4.3.1 重构 GPTomcat 逻辑 ................................................................................................................. 80
4.3.2 重构 GPRequest 逻辑 ............................................................................................................... 83
4.3.3 重构 GPResponse 逻辑 ............................................................................................................ 84
4.3.4 运行效果演示 ....................................................................................................................................... 85
第 5 章 基于 Netty 重构 RPC 框架 .......................................................................................... 87
5.1 RPC 概述 ................................................................................................................................ 87
5.2 环境预设 ................................................................................................................................. 88
5.3 代码实战 ................................................................................................................................. 91
5.3.1 创建 API 模块 ..................................................................................................................................... 91
5.3.2 创建自定义协议 ................................................................................................................................... 91
5.3.3 实现 Provider 业务逻辑 ..................................................................................................................... 92
5.3.4 完成 Registry 服务注册 ..................................................................................................................... 93
5.3.5 实现 Consumer 远程调用 ................................................................................................................... 97
5.3.6 Monitor 监控 ....................................................................................................................................... 101
5.4 运行效果演示 ....................................................................................................................... 102
第 3 篇 Netty 核心篇
第 6 章 Netty 高性能之道 ........................................................................................................... 104
6.1 背景介绍 ............................................................................................................................... 104
6.1.1 Netty 惊人的性能数据 ....................................................................................................................... 104
6.1.2 传统 RPC 调用性能差的“三宗罪”................................................................................................... 104
6.1.3 Netty 高性能的三个主题 ................................................................................................................... 105
6.2 Netty 高性能之核心法宝 .................................................................................................... 106
6.2.1 异步非阻塞通信 ................................................................................................................................. 106
6.2.2 零拷贝 ................................................................................................................................................. 108
6.2.3 内存池 ................................................................................................................................................. 112
6.2.4 高效的 Reactor 线程模型 ................................................................................................................. 116
6.2.5 无锁化的串行设计理念 ..................................................................................................................... 118
6.2.6 高效的并发编程 ................................................................................................................................. 119
6.2.7 对高性能的序列化框架的支持 ......................................................................................................... 119
6.2.8 灵活的 TCP 参数配置能力 .............................................................................................................. 120
第 7 章 揭开 Bootstrap 的神秘面纱............................................................................................ 124
7.1 客户端 Bootstrap .................................................................................................................. 124
7.1.1 Channel 简介 ...................................................................................................................................... 124
7.1.2 NioSocketChannel 的创建 .................................................................................................................. 125
7.1.3 客户端 Channel 的初始化 ................................................................................................................ 127
7.1.4 Unsafe 属性的初始化 ......................................................................................................................... 130
7.1.5 ChannelPipeline 的初始化 .................................................................................................................. 131
7.1.6 EventLoop 的初始化 .......................................................................................................................... 132
7.1.7 将 Channel 注册到 Selector .............................................................................................................. 137
7.1.8 Handler 的添加过程 ........................................................................................................................... 139
7.1.9 客户端发起连接请求 ......................................................................................................................... 141
7.2 服务端 ServerBootstrap ........................................................................................................ 144
7.2.1 NioServerSocketChannel 的创建 ....................................................................................................... 146
7.2.2 服务端 Channel 的初始化 ................................................................................................................ 146
7.2.3 服务端 ChannelPipeline 的初始化 ................................................................................................... 149
7.2.4 将服务端 Channel 注册到 Selector .................................................................................................. 149
7.2.5 bossGroup 与 workerGroup................................................................................................................. 149
7.2.6 服务端 Selector 事件轮询 ................................................................................................................ 152
7.2.7 Netty 解决 JDK 空轮询 Bug............................................................................................................. 154
7.2.8 Netty 对 Selector 中 KeySet 的优化 .............................................................................................. 157
7.2.9 Handler 的添加过程 ........................................................................................................................... 160
第 8 章 大名鼎鼎的 EventLoop ................................................................................................... 164
8.1 EventLoopGroup 与 Reactor ............................................................................................... 164
8.1.1 再谈 Reactor 线程模型 ..................................................................................................................... 164
8.1.2 EventLoopGroup 与 Reactor 关联 ................................................................................................... 166
8.1.3 EventLoopGroup 的实例化 ................................................................................................................ 167
8.2 任务执行者 EventLoop ....................................................................................................... 169
8.2.1 NioEventLoop 的实例化过程 ............................................................................................................ 170
8.2.2 EventLoop 与 Channel 的关联 ......................................................................................................... 171
8.2.3 EventLoop 的启动 .............................................................................................................................. 172
第 9 章 Netty 大动脉 Pipeline ..................................................................................................... 176
9.1 Pipeline 设计原理 ................................................................................................................ 176
9.1.1 Channel 与 ChannelPipeline ............................................................................................................... 176
9.1.2 再谈 ChannelPipeline 的初始化 ....................................................................................................... 177
9.1.3 ChannelInitializer 的添加..................................................................................................................... 178
9.1.4 自定义 ChannelHandler 的添加过程 ............................................................................................... 181
9.1.5 给 ChannelHandler 命名 ................................................................................................................... 184
9.1.6 ChannelHandler 的默认命名规则 ...................................................................................................... 185
9.2 Pipeline 的事件传播机制 .................................................................................................... 186
9.2.1 Outbound 事件传播方式 .................................................................................................................... 194
9.2.2 Inbound 事件传播方式 ....................................................................................................................... 196
9.2.3 小结 ..................................................................................................................................................... 199
9.3 Handler 的各种“姿势” ...................................................................................................... 200
9.3.1 ChannelHandlerContext ........................................................................................................................ 200
9.3.2 Channel 的生命周期 ........................................................................................................................... 201
9.3.3 ChannelHandler 常用的 API .............................................................................................................. 201
9.3.4 ChannelInboundHandler ........................................................................................................................ 202
第 10 章 异步处理双子星 Future 与 Promise .......................................................................... 204
10.1 异步结果 Future ................................................................................................................ 204
10.2 异步执行 Promise .............................................................................................................. 205
第 11 章 Netty 内存分配 ByteBuf .............................................................................................. 209
11.1 初识 ByteBuf ...................................................................................................................... 209
11.1.1 ByteBuf 的基本结构 ......................................................................................................................... 209
11.1.2 ByteBuf 的重要 API ......................................................................................................................... 210
11.1.3 ByteBuf 的基本分类 ......................................................................................................................... 213
11.2 ByteBufAllocator 内存管理器 ........................................................................................... 214
11.3 非池化内存分配 ................................................................................................................. 218
11.3.1 堆内内存的分配 ............................................................................................................................... 218
11.3.2 堆外内存的分配 ............................................................................................................................... 221
11.4 池化内存分配 ..................................................................................................................... 224
11.4.1 PooledByteBufAllocator 简述 .......................................................................................................... 224
11.4.2 DirectArena 内存分配流程 .............................................................................................................. 229
11.4.3 内存池的内存规格 ........................................................................................................................... 231
11.4.4 命中缓存的分配 ............................................................................................................................... 231
11.4.5 Page 级别的内存分配 ...................................................................................................................... 241
11.4.6 SubPage 级别的内存分配 ................................................................................................................ 254
11.4.7 内存池 ByteBuf 的内存回收 .......................................................................................................... 268
11.4.8 SocketChannel 读取 ByteBuf 的过程 ............................................................................................ 273
第 12 章 Netty 编解码的艺术 ..................................................................................................... 281
12.1 什么是拆包、粘包 ............................................................................................................. 281
12.1.1 TCP 拆包、粘包 ................................................................................................................................ 281
12.1.2 粘包问题的解决策略 ....................................................................................................................... 282
12.2 什么是编解码 ..................................................................................................................... 282
12.2.1 编解码技术 ....................................................................................................................................... 282
12.2.2 Netty 为什么要提供编解码框架 ..................................................................................................... 283
12.3 Netty 中常用的解码器 ...................................................................................................... 284
12.3.1 ByteToMessageDecoder 抽象解码器 ............................................................................................... 284
12.3.2 LineBasedFrameDecoder 行解码器 ................................................................................................. 289
12.3.3 DelimiterBasedFrameDecoder 分隔符解码器 ................................................................................. 296
12.3.4 FixedLengthFrameDecoder 固定长度解码器 .................................................................................. 302
12.3.5 LengthFieldBasedFrameDecoder 通用解码器 ................................................................................. 303
12.4 Netty 编码器原理和数据输出 ........................................................................................... 307
12.4.1 WriteAndFlush 事件传播 ................................................................................................................. 307
12.4.2 MessageToByteEncoder 抽象编码器 ............................................................................................... 311
12.4.3 写入 Buffer 队列 ............................................................................................................................. 312
12.4.4 刷新 Buffer 队列 ............................................................................................................................. 316
12.4.5 数据输出回调 ................................................................................................................................... 322
12.5 自定义编解码 ..................................................................................................................... 335
12.5.1 MessageToMessageDecoder 抽象解码器 ........................................................................................ 335
12.5.2 MessageToMessageEncoder 抽象编码器 ........................................................................................ 336
12.5.3 ObjectEncoder 序列化编码器 .......................................................................................................... 337
12.5.4 LengthFieldPrepender 通用编码器 .................................................................................................. 338
第 4 篇 Netty 实战篇
第 13 章 基于 Netty 手写消息推送系统 .................................................................................. 342
13.1 环境搭建 ............................................................................................................................. 342
13.2 多协议通信设计 ................................................................................................................ 343
13.2.1 自定义协议规则 ............................................................................................................................... 343
13.2.2 自定义编解码器 ............................................................................................................................... 346
13.2.3 对 HTTP 的支持 ............................................................................................................................. 349
13.2.4 对自定义协议的支持 ....................................................................................................................... 351
13.2.5 对 WebSocket 协议的支持 ............................................................................................................. 351
13.3 服务端逻辑处理 ................................................................................................................. 352
13.3.1 多协议串行处理 ............................................................................................................................... 352
13.3.2 服务端用户中心 ............................................................................................................................... 354
13.4 客户端控制台处理 ............................................................................................................. 359
13.4.1 控制台接入代码 ............................................................................................................................... 359
13.4.2 控制台消息处理 ............................................................................................................................... 360
13.5 客户端 Web 页面交互实现 .............................................................................................. 363
13.5.1 Web 页面设计 ................................................................................................................................... 363
13.5.2 WebSocket 接入 ................................................................................................................................ 365
13.5.3 登录和退出 ....................................................................................................................................... 366
13.5.4 发送文字信息 ................................................................................................................................... 367
13.5.5 发送图片表情 ................................................................................................................................... 368
13.5.6 发送鲜花雨特效 ............................................................................................................................... 369
第 14 章 Netty 高性能调优工具类解析 .................................................................................... 371
14.1 多线程共享 FastThreadLocal ............................................................................................ 371
14.1.1 FastThreadLocal 的使用和创建 ....................................................................................................... 371
14.1.2 FastThreadLocal 的设值 ................................................................................................................... 379
14.2 Recycler 对象回收站 ......................................................................................................... 381
14.2.1 Recycler 的使用和创建 ................................................................................................................... 381
14.2.2 从 Recycler 中获取对象 ................................................................................................................. 386
14.2.3 相同线程内的对象回收 ................................................................................................................... 389
14.2.4 不同线程间的对象回收 ................................................................................................................... 391
14.2.5 获取不同线程间释放的对象 ........................................................................................................... 397
第 15 章 单机百万连接性能调优 ................................................................................................ 405
15.1 模拟 Netty 单机连接瓶颈 ................................................................................................ 405
15.2 单机百万连接调优解决思路 ............................................................................................. 410
15.2.1 突破局部文件句柄限制 ................................................................................................................... 410
15.2.2 突破全局文件句柄限制 ................................................................................................................... 412
15.3 Netty 应用级别的性能调优 ............................................................................................. 413
15.3.1 Netty 应用级别的性能瓶颈复现 ..................................................................................................... 413
15.3.2 Netty 应用级别的性能调优方案 ..................................................................................................... 420
第 16 章 设计模式在 Netty 中的应用 ...................................................................................... 422
16.1 单例模式源码举例 ............................................................................................................. 422
16.2 策略模式源码举例 ............................................................................................................. 423
16.3 装饰者模式源码举例 ......................................................................................................... 424
16.4 观察者模式源码举例 ......................................................................................................... 426
16.5 迭代器模式源码举例 ......................................................................................................... 427
16.6 责任链模式源码举例 ......................................................................................................... 428
16.7 工厂模式源码举例 ............................................................................................................. 430
第 17 章 Netty 经典面试题集锦................................................................................................... 432
17.1 基础知识部分 ..................................................................................................................... 432
17.1.1 TCP 和 UDP 的根本区别 ............................................................................................................... 432
17.1.2 TCP 如何保证可靠传输 ................................................................................................................... 433
17.1.3 Netty 能解决什么问题 ..................................................................................................................... 433
17.1.4 选用 Netty 作为通信组件框架的举例 .......................................................................................... 433
17.1.5 Netty 有哪些主要组件,它们之间有什么关联 .............................................................................. 433
17.2 高级特性部分 ..................................................................................................................... 434
17.2.1 相较同类框架,Netty 有哪些优势 ................................................................................................. 434
17.2.2 Netty 的高性能体现在哪些方面 ..................................................................................................... 434
17.2.3 默认情况下 Netty 起多少线程,何时启动 .................................................................................. 434
17.2.4 Netty 有几种发送消息的方式 ......................................................................................................... 434
17.2.5 Netty 支持哪些心跳类型设置 ......................................................................................................... 435
17.2.6 Netty 和 Tomcat 的区别 ................................................................................................................. 435
17.2.7 在实际应用中,如何确定要使用哪些编解码器 ............................................................................. 435

读者评论

  • 请问源码在哪里?

    mingle发表于 2021/6/14 10:19:32

电子书版本

  • Epub

同系列书