文章目录
- 一、概念扫盲篇
- 1、为什么学习netty?
- 2、Netty 到底给我们解决什么问题?
- 3、Netty基本的作用和应用场景
- 4、目前流程的多路复用IO模型
- 5、Netty 采用 NIO 而非 AIO 的理由
- 6、Reactor反应堆概念
- 7、Netty高效并发编程的的主要体现如下
- 8、序列化性能的关键因素总结
- 9、Netty的功能和特性
一、概念扫盲篇
1、为什么学习netty?
Spring5 底层用Netyy
Spring Boot 内部实现了Web容器
Zookeeper 也是用的Netty
Dubbo 分布式服务框架 多协议支持(RPC) Netty
2、Netty 到底给我们解决什么问题?
3、Netty基本的作用和应用场景
网络通信、RPC、远程调用、高并发、MQ、web服务器、IM、注册中心、调度系统
SpringBoot (内置的Tomcat)
Dubbo(RPC)
Zookeepaer(分布式协调)
RocketMQ
Spark等
4、目前流程的多路复用IO模型
IO模型 | 性能对比 | 关键思路 | 操作系统 | JAVA支持 |
select | 较高 | Reactor | Windows/Linux | 支持,Reactor 模式(反应器设计模式)。 Linux操作系统的kernels 2.4 内核版本之前,默认使用select; 而目前windows下对同步IO的支持,都是select模型 |
poll | 较高 | Reactor | Linux | Linux 下的JAVA NIO 框架,Linux kernels 2.6 内核版本之前使用poll进行支持,也是使用过的Reactor模式 |
epoll | 高 | Reactor Proactor | Linux | Linux kernels 2.6 内核版本及以后使用epoll进行支持; Linux kernels 2.6 内科版本之前使用poll进行支持; 另外一定注意,由于 Linux 下没有 Windows 下的 IOCP 技术提供真正的 异步IO 支持,所以Linux使用epoll模拟异步IO |
kqueue | 高 | proactor | Linux | 目前JAVA的版本不支持 |
5、Netty 采用 NIO 而非 AIO 的理由
- 强迫症啊
- 1、Netty 不看重Windows 上的使用,在Linux 系统上,AIO 的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK 封装了一层不容易深度优化;
- 2、Netty整体架构是reactor模型, 而AIO是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看爱来是把epoll 绕个弯又绕回来;
- 3、AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多;
- 4、Linux 上 AIO 不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度 , 有瓶颈(待验证);
突然想起一个小笑话:netty本来出了5.0 里面就是有aio但是,,,觉得不太好,又取消了发布了。这不是重点,重点,,,我入门采用的5.0 alpha。。。。。
6、Reactor反应堆概念
7、Netty高效并发编程的的主要体现如下
- volatile 的大量、正确使用;
- CAS和原子类的广泛使用;
- 线程安全容器的使用;
- 通过读写锁提升并发性能。
8、序列化性能的关键因素总结
- 序列化后的码流大小(网络带宽的占用)
- 序列化&反序列化的性能(CPU资源占用)
- 是否支持跨语言(异构系统的对接和开发语言切换)
9、Netty的功能和特性
Netty 是一个异步、事件驱动的用来做高性能、高可靠性的网络应用框架。主要的优点有:
- 框架的设计优雅,底层模型随意切换使用不同的网络协议要求
- 提供更很多标准的协议、安全、编解码的支持
- 解决了很多NIO不易用的问题
- 社区活跃,很多开源框架使用(底气足啊)
官网首页图形解释
1、底层核心:零拷贝、统一api、可扩展事件模型
2、传输支持:管道通信、http隧道、TCP/UDP
3、协议支持:原始文本和二进制协议、解压缩、流媒体、protobuf编解码、安全认证、http、websocket、大文件