科技>计算机>网络与互联网
Netty4核心原理与手写RPC框架实战

Netty4核心原理与手写RPC框架实战"

作者:谭勇德(Tom)
ISBN:9787121385063
定价:¥108.0
字数:634千字
页数:456
出版时间:2020-03
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

《Netty 4核心原理与手写RPC框架实战》首先从硬件层面深入分析网络通信原理,结合Java对网络I/O的API实现,将理论与实践串联起来,帮助大家透彻理解网络通信的起源,然后介绍Netty产生的背景并基于Netty手写Tomcat和RPC框架,帮助大家初步了解Netty的作用,接着分析Netty的核心原理和核心组件,基于Netty手写一个消息推送系统并进行性能调优,最后介绍设计模式在Netty中的应用和经典的面试题分析。如果你想深入了解网络通信原理,如果你还不知道Netty能做什么,如果你想深入了解Netty的实现原理,如果你看源码找不到入口,无从下手,如果你想了解设计模式在Netty中的应用,本书都能帮到你。

前言

序 言 在互联网分布式系统的推动下,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

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个