华为应用市场总架构师超神之作:用19个案例透解Netty

 

前言

读者评价:

实际上,本书更像是以 netty 作为参考,阐述了构建一个高性能通信框架的主要考量(当然,也讲了 netty 的一些坑);

第一,是线程模型,两方面:

  1. Netty 采用了传统的 reactor 模式,利用 boss event loop group(acceptor) & worker event loop group(io worker)还处理 连接建立和 io 处理,之所以分开,是因为 io 协议的解析往往较为耗时,二者分开不仅实现业务隔离,更方便调优;同时,减少锁竞争;
  2. 采用了 event loop 模式,单个线程,异步化地处理各种事件和动作(网络事件、读写事件、业务动作等等);一来减少竞争(串行化设计),二来,控制线程数,来防止因为线程过多造成系统过早进入【零界点】;

第二,是减少锁竞争,也是两个方面:

  1. netty 通过 channelid 来实现 io event loop 和业务线程池的绑定,减少了队列层面的锁竞争;
  2. 串行化一个 eventloop 处理所有相关事件和动作,减少跨线程同步的必要;

第三,内存优化,还是两个方面

  1. netty 的核心,是池化技术,基于 jemalloc(二叉树 + 链表)的方式,管理内存池;利用 byte[] 的复用,来减少 gc 的压力;
  2. netty 还是用了动态统计内存字节数(上一次收取,作为下一次分配的 hint)来减少因为缓冲区分配不足导致的 copy;

第四,功能丰富度:

包括了空闲连接监测(ping-ping & ping-pong 模式的支持)、流量塑形等等;

最后,是编程模型,三个要素:

EventLoop、ChannelPipeline、ChannelHandler、三者共同实现了 Netty 的异步化和基于回调的编程模型;

作者如是说:

在4年多里,很多读者及Netty学习者向我咨询Netty相关的问题,这些问题加起来多达上千个,通过对问题做汇总和分析,可以归纳为如下几类:

  1. Netty初学者,想了解学习Netty需要储备哪些技能,掌握哪些知识点,有什么学习技巧可以更快地掌握Netty。
  2. 《Netty 权威指南》的读者,学习完理论知识后,想在实际项目中使用,但是真正跟具体项目结合在一起解决实际问题时,又感觉比较棘手,不知道自己使用的方式是否是最优的,希望能够多学一些案例实践方面的知识,以便更好地在业务中使用Netty。
  3. 在实际项目中遇到了问题的工程师,由于对Netty底层细节掌握得不扎实,无法有效地定位并解决问题。

Netty的一个特点就是入门相对容易,但是真正掌握并精通是非常困难的,原因有如下几个:

  1. 涉及的知识面比较广。Netty作为一个高性能的NIO通信框架,涉及的知识点包括网络通信、多线程编程、序列化和反序列化、异步和同步、SSL/TLS安全、内存池、HTTP等各种协议栈,这些知识点在Java 语言中本身就是难点和重点,如果对这些基础知识掌握不扎实,是很难真正掌握好Netty的。
  2. 调试比较困难。因为大量使用异步编程接口,以及消息处理过程中的各种线程切换,相比传统同步代码,Netty 代码调试难度比较大。
  3. 类继承层次比较深,有些代码很晦涩(例如内存池)。对于初学者而言,通过阅读代码来掌握Netty的难度还是很大的。
  4. 代码规模庞大。目前,Netty 的代码规模已经非常庞大,特别是协议栈部分,提供了对HTTP/2、MQTT. WebSocket等各种协议的支持,相关代码非常多。如果学习方式不当,抓不住重点,则全量阅读Netty源码,既耗时又很难吃透,很容易半途而废。
  5. 资料零散,缺乏与实践相关的案例。网上Netty的各种资料非常多,但是都以理论讲解为主,Netty 在各行业中的应用、问题定位技巧及案例实践方面的资料很少,缺乏系统性的实践总结,是Netty学习的一大痛点。

写作初衷:

在过去的几年中,我利用业余时间尽量帮大家答疑解惑,但实际上一个人很难回答所有读者的问题,有些问题需要业务描述、故障场景、日志,甚至要看源码,而且需要反复多次沟通来弄清楚问题,对于个人而言,时间和精力都很难得到保证。

于是我对手头大家咨询的问题做了归类分析,结合我们自己的业务和平台多年来在Netty实践中积累的经验,写作了本书。本书以问题案例做牵引,通过对案例进行剖析,讲解问题背后的原理,并结合Netty源码分析,让读者能够真正掌握Netty,在实际工作中少犯错。在案例的分析过程中,还穿插讲解了Netty 的问题定位思路、方法、技巧,以及解决问题使用的相关工具,“授人以鱼不如授人以渔”,只有掌握了这些才能在项目中更放心地使用Netty。

内容特点:

书中的案例涵盖了Netty 绝大多数常用的功能,以及容易犯错的地方,具有通用性和普遍性。学习这些案例,对于在实际业务工作中用好Netty具有很大的帮助和启发作用。另外,在讲解Netty 框架本身的同时,也会穿插一些背景知识介绍,例如Java信号量和优雅停机机制、Java的NIO类库、HTTP协议栈等。知识都是相互关联的,很难在基础知识不扎实的情况下掌握更高阶的知识。

书籍目录:

需要完整PDF版的朋友关注小编后私信“666”免费获取

 

 

 

 

 

 

 

 

 

最后

在实际项目中仅仅会用Netty 是远远不够的,由于Netty承担了RPC调用工作,一旦发生问题会导致RPC或者微服务调用失败,由此引起的业务中断后果很严重。除了实践,需要熟练掌握Netty的核心类库和关键调度流程,这样才能得心应手地解决各种问题。

这份完整PDF版小编已经整理好了,需要的的朋友关注小编后私信“666”免费获取