【网络】Netty

官方

【官方】Netty User Guide
【官方】Netty官网
官方Netty 4.x用户指南(译)
主流和推荐版本是4.X, 3.X已过时,5.X官方已废弃

Netty基础

HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议,如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器。

【Netty基础】慕课网《Netty入门之WebSocket初体验》学习总结
【Netty基础】彻底理解分布式 Netty,这一篇文章就够了!
【Netty基础】Netty快速入门,一看就懂
【Netty基础】随笔分类 - Netty
【Netty基础】Netty 4教程
【Netty基础】尚硅谷韩顺平Netty笔记
【Netty基础】Netty高性能架构设计
【Netty基础】Netty知识点
【Netty基础】Netty原理和基础(一)
【Netty基础】认识Netty
【Netty基础】新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析

Netty用途

【Netty用途】使用Netty,我们到底在开发些什么?

Netty线程模型

【Netty 4线程模型】【imooc作者1】netty源码分析之服务端启动全解析
【Netty 4线程模型】【imooc作者1】netty源码分析之揭开reactor线程的面纱(一)
【Netty 4线程模型】【imooc作者1】netty源码分析之揭开reactor线程的面纱(二)
【Netty 4线程模型】【imooc作者1】netty源码分析之揭开reactor线程的面纱(三)
【Netty 4线程模型】【imooc作者1】netty源码分析之新连接接入全解析
【Netty 4线程模型】【imooc作者2】【Netty in action】Netty线程模型及EventLoop详解
【Netty 4线程模型】【imooc作者2】【Netty in action】Netty源码分析之服务端Accept过程详解
【Netty 4线程模型】【imooc作者2】【Netty in action】Netty源码分析之ChannelPipeline详解

Netty内存模型

【Netty内存模型】Netty 直接内存(堆外内存)溢出分析【Q】
【Netty内存模型】支撑百万级并发,Netty如何实现高性能内存管理

内存、任务队列监控代码

【Netty内存模型】Netty堆外内存泄漏排查,这一篇全讲清楚了【重要】

为了帮助你诊断潜在的泄漏问题,netty提供了ResourceLeakDetector,该类会采样应用程序中%1的buffer分配,并进行跟踪。不用担心这个开销很小,如果泄漏发生了会有如下log打印出来。
Netty目前定义了四中检测级别:DISABLE, SIMPLE(默认),ADVANCED, PARANOID
可以通过java -Dio.netty.leakDetectionLevel=ADVANCED指定

【Netty内存模型】Netty ByteBuf 释放注意事项
【Netty内存模型】netty内存泄漏,困扰了好几天的问题找到原文了
【Netty内存模型】“堆外内存泄漏”排查及经验总结

只要调用了 writeAndFlush 或者 flush 方法,在消息发送完成之后都会由 Netty 框架进行内存释放,业务不需要主动释放内存。

【Netty内存模型】Netty防止内存泄漏措施

Netty处理IO事件的方法io.netty.channel.nio.NioEventLoop#processSelectedKey(java.nio.channels.SelectionKey, io.netty.channel.nio.AbstractNioChannel)中
调用了io.netty.channel.nio.AbstractNioByteChannel.NioByteUnsafe#read,在该方法中调用ByteBufAllocator创建ByteBuf,将TCP缓冲区的数据读取到Bytebuf中,
并调用 pipeline.fireChannelRead(byteBuf) 进入Handler处理链。

【Netty内存模型】Netty之ByteBuf的创建和释放
Netty核心概念(10)之内存管理
Java本地内存泄露 – Debugging Native Memory Leaks
Netty中的那些坑(上篇)
Netty ByteBuf 几种类型
Netty之有效规避内存泄漏
Netty 防止内存泄漏措施

Netty 3升级Netty 4

【Netty升级】Netty 4重大变动及特性(官方文档翻译)【Q】
【Netty升级】Netty 4重大变动及特性(官方文档翻译)【参考】
【Netty升级】实践总结:Netty3.x升级Netty4.x遇到的那些坑(线程篇)
【Netty升级】【netty进阶篇】序列化、编解码器、业务线程池、netty升级netty4
【Netty升级】Netty 3升级Netty4实践【Q】

Netty编解码

【Netty编解码】【Netty】(9)---Netty编解码器
【Netty编解码】netty3和netty5的编解码

Netty源码

【Netty源码】Netty理论之源码分析④ ChannelHandler
【Netty源码】Netty精髓,源码解析 135篇
【Netty源码】3.3【Netty 原理】 死磕 系列
【Netty源码】基础篇:JAVA NIO 简介
【Netty源码】基础篇:Java NIO Buffer
【Netty源码】基础篇:Java NIO Channel
【Netty源码】基础篇:Java NIO Selector
【Netty源码】基础篇:Reactor模式
【Netty源码】精进篇:netty源码 死磕4-EventLoop的鬼斧神工
【Netty源码】精进篇:netty源码死磕5 - 揭开 ChannelHandler 的神秘面纱
【Netty源码】精进篇:netty源码死磕6 Pipeline模式揭秘
【Netty源码】精进篇:netty源码死磕7 Pipeline 入站 inbound
【Netty源码】精进篇:netty源码死磕7 Pipeline 出站 outbound

【Netty源码】随笔分类 - Netty 源码分析

【Netty源码】Netty4.x 源码实战系列(一): 深入理解ServerBootstrap 与 Bootstrap (1)

【Netty】Pipeline相关(四):inbound和outbound事件的区别

【Netty】深入理解 NioEventLoopGroup初始化

Netty实战

【Netty实战】Netty如何实现自定义协议
【Netty实战】利用Netty构建自定义协议的通信
【Netty实战】使用Netty实现HTTP服务器
【Netty实战】绝对干货:基于Netty实现海量接入的推送服务技术要点(李林锋)
【Netty实战】千载难逢!华为工程师带你跟着案例学Netty,有图有真相

SimpleChannelInboundHandler

1.处于pipleline中的ChannelInboundHandler如何适配到这个自定义类型?
2.如果ChannelInboundHandler不能处理这类消息,如何传递给下一个ChannelInboundHander进行处理
3.处理完毕后,如何对消息占用的内存空间进行释放?

SimpleChannelInboundHandler解析

心跳

【心跳】Netty实现心跳机制与断线重连

性能优化

【性能优化】Netty-13-性能优化处理
【性能优化】Netty耗时的业务逻辑应该写在哪儿,有什么注意事项?

面试

【面试】netty源码面试,看看50k月薪大佬如何应答如流!

网络相关知识

【网络】不可不知的socket和TCP连接过程
【网络】tomcat处理连接的详细过程
【网络】零复制(zero copy)技术
【网络】Http、Socket、WebSocket之间联系与区别
【网络】一文读懂DNS

Netty 4 总结

1 inbound 事件指状态事件,执行顺序与addlast相同,负责写
2 outbound 事件指用户主动触发事件,执行顺序与addlast相反,负责读
3 异常处理与添加顺序相同,与inbound还是outbound无关,最佳实践是在pipeline最后添加一个异常handler处理所有异常
4 一般在某个handler需要处理传入的msg消息 不再向后传播,否则会不断通过fire...方法向后传递,最终传递到tail(inbound)或head(outbound)节点处理
5 outbound handler中调用handler上下文ctx.pipeline.write会从tail节点传播,直接调用ctx.write会从当前节点传播,前者比较常用
6 inbound handler也类似,如果调用当前handler上下文ctx.read则从当前节点开始传播,调用ctx.pipeline.read从head节点开始传播
7 提供了simple……类方便读,不用考虑资源的释放,否则自己需要处理消息释放,只需用SimpleChannelInboundHandler替代ChannelInboundHandlerAdapter,当执行完channelRead0后,msg就会被回收。

疑问

问题:io.netty.channel.ChannelHandler 和 org.jboss.netty.channel.ChannelHandler 区别?
io.netty.channel.ChannelHandler:ChannelInboundHandler->SimpleChannelInboundHandler
org.jboss.netty.channel.ChannelHandler:ChannelUpstreamHandler->SimpleChannelUpstreamHandler
ChannelDownstreamHandler->SimpleChannelDownstreamHandler
回答:版本区别io.netty.channel.ChannelHandler是netty 3.X版本
org.jboss.netty.channel.ChannelHandler是netty 4.X版本

netty3与netty4有什么区别?
New and noteworthy in 4.0

  • 一些术语的变化,如Upstream变为了Inbound,Downstream变为了Outbound
  • netty3对每个读或写的操作,还会额外创建一个新的ChannelBuffer对象,这带来了很大的GC压力,为了缓解频繁申请回收Buffer时的GC压力,引入了池化的ByteBufs,当然在使用完Buffer后要注意需使用BufUtil.release释放。
  • 线程模型的变化
  • 事件对象从ChannelHandler中消失了
  • 4.x的netty里Channel的write方法不再自动flush

3.x的netty里Channel的write方法会自动flush, 而netty4.x里不会了,这样程序员可以按照业务逻辑write响应,最后一次flush。但千万要记住最后必须flush了。当然也可以直接用writeAndFlush方法。

  • 调度任意的任务到一个I/O线程里运行

当一个Channel被注册到EventLoopGroup时,Channel实际上是注册到由EventLoopGroup管理EventLoop中的一个。在4.x里,EventLoop实现了java.utilconcurrent.ScheduledExecutorService接口。这意味着用户可以在一个用户通道归属的I/O线程里执行或调度一个任意的Runnable或Callable。随着新的娘好定义的线程模型的到来(稍后会介绍),它变得极其容易地编写一个线程安全的处理器。

  • AttributeMap

在4.x里,一个名为AttributeMap的新接口被加入了,它被Channel和ChannelHandlerContext继承。作为替代,ChannelLocal和Channel.attachment被移除。这些属性会在他们关联的Channel被垃圾回收的同时回收。这个确实比原来方便不少。

  • ChannelFuture拆分为ChannelFuture和ChannelPromise

在4.x里,ChannelFuture已经被拆分为ChannelFuture和ChannelPromise了。这不仅仅是让异步操作里的生产者和消费者间的约定更明显,同样也是得在使用从链中返回的ChannelFuture更加安全,因为ChannelFuture的状态是不能改变的。 由于这个编号,一些方法现在都采用ChannelPromise而不是ChannelFuture来改变它的状态。两者的核心区别是ChannelFuture的状态是不可改变的,而ChannelPromise可以。
不再有ExecutionHandler
在4.x里,不再有ExecutionHandler,而是提供DefaultEventExecutorGroup,可以在添加业务ChannelHandler时指定业务Handler运行所在的业务线程池

  • 灵活的I/O线程分配

在4.x里,能够从一个已存在的jdk套接字上创建一个Channel;在4.x里,能够取消注册和重新注册一个Channel从/到一个I/O线程。例如,你能够利用Netty提供的高层次无阻塞I/O的优势来解决复杂的协议,然后取消注册Channel并且切换到阻塞模式来在可能的最大吞吐量下传输一个文件。当然,它能够再次注册已经取消了注册的Channel。

  • 简化的关闭

在4.x里,releaseExternalResources()不必再用了。你可以通过调用EventLoopGroup.shutdown()直接地关闭所有打开的连接同时使所有I/O线程停止,就像你使用java.util.concurrent.ExecutorService.shutdown()关闭你的线程池一样。

posted @ 2020-10-19 17:28  风动静泉  阅读(318)  评论(0编辑  收藏  举报