千载难逢!华为工程师带你跟着案例学Netty,有图有真相

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

然而,想要把Netty真正学明白其实并不是件简单的事。如果没有一个好的学习方法,只是一味的依靠阅读源码,这样既浪费时间又很难学明白,最后还很容易半途而废。

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

  • 涉及的知识面比较广。Netty作为一个高性能的NIO通信框架,涉及的知识点包括网络通信、多线程编程、序列化和反序列化、异步和同步、SSL/TLS安全、内存池、HTTP等各种协议栈,这些知识点在Java 语言中本身就是难点和重点,如果对这些基础知识掌握不扎实,是很难真正掌握好Netty的。

  • 调试比较困难。因为大量使用异步编程接口,以及消息处理过程中的各种线程切换,相比传统同步代码,Netty代码调试难度比较大。

  • 类继承层次比较深,有些代码很晦涩(例如内存池)。对于初学者而言,通过阅读代码来掌握Netty的难度还是很大的。

  • 代码规模庞大。目前,Netty 的代码规模已经非常庞大,特别是协议栈部分,提供了对HTTP/2、MQTT、WebSocket 等各种协议的支持,相关代码非常多。如果学习方式不当,抓不住重点,则全量阅读Netty源码,既耗时又很难吃透,很容易半途而废。

  • 资料零散,缺乏与实践相关的案例。网上Netty的各种资料非常多,但是都以理论讲解为主,Netty 在各行业中的应用、问题定位技巧及案例实践方面的资料很少,缺乏系统性的实践总结,是Netty学习的一大痛点。

netty笔记目录

=========

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

第一章.Netty服务端意外退出案例

  • Netty服务端意外退出问题

  • Netty优雅退出机制

内存溢出和线程膨胀

将连接池的连接数上限配置为100, 业务高峰期发生了OOM异常,业务需要重启才能恢复,相关异常日志如图所示。

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

本章通过两个简单的案例分析,引出了信号量、Java Daemon 线程及Netty优雅退出相关知识。在实际项目中,知识往往是交叉在一起的,要想熟练掌握Netty服务端的启动和退出,编写更优雅和健壮的代码,需要重点掌握如下几个知识点:

  • 操作系统的信号量和JavaDeamon线程工作机制。

  • Netty 的NioEventLoop线程工作原理。

  • Netty优雅退出相关的几个核心类库。

第2章Net青户满连接池资源世局实例

  • Netty连接池资源泄漏问题

  • Netty客户端创建机制

错用NIO编程模式

前面连接池泄漏的原因是采用BIO模式来调用NIO通信框架,不仅没达到优化的效果,而且还发生了OOM异常。

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

JavaNIO客户端创建原理分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

Netty客户端创建原理分析

Bootstrap是Socket客户端创建工具类,用户通过Bootstrap 可以方便地创建Netty的客户端并发起异步TCP连接操作,Netty 客户端创建流程如图2-10所示。

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

小结

本章分析了一个生产环境Netty客户端连接池资源泄漏案例,详细讲解了Netty 客户端创建的流程和工作原理,以及在实际项目中如何正确地实现连接池,避免发生并发安全和资源不当释放等问题。

第3章Netty内存池泄漏疑云案例

  • Netty内存池泄漏问题

  • Netty内存池工作机制

响应消息内存释放玄机

对业务ByteBuf申请相关代码进行排查,发现响应消息由业务线程创建,但是却没有主动释放,因此怀疑是响应消息没有释放导致的内存泄漏。因为响应消息使用的是PooledHeapByteBuf,如果发生内存泄漏,利用堆内存监控就可以找到泄漏点,通过JavaVisualVM工具观察堆内存占用趋势,并没有发现堆内存发生泄漏,如图3-2所示。

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

内存池工作原理分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

Netty内存池是一把双刃剑,使用得当会在很大程度上提升系统的性能,但是误用则会带来内存泄漏问题。从表面上看,只要遵循主动申请和释放原则即可,但是由于内存的申请和释放可能由Netty框架隐性完成,增加了内存管理的复杂性。

通过学习Netty 收发消息的ByteBuf 申请和释放机制,可以避免在项目中因误用ByteBuf而发生内存泄漏。在熟悉了ByteBuf 的申请和释放机制后,通过对Netty内存池工作原理和关键源码的分析,读者可以更好地掌握Netty内存池的使用方法。

第4章ByteBuf故障排查案例

  • HTTP协议栈ByteBuf使用问题

  • Netty ByteBuf实现机制

ByteBuf引用计数器工作原理和源码分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

ByteBuf的申请和释放可能会跨Netty 的NioEventLoop 和业务线程,跨线程操作ByteBuf时一定要谨慎,防止发生并发安全和非法引用问题。另外,由于ByteBuf的实现类非常多,不同的实现功能特性存在差异,用户在使用时一定要认真阅读API Doc说明,必要时要看源码,防止误用导致出现功能和性能问题。

第5章Netty发送队列积压导致内存泄漏案例

  • Netty发送队列积压案例

  • Netty消息发送工作机制

高井发故障场景

为了便于分析,对真实的业务代码做简化处理,在一个客户端内部创建一个线程,向服务端循环发送请求消息,模拟客户端高并发场景,示例代码如下:

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

消息发送源码分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

本章通过发送队列积压案例,对Netty 的消息发送原理和源码进行了深入讲解,熟悉了Netty的发送队列工作机制、高低水位机制等,就可以在实际项目中更好地利用这些功能,提升基于Netty构建的通信框架的可靠性。

第6章API网关高并发压测性能波动案例

  • 高并发压测性能波动问题

  • Netty消息接入内存申请机制

主动内存泄漏定位法

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

对于高并发接入的API网关类产品,需要谨慎处理消息的内存申请和释放,减少不必要的申请(例如透传类场景),同时要防止内存空间的浪费。借鉴Netty请求消息读取的内存申请策略和动态扩容机制,并用在实际项目中,可以得到较大的性能提升。

第7章Netty ChannelHandler并发安全案例

  • Netty ChannelHandler并发安全问题

  • Netty ChannelHandler工作机制

ChannelHandler的并发陷阱

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

ChannelHandler是用户最常用的接口,掌握了ChannelHandler 及ChannelPipeline工作原理,就清楚了什么时候该使用共享的ChannelHandler,什么时候该对ChannelHandler做并发保护。无论缺少保护还是过度保护,都会给业务带来副作用,甚至严重的功能或性能问题,因此ChannelHandler的并发安全性是非常重要的。

第8章车联网服务端接收不到车载终端消息案例

  • 车联网服务端接收不到车载终端消息问题

  • NioEventL oop线程工作机制

NioEventLoop线程防挂死策略

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

I/O读写操作原理和源码分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

Netty多线程最佳实践

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

当Netty服务端接收不到消息时,首先需要检查是客户端没有发送到服务端,还是服务端没有读取消息。导致服务端无法读取消息的原因有很多,常见的包括GC导致的应用线程暂停、服务端的NioEventLoop线程被意外阻塞等。通过网络I/O线程和业务逻辑线程分离,可以实现双方的并行处理,提升系统的可靠性。对于用户而言,在编写代码时,始终需要考虑NioEventLoop 线程是否会被业务代码阻塞,只有消除所有可能导致的阻塞点,才能保证程序稳定运行。

第9章Netty 3.X版本升级案例

  • Netty 3.X的版本升级背景

  • 版本升级后数据被篡改问题

  • 升级后上下文丢失问题

  • 升级后应用遭遇性能下降问题

  • Netty线程模型变更分析

性能下降原因分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

就Netty而言,掌握线程模型的重要性不亚于熟练使用它的API和功能。很多时候业务遇到的功能、性能等问题,都是由于缺乏对Netty线程模型和原理的理解导致的。对Netty的版本升级需要从功能、兼容性和性能等多个角度进行综合考虑,切不可只盯着API和功能变更这个“芝麻”,而丢掉了线程模型和性能这个“西瓜”。API的变更会导致编译错误,但是性能下降却隐藏于无形之中,稍不留意就会中招。对于强调快速交付和敏捷开发的互联网类应用,升级的时候尤其要小心,不能功能调通后简单验证就匆忙上线。

第10章Netty并发失效导致性能下降案例

  • 业务ChannelHandler无法并发执行问题

  • Netty DefaultEventExecutor工作机制

DefaultEventExecutor原理和源码分析

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

业务线程池优化策略

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

Netty框架本身实现了高性能的网络读写操作,但是后端业务逻辑执行却是影响性能的关键要素,如果直接将复杂的业务逻辑操作放在I/O线程中完成,一些同步阻塞操作可能会导致I/O线程被阻塞。当把业务逻辑单独拆分到业务线程池中进行处理,与I/O线程隔离时,不同的业务线程模型对性能的影响也非常大。Netty 提供了默认的并行调度ChannelHandler的能力,但是如果使用不当,也会带来性能问题。对于业务自定义实现的线程池,如果追求更高的性能,就需要在消除或者减轻锁竞争上下工夫,线程绑定技术是一个不错的选择,但是也需要根据业务实际场景来实现,例如TCP长连接就可以使用Channelld做Key,如果是短连接,客户端的端口是随机变化的,则不适合使用Channelld.

第11章loT百万长连接性能调优案例

  • 海量长连接接入面临的挑战

  • 智能家居内存泄漏问题

  • 操作系统参数调优

  • Netty性能调优

  • JVM相关性能优化

设置合理的线程数

对于线程池的调优,主要集中在用于接收海量设备TCP连接、TLS握手的Acceptor线程池(Netty 通常叫boss NioEventLoopGroup) 上,以及用于处理网络数据读写、心跳发送的I/O工作线程池(Netty 通常叫work NioEventLoopGroup)上。

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

I/O线程和业务线程分离

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

第12章静态检查修改不当引起性能下降案例

  • Edgeo Secie性能严重下降问题

  • 克隆和浅拷贝

Netty的对象拷贝实现策略

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

第13章Netty性能统计误区案例

  • 时延毛刺排查相关问题

  • Netty关键性能指标采集策略

都是同步思维惹的祸

千载难逢!华为工程师带你跟着案例学Netty,有图有真相

第14章gRPC的Netty HTTP/2实践案例

  • gRPC基础入门

  • gRPC Netty HTTP/2服务端工作机制

  • gRPC Netty HTTP/2客户端工作机制

  • gRPC消息序列化机制

  • gRPC线程模型

RPC框架简介

RPC框架的目标就是让远程服务调用更加简单、透明,RPC框架负责屏蔽底层的传输方式(TCP 或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

总结

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。

很多人担心学了容易忘,这里教你一个方法,那就是重复学习。

打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。

从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。

从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

[外链图片转存中…(img-qiPXdaHY-1713455813694)]

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-TjfoV6j1-1713455813695)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值