编程语言应用

首页 » 常识 » 预防 » 千载难逢华为工程师手把手带你跟着案例学
TUhjnbcbe - 2023/5/5 21:22:00
治白癜风广州哪家医院好 http://baidianfeng.39.net/a_yufang/131231/4320043.html

写在前面

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优雅退出机制内存溢出和线程膨胀

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

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

操作系统的信号量和JavaDeamon线程工作机制。Netty的NioEventLoop线程工作原理。Netty优雅退出相关的几个核心类库。第2章Net青户满连接池资源世局实例

Netty连接池资源泄漏问题Netty客户端创建机制错用NIO编程模式

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

JavaNIO客户端创建原理分析

Netty客户端创建原理分析

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

小结

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

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

Netty内存池泄漏问题Netty内存池工作机制响应消息内存释放玄机

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

内存池工作原理分析

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

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

第4章ByteBuf故障排查案例

HTTP协议栈ByteBuf使用问题NettyByteBuf实现机制ByteBuf引用计数器工作原理和源码分析

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

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

Netty发送队列积压案例Netty消息发送工作机制高井发故障场景

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

消息发送源码分析

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

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

高并发压测性能波动问题Netty消息接入内存申请机制主动内存泄漏定位法

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

第7章NettyChannelHandler并发安全案例

NettyChannelHandler并发安全问题NettyChannelHandler工作机制ChannelHandler的并发陷阱

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

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

车联网服务端接收不到车载终端消息问题NioEventLoop线程工作机制NioEventLoop线程防挂死策略

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

Netty多线程最佳实践

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

第9章Netty3.X版本升级案例

Netty3.X的版本升级背景版本升级后数据被篡改问题升级后上下文丢失问题升级后应用遭遇性能下降问题Netty线程模型变更分析性能下降原因分析

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

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

业务ChannelHandler无法并发执行问题NettyDefaultEventExecutor工作机制DefaultEventExecutor原理和源码分析

业务线程池优化策略

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

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

海量长连接接入面临的挑战智能家居内存泄漏问题操作系统参数调优Netty性能调优JVM相关性能优化设置合理的线程数

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

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

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

EdgeoSecie性能严重下降问题克隆和浅拷贝Netty的对象拷贝实现策略

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

时延毛刺排查相关问题Netty关键性能指标采集策略都是同步思维惹的祸

第14章gRPC的NettyHTTP/2实践案例

gRPC基础入门gRPCNettyHTTP/2服务端工作机制gRPCNettyHTTP/2客户端工作机制gRPC消息序列化机制gRPC线程模型RPC框架简介

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

为什么选择HTTP/2

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

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

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

GoogleProtobuf简介

服务端线程模型

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

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

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

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

Netty流量整形功能Netty流量整形应用Netty流量整形工作机制通用的流量整形功能简介

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

第17章NettySSL应用案例

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

单向认证

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

双向认证

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

CA认证

NettySSL实现机制

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

NettyHTTPS服务端宕机问题功能层面的可靠性优化架构层面的可靠性优化服务端内存泄漏原因分析

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

NettyHTTPS服务端可靠性优化

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

MQTT服务接入超时问题基于Netty的可靠性设计连接数膨胀原因分析

业务定制I/O异常

第20章Netty实践总结

Netty学习策略Netty故障定位技巧入门知识准备1.JavaNIO类库需要熟悉和掌握的类库主要包括:(1)缓冲区Buffer(2)通道Channel

项目实战落地白皮书

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

项目概述

这份以及文档共有页,需要完整版的朋友,可以转发此文

1
查看完整版本: 千载难逢华为工程师手把手带你跟着案例学