上一个死磕 Java 专栏【死磕 NIO】(当然写的不是很好,争取今年将它重写一遍)是**【死磕 Netty】**的铺垫,对于我们 Java 程序员而言,我们在实际开发过程一般都不会直接使用 Java NIO 作为我们的网络编程框架,因为写出一套高质量的 Java NIO 程序并不是一件容易的事,除了 Java NIO 固有的复杂性和 bug 之外,作为 NIO 服务端,我们要处理的事情太多了,如网络闪断、客户端认证、消息编解码、半包读写,客户端一样也有很多复杂的事情要处理,所以如果我们对 Java NIO 没有足够了解,没有足够的网络编程经验的话,利用 Java NIO 来编写一个高性能的稳定网络编程框架并不是一件容易的事。 所以我们一般都不会直接使用 Java NIO ,当然有特殊需求除外。
Netty 作为目前互联网中间件领域使用最广泛最核心的网络通信框架,它使用简单,功能强大、高性能且稳定,而且经历过大规模的生产验证,质量能够得到保障。它被广泛使用,几乎所有互联网中间件或者大数据领域均离不开 Netty,比如知名的 Dubbo、RocketMQ,Spark、ES 等等。所以掌握 Netty 是作为一名初中级工程师迈向高级工程师最重要的技能之一。
为什么要学 Netty
可能有小伙伴说,在实际工作中我并没有用到 Netty,对网络编程涉及的内容也不多,都是些业务逻辑,那还有必要花精力来学习 Netty 吗?当然如果你止步于 CRUD boy ,不想进大厂,不追求高薪的话,确实是没有必要学习 Netty,连这篇文章你也可以不用再看了,因为后面我都是来说服你要学 Netty 的。
在互联网大厂的中高级面试中,网络编程绝对是一个必问的栏目,只要涉及到网络编程必问 Netty,因为 Netty 是考察一个人 Java 内功最佳的面试题,因为它涉及的知识点多,而且重要。比如:
- 网络协议相关知识点
- 内存处理相关知识点
- IO 及 OS 内核相关知识点
- Java 并发相关知识点
- 数据结构相关知识点
- 设计模式相关知识点
是不是只要一个 Netty 就可以把面试官想问的全部都问了?确实是这样,不仅可以问,而且它们是环环相扣,紧密关联的,大明哥在网上收集并整理了一些 Netty 面试题:
- Netty 的核心有哪些,这些组件承担的角色是什么?
- 说说你对 Reactor 模式的理解,Netty 采用的是哪种线程模型?这种线程模式的优势在哪里?
- 说说什么是粘包和粘包?怎么产生的?有哪些解决方案?Netty 又提供了哪些方案?
- 什么是零拷贝(Zero-Copy)?Netty 提供了哪些零拷贝的技术?Netty如何利用零拷贝来提升性能的?
- 内存池了解吗?解释下内存池在Netty中的作用。
- 内存泄露了解吗?如何避免内存泄露?Netty 是如何避免内存泄露的?又提供了哪些检测机制?
- 了解堆外内存吗?Netty 是怎么规避堆外内存泄露的?
- 知道断线重连功能吗?怎么实现的?Netty 的重连机制是怎么样的?它的作用又是什么?
- 解释一下心跳检测在 Netty 中的原理和应用场景。
- Netty如何处理网络中断和异常?
- 知道异步编程吗?JDK 的 Future 的核心原理是什么? Promise 呢?Future和Promise在Netty中的角色是什么?
- 什么是ChannelPipeline ?它采用了哪种设计模式?Netty 中使用了哪些设计模式?你在实际生产环境使用过哪些?怎么使用的?
这 12 连问能顶住吗?涉及到的知识点是不是及其广泛而且重要,而且这些还是没有延伸的,比如问 Netty 内存池,就可以延伸到堆内堆外内存,由此可以推到 JVM ,GC 相关知识点等等。线程模型可以延伸到 Java 的线程池,任务调度去。还有锁、性能优化等等。
所以,通过学习 Netty,可以把 Java 大壁江山的知识点都串连起来,达到融会贯通的作用。当你掌握 Netty 后,你对 I/O 模型 、内存管理、线程模型、数据结构、Java 并发等知识点基本上都会有一个更加深层次的认识。
所以,来和大明哥一起卷 Netty 吧!!
为什么写死磕 Netty
有小伙伴可能会问,现在市面上这么多 Netty 教程,从入门、实战到源码,几乎 Netty 的所有知识点都可以在网上找到,为什么还要花大精力来写这个课程呢?但是,不知道小伙伴们注意没有,这些资料都是零散的啊,很难找到系统性的学习 Netty 课程,比如在讲 Netty 的内存模型,网上几乎所有的资料就仅仅只是 Netty 的内存模型,但是大明哥会讲解操作系统的内存管理,内存管理算法,以及内存分配器 jemalloc 和 Netty 的内存模型,Netty 的内存模型我不仅仅有理论知识还有源码分析。在比如 Netty 的 ByteBuf 组件,市面很多资料都仅仅只介绍 ByteBuf 的 API 使用,但是大明哥会讲 ByteBuf API、零拷贝、内存分配机制以及源码等等。
死磕 Netty 绝对是大明哥目前死磕系列写的最最认真的,课程非常详细,整个课程分为四个部分:入门、进阶、实战、源码,文章数量不少于 120 篇。最最重要的是这个也是我学习 Netty 的路径,个人认为这是一个比较好且完备的学习路径。
当然大明哥也不是 Netty 高手,在生产环境也没有经过大规模的应用,对 Netty 也有很多理解不到位的地方,所以文章难免出错的地方,提前打招呼,免得到时被骂,O(∩_∩)O哈哈~!!!!
最后贴一个课程的全局图例: