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

201 篇文章 0 订阅
42 篇文章 0 订阅

写在前面

Netty是由JBOSS提供的一个java开源框架。

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。

作为最有影响力的NIO框架,Netty得到了众多架构师和程序员的喜爱,并且在大数据通讯,游戏,人工智能,物联网等领域都有广泛的应用,尤其在高并发、高性能 RPC 方面,Netty的地位更是不容小觑的。

然而,想要把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/二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

 

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

为什么选择HTTP/2

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

 

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

服务端接收HTTP/2请求消息原理和源码分析

gRPC服务端的请求消息由Netty HTTP/2协议栈负责接入,gRPC通过继承Http2FrameAdapter,将自定义的FrameListener添加到Netty的Http2ConnectionDecoder中,在HTTP/2请求消息头和消息体被解析成功之后,回调gRPC的FrameListener,接收并处理HTTP/2请求消息,如图14-8所示。

 

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

NettyHTTP/2客户端创建原理和源码分析

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

Google Protobuf简介

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

服务端线程模型

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

 

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

第15章Netty事件触发策略使用不当案例

  • channelReadComplete方法被调用多次问题
  • ChannelHandler使用的一些误区总结

ChannelHandler调用问题

在生产环境中将某一个服务实例的调测日志打开一段时间,以便定位问题。通过接口日志分析发现,对于同一个HTTP请求消息,当发生问题时,业务ChannelHandler 的channelReadComplete方法会被调用多次,但是大部分消息都调用一次,按照业务的设计初衷,当服务端读到一个完整的HTTP请求消息时,在channelReadComplete方法中进行业务逻辑处理。如果一个请求消息的channelReadComplete方法被调用多次,则业务逻辑会出现异常。

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

 

第16章Netty流量整形应用案例

  • Netty流量整形功能
  • Netty流量整形应用
  • Netty流量整形工作机制

通用的流量整形功能简介

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

流量整形工作原理和源码分析

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

 

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

第17章Netty SSL应用案例

  • Netty SSL功能简介
  • Netty客户端SSL握手超时问题
  • SSL握手性能问题
  • SSL事件监听机制

SSL安全特性

单向认证

单向认证即客户端验证服务端的合法性,服务端不验证客户端,它的工作原理如下。

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

 

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

双向认证

SSL双向认证相比单向认证多了一步,即服务端发送认证请求消息给客户端,客户端发送自签名证书给服务端进行安全认证。

CA认证

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

Netty SSL实现机制

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

第18章Nety HTPS服务满高并发宕机案例

  • Netty HTTPS服务端宕机问题
  • 功能层面的可靠性优化
  • 架构层面的可靠性优化

服务端内存泄漏原因分析

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

高并发场景下缺失的可靠性保护

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

NettyHTTPS服务端可靠性优化

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

第19章MQTT服务接入超时案例

  • MQTT服务接入超时问题
  • 基于Netty的可靠性设计

连接数膨胀原因分析

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

业务定制I/O异常

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

 

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

第20章Netty实践总结

  • Netty学习策略
  • Netty故障定位技巧

入门知识准备

1. Java NIO类库

需要熟悉和掌握的类库主要包括:

(1)缓冲区Buffer

(2)通道Channel

 

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

 

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

项目实战落地白皮书

该游戏是一款欧美卡通风格的MMORPG 游戏,目前正在研发中,2020年准备发布在Google Play 上,进军欧美市场。同时,游戏技术框架基于国内知名网页游戏《回到三国志》

项目概述

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

 

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

这份【Netty进阶之路】以及【游戏项目白皮书】文档共有364页,需要完整版的朋友,可以转发此文关注小编,文末扫码~

当然,单单有文档看是远远不够的,还有视频和相匹配的课件进行学习提升,努力把neyyt这一块儿给搞明白,相信一定会有不凡的人生! !

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

视频课件

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

 

视频和课件获取,扫码即可~

好了,今天就分享到这里了,希望大家能够好好学习,把neyyt这一块儿给提升上来,也希望本文能够得到大家的喜欢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值