文章目录

  • 一、概念扫盲篇
  • 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反应堆概念

netty跟spring区别 netty框架与spring区别_nio

7、Netty高效并发编程的的主要体现如下
  • volatile 的大量、正确使用;
  • CAS和原子类的广泛使用;
  • 线程安全容器的使用;
  • 通过读写锁提升并发性能。
8、序列化性能的关键因素总结
  • 序列化后的码流大小(网络带宽的占用)
  • 序列化&反序列化的性能(CPU资源占用)
  • 是否支持跨语言(异构系统的对接和开发语言切换)
9、Netty的功能和特性

Netty 是一个异步、事件驱动的用来做高性能、高可靠性的网络应用框架。主要的优点有:

  • 框架的设计优雅,底层模型随意切换使用不同的网络协议要求
  • 提供更很多标准的协议、安全、编解码的支持
  • 解决了很多NIO不易用的问题
  • 社区活跃,很多开源框架使用(底气足啊)

netty跟spring区别 netty框架与spring区别_nio_02

官网首页图形解释

1、底层核心:零拷贝、统一api、可扩展事件模型

2、传输支持:管道通信、http隧道、TCP/UDP

3、协议支持:原始文本和二进制协议、解压缩、流媒体、protobuf编解码、安全认证、http、websocket、大文件