问题
- 什么是netty
- netty开发步骤
- netty性能之道
什么是netty
-
Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架
-
为什么要用netty?
- 原生 NIO 存在问题: 不好用,太简单,有bug。
- NIO 的类库和 API 繁杂
- 需要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,必须对多线程和网络编程非常熟悉, 才能编写出高质量的 NIO 程序
- 开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常 流的处理等等处理起来难度会比较大。
- JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
- 代码示例
nio:www.cnblogs.com/jing99/p/12…
netty:没有代码!
- 原生 NIO 存在问题: 不好用,太简单,有bug。
-
netty的结构
- 组件图
- 分层架构图
- bootstrap, eventLoop, channel, channelHandler,channelPipeline, bytebuf
netty开发的步骤
- 创建服务器
- 编解码及对应编解码器
- 具体的协议解析与开发
netty高性能之道
reactor线程模型
-
什么是reactor线程模型 Reactor模式是一种典型的事件驱动的编程模型,Reactor逆置了程序处理的流程,其基本的思想即为
Hollywood Principle— 'Don't call us, we'll call you'.
Reactor事件处理机制为:主程序将事件以及对应事件处理的方法在Reactor上进行注册, 如果相应的事件发生,Reactor将会主动调用事件注册的接口,即 回调函数. -
netty线程模型介绍
- 单线程reactor
- 多线程reactor
- 主从reactor(netty使用的线程模型)
- 单线程reactor
同步非阻塞io(io多路复用io)
- io多路服用主要依赖于操作系统内核提供的poll/epoll函数、以下为两者的主要流程:
- 需要认知一个硬件:DMA(用于将输入设备缓冲区中数据拷贝到系统内存(pagecache)中) -- 释放了宝贵的cpu资源
- poll/epoll整体流程:网卡收到数据后,由DMA将数据搬运到系统内存中,将对应tcp通道加入就绪列表。应用线程遍历列表获取到对应的可读数据,将系统内存数据读取到应用内存中。因此一次遍历即可将多tcp通道数据加载进应用内存中。
无锁化串行设计
- channelPipeline设计
- 使用了责任链模式
- 在当前节点操作完后,通过执行fireXXX(具体的方法)调用下一个节点的动作
- 除非用户主动切换,全程为单线程完成
- 为什么延时高会打炸dubbo?打炸哪里?
- 为什么延时高会打炸dubbo?打炸哪里?
耗时操作的处理
- 需要获取操作结果 -- 使用function及对应的listener。
- 耗时操作 -- 另外的业务线程池
ByteBuf 与 内存池 与 零拷贝
/
高效的并发编程
高性能的序列化框架
后续计划
- netty-io: 关于底层的io相关的内容,netty-io层到底帮你做了啥? Epoll Bug 是啥,怎么解决的?从底层出发解析一个请求如何被服务器识别且进行响应?
- netty内存管理: ByteBuf设计 与 内存池的应用 与 零拷贝相关问题