欢迎光临
免费的PDF电子书下载网站

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

编辑推荐

★ 《Spring 5核心原理与30个类手写实战》作者全新力作

★ 集作者多年实战及授课经验与学员踩坑经验总结之大成

★ 基于Netty 4,学习Dubbo、Spring Cloud等分布式技术基础必备

★ 全网独创“手写源码学习法”,让学习源码更高效

★ 提供基于Netty手写RPC框架、手写消息推送系统实战案例

★ 快速掌握Bootstrap、EventLoop、Pipeline、ByteBuf等核心技术

★ 深度剖析Netty的原理与特性,让学习Netty变得轻松易上手

★ 实用性强,是一本面向Netty应用者不可多得的实战类好书

★ 既可作为Netty应用实战指导书,又可作为日常学习工具书

 ;

让30W 学员受益的“手写源码学习法”开创者

影响100W 程序员的“Java架构师成长路径”制定人 ; ; 全新力作

“手写Spring”畅销书作者

 ;

全网首发Netty 4版本的分布式通信技术必备图书

从网络通信硬件到Java I/O核心原理

从实战到面试一应俱全

 ;

一本书读懂Netty 4分布式通信技术!

 ;

内容简介

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

如果你想深入了解网络通信原理,
如果你还不知道Netty能做什么,
如果你想深入了解Netty的实现原理,
如果你看源码找不到入口,无从下手,
如果你想了解设计模式在Netty中的应用,

作者简介

谭勇德(Tom)

 ;

10余年Java开发经验。

咕泡学院联合创始人。

著有畅销书《Spring 5核心原理与30个类手写实战》。

在大型IT公司担任过CTO、系统架构师。

精通Java、JS、CSS、AS、PHP等;负责过多个大型分布式系统的微服务架构的技术改造;多年来对Netty框架有深入研究及独特见解;开发过多套企业内部UI框架和ORM框架;热衷于分享经验,共同进步。

格言:不只做一个技术者,更要做一个思考者。

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

目录

目录
第 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 中的应用 ...............................................Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载Netty 4核心原理与手写RPC框架实战 PDF下载

媒体评论

Netty是当今互联网通信必备的底层技术,本书从硬件入手,深刻剖析网络通信原理,掌握本书中的知识是你学习其他互联网技术必备的前置条件。

James,咕泡学院联合创始人

 

本书结合多年的授课经验和学员的踩坑经验整理而成,是学习分布式技术不可或缺的实战书籍。

Mic,咕泡学院联合创始人

前沿

序  言

 

 

在互联网分布式系统的推动下,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手写消息推送系统等实战案例。

关于本书

适用对象

l 不知道Netty能做什么的人群

l 想深入了解Netty源码实现原理的人群

l 看源码找不到入口、无从下手的人群

l 想了解设计模式在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月 于 长沙

 

免费在线读

7.2.7  Netty解决JDK空轮询Bug

大家应该早就听说过臭名昭著的Java NIO epoll的Bug,它会导致Selector空轮询,最终导致CPU使用率达到100%。官方声称JDK 1.6的update18修复了该问题,但是直到JDK 1.7该问题仍旧存在,只不过该Bug发生概率降低了一些而已,并没有被根本解决。出现此Bug是因为当Selector轮询结果为空时,没有进行wakeup或对新消息及时进行处理,导致发生了空轮询,CPU使用率达到了100%。我们来看一下这个问题在issue中的原始描述。

This is an issue with poll (and epoll) on Linux. If a file descriptor for a connected socket is polled with a request event mask of 0, and if the connection is abruptly terminated (RST) then the poll wakes up with the POLLHUP (and maybe POLLERR) bit set in the returned event set. The implication of this behaviour is that Selector will wakeup and as the interest set for the SocketChannel is 0 it means there aren any selected events and the select method returns 0.

具体解释为:在部分Linux Kernel 2.6中,poll和epoll对于突然中断的Socket连接会对返回的EventSet事件集合置为POLLHUP,也可能是POLLERR,EventSet事件集合发生了变化,这就可能导致Selector会被唤醒。

这是与操作系统机制有关系的,JDK虽然仅仅是一个兼容各个操作系统平台的软件,但遗憾的是在JDK 5和JDK 6最初的版本中,这个问题并没有得到解决,而将这个“帽子”抛给了操作系统方,这就是这个Bug一直到2013年才最终修复的原因。

在Netty中最终的解决办法是:创建一个新的Selector,将可用事件重新注册到新的Selector中来终止空轮询。我们来回顾一下事件轮询的关键代码。

protected void run() {

        for (;;) {

switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {

                    case SelectStrategy.CONTINUE:

                        continue;

                    case SelectStrategy.SELECT:

                        select(wakenUp.getAndSet(false));

//省略select的唤醒逻辑

                    default:

                }

 

               //事件轮询处理逻辑

        }

}

前面我们提到select()方法解决了JDK空轮询的Bug,那么它到底是如何解决的呢?下面我们来一探究竟,先来看一下select()方法的源码。

public final class NioEventLoop extends SingleThreadEventLoop {

 

...

 

int selectorAutoRebuildThreshold = SystemPropertyUtil.getInt("io.netty. selectorAutoRebuildThreshold", 512);

//省略判断代码

        SELECTOR_AUTO_REBUILD_THRESHOLD = selectorAutoRebuildThreshold;

...

private void select(boolean oldWakenUp) throws IOException {

       Selector selector = this.selector;

   long currentTimeNanos = System.nanoTime();

   for (;;) {

        //省略非关键代码

    long timeoutMillis = (selectDeadLineNanos - currentTimeNanos 500000L) / 1000000L;

             int selectedKeys = selector.select(timeoutMillis);

             selectCnt ;

 

             //省略非关键代码

 

            long time = System.nanoTime();

            if (time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos) {

                 // timeoutMillis elapsed without anything selected.

                 selectCnt = 1;

            } else if (SELECTOR_AUTO_REBUILD_THRESHOLD > 0 &&

 selectCnt >= SELECTOR_AUTO_REBUILD_THRESHOLD) {

                    //日志打印代码

 

                    rebuildSelector();

                    selector = this.selector;

 

                    // Select again to populate selectedKeys.

                    selector.selectNow();

                    selectCnt = 1;

                    break;

                }

 

                currentTimeNanos = time;

            }

 

       //省略非关键代码

  }

}

    ...

}

从上面的代码中可以看出,Selector 每一次轮询都计数 selectCnt ,开始轮询会将系统时间戳赋值给timeoutMillis,轮询完成后再将系统时间戳赋值给time,这两个时间会有一个时间差,而这个时间差就是每次轮询所消耗的时间。从上面的逻辑可以看出,如果每次轮询消耗的时间为0s,且重复次数超过512次,则调用rebuildSelector()方法,即重构Selector,具体实现代码如下。

public void rebuildSelector() {

        //省略判断语句

        rebuildSelector0();

    }

 

    private void rebuildSelector0() {

        final Selector oldSelector = selector;

        final SelectorTuple newSelectorTuple;

 

   newSelectorTuple = openSelector();

       //省略非关键代码

 

        // Register all channels to the new Selector.

        int nChannels = 0;

        for (SelectionKey key: oldSelector.keys()) {

           //省略非关键代码和异常处理

                key.cancel();

                SelectionKey newKey = key.channel().register(newSelectorTuple.unwrappedSelector, interestOps, a);

                

        }

 

        //省略非关键代码

    }

实际上,在rebuildSelector()方法中,主要做了以下三件事情。

(1)创建一个新的Selector。

(2)将原来Selector中注册的事件全部取消。

(3)将可用事件重新注册到新的Selector,并激活。

就这样,Netty完美解决了JDK的空轮询Bug。看到这里,是不是感觉没那么神秘了?

Netty 4核心原理与手写RPC框架实战 pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:Netty 4核心原理与手写RPC框架实战