一卷到底,大明哥带你横扫 Netty

2023-10-16 03:36

本文主要是介绍一卷到底,大明哥带你横扫 Netty,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一个死磕 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 内功最佳的面试题,因为它涉及的知识点多,而且重要。比如:

  1. 网络协议相关知识点
  2. 内存处理相关知识点
  3. IO 及 OS 内核相关知识点
  4. Java 并发相关知识点
  5. 数据结构相关知识点
  6. 设计模式相关知识点

是不是只要一个 Netty 就可以把面试官想问的全部都问了?确实是这样,不仅可以问,而且它们是环环相扣,紧密关联的,大明哥在网上收集并整理了一些 Netty 面试题:

  1. Netty 的核心有哪些,这些组件承担的角色是什么?
  2. 说说你对 Reactor 模式的理解,Netty 采用的是哪种线程模型?这种线程模式的优势在哪里?
  3. 说说什么是粘包和粘包?怎么产生的?有哪些解决方案?Netty 又提供了哪些方案?
  4. 什么是零拷贝(Zero-Copy)?Netty 提供了哪些零拷贝的技术?Netty如何利用零拷贝来提升性能的?
  5. 内存池了解吗?解释下内存池在Netty中的作用。
  6. 内存泄露了解吗?如何避免内存泄露?Netty 是如何避免内存泄露的?又提供了哪些检测机制?
  7. 了解堆外内存吗?Netty 是怎么规避堆外内存泄露的?
  8. 知道断线重连功能吗?怎么实现的?Netty 的重连机制是怎么样的?它的作用又是什么?
  9. 解释一下心跳检测在 Netty 中的原理和应用场景。
  10. Netty如何处理网络中断和异常?
  11. 知道异步编程吗?JDK 的 Future 的核心原理是什么? Promise 呢?Future和Promise在Netty中的角色是什么?
  12. 什么是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哈哈~!!!!

最后贴一个课程的全局图例:

这篇关于一卷到底,大明哥带你横扫 Netty的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218749

相关文章

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

【Netty】netty中都是用了哪些设计模式

对于工程师来说,掌握并理解运用设计模式,是非常重要的,但是除了学习基本的概念之外,需要结合优秀的中间件、框架源码学习其中的优秀软件设计,这样才能以不变应万变。 单例模式 单例模式解决的对象的唯一性,一般来说就是构造方法私有化、然后提供一个静态的方法获取实例。 在netty中,select用于处理CONTINUE、SELECT、BUSY_WAIT 三种策略,通过DefaultSelectStra

Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

介绍 云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过充电桩系统的开发者尤为合适; 2、包含:启动充电、结束充电、充电中实时数据获取、报文解析、Netty通讯框架、包解析工具、调试器模拟器软件等; 源码合作 提供完整云快充协议源代码

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本,有图有真相: 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动:zram,我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑,完整梳理完这个逻辑将对Linux块设备驱动模型有深入的理解。 zram驱动加载的时候会调用zram_add函数,源码如下: 1887/*1888 * Allocate and initia

MVVM到底是什么

MVVM到底是什么 文章目录 MVVM到底是什么一、MVVM是什么二、为什么这么定义1. 分离关注点2. 提高可维护性3. 数据绑定和事件驱动4. 支持前端框架的发展 三、底层逻辑1. ViewModel层2. 数据绑定3. 事件驱动4. 响应式系统 四、扩展与高级技巧1. 组件化开发2. 双向数据绑定3. 计算属性和侦听器4. 插槽

Netty源码解析9-ChannelHandler实例之MessageToByteEncoder

MessageToByteEncoder框架可见用户使用POJO对象编码为字节数据存储到ByteBuf。用户只需定义自己的编码方法encode()即可。 首先看类签名: public abstract class MessageToByteEncoder<I> extends ChannelOutboundHandlerAdapter 可知该类只处理出站事件,切确的说是write事件

Netty源码解析8-ChannelHandler实例之CodecHandler

编解码处理器作为Netty编程时必备的ChannelHandler,每个应用都必不可少。Netty作为网络应用框架,在网络上的各个应用之间不断进行数据交互。而网络数据交换的基本单位是字节,所以需要将本应用的POJO对象编码为字节数据发送到其他应用,或者将收到的其他应用的字节数据解码为本应用可使用的POJO对象。这一部分,又和JAVA中的序列化和反序列化对应。幸运的是,有很多其他的开源工具(prot

Netty源码解析7-ChannelHandler实例之TimeoutHandler

请戳GitHub原文: https://github.com/wangzhiwubigdata/God-Of-BigData TimeoutHandler 在开发TCP服务时,一个常见的需求便是使用心跳保活客户端。而Netty自带的三个超时处理器IdleStateHandler,ReadTimeoutHandler和WriteTimeoutHandler可完美满足此需求。其中IdleSt

Netty源码解析6-ChannelHandler实例之LoggingHandler

LoggingHandler 日志处理器LoggingHandler是使用Netty进行开发时的好帮手,它可以对入站\出站事件进行日志记录,从而方便我们进行问题排查。首先看类签名: @Sharablepublic class LoggingHandler extends ChannelDuplexHandler 注解Sharable说明LoggingHandler没有状态相关变量,

Netty源码解析5-ChannelHandler

ChannelHandler并不处理事件,而由其子类代为处理:ChannelInboundHandler拦截和处理入站事件,ChannelOutboundHandler拦截和处理出站事件。ChannelHandler和ChannelHandlerContext通过组合或继承的方式关联到一起成对使用。事件通过ChannelHandlerContext主动调用如fireXXX()和write(msg)