Netty 初识
-
本质:网络应用程序框架
-
实现:异步,事件驱动
-
异步:高性能,可维护,快速开发
-
特性:开发服务器和客户端
-
架构
- Core
- 零复制功能丰富的 Byte Buffer
- 通用的通信层API
- 可扩展的事件模型
- Transport Services (支持的传输层)
- Protocol Support (支持协议,不属于同一层协议)
- Core
-
Netty 与 Java NIO 对比
- Netty做的更多
- 支持常用应用层协议
- 解决传输问题:粘包,半包现象
- 支持流量整形
- 完善的断连,Idle等异常处理
- Netty做的更好
- 规避JDK NIO bug
- 经典epoll bug: 异常唤醒空转导致CPU 100%
- 解决办法:设置阈值,重新rebuild 多路复用器
- IP_TOS参数(IP包的优先级和QoS选项)使用时抛出异常
- java.lang.AssertionError:Option not found
- 解决办法:不支持
- API 更友好更强大
- 例如:ByteBuffer -> Netty 's ByteBuff
- Threadlocal -> Netty 's FastThreadlocal
- 隔离变化,屏蔽细节
- 隔离JDK NIO 的实现变化: nio -> nio2(aio) -> …
- 隔离JDK NIO 的实现细节
- 规避JDK NIO bug
- Netty做的更多
-
其他产品
- Apache Mina
- Sun Grizzly
- Apple SwfitNIO ACE等 其他语言不考虑
- Cindy 生命周期不长
- Tomcat , Jetty 还没有独立出来
-
Netty支持的协议
- dns
- haproxy
- http
- http2
- memcache
- matt
- redis
- smtp
- socks
- stomp
- xml
Netty 入门
经典的三种IO模式
- BIO 阻塞I/O
- NIO 非阻塞I/0
- AIO 异步I/O
概念
- 阻塞与非阻塞
- 同步与异步
Netty 对 以上模式支持
-
BIO
- Thread-Per-Connection
- Thread-Per-Connection
-
NIO
-
Reactor
-
-
AIO
- Proactor
-
为什么仅支持NIO
- BIO 连接数高的情况:阻塞 -> 耗资源,效率低
-
问什么删除已实现的AIO
- Windows下成熟,但在服务器环境下很少使用
- Linux常用来作服务器,但AIO实现不够成熟
- Linux下AIO与NIO相比性能提升差别不大
-
为什么有三种实现方式
- 实现更好
- Netty暴露了更多的可控参数,例如
- JDK的NIO默认实现是水平触发
- Netty是边缘触发(默认)和水平触发可切换
- Netty实现的垃圾回收更少,性能更好
- Netty暴露了更多的可控参数,例如
- 实现更好
-
NIO 一定由于BIO吗?
- BIO代码简单
- 特定场景:连接数少,并发度低,BIO性能不输NIO
Netty 三种模式的切换
- 所有I/O模式的类名都是统一风格的
- 开发模式
- NioEventLoopGroup
- 死循环监听处理事件
- OioEventLoopGroup
- 反射工厂
- OioServerSocketChannel
- 创建出来的是socketchannel
- NioEventLoopGroup
- 范型+反射+工厂实现I/O模式切换
- channel : I/O模式
Netty 如何支持三种Reactor
-
什么是Reactor 三种版本
- 一个人包揽所有 -> Reactor 单线程
- 多招几个伙计 -> Reactor 多线程模式
- 进一步分工 -> 主从Reactor多线程模式