目录
ChannelPipeline和ChannelHandler
一、简介
一、概述
Netty是JBOSS提供的一个开源框架, 本质为网络应用程序框架, 提供了非阻塞的、事件驱动的网络应用程序框架和工具,便于快速开发出高性能、高可靠性的网络服务端以及客户端。
二、核心架构
上图是netty的核心架构,从官网上截取的, 有兴趣的可以去看看
核心:
- 可拓展的事件模型
- 统一的通信API,简化了通信编码
- 零拷贝和丰富的字节缓冲区
传输服务:
- 支持Socket和Datagram(数据报)
- HTTP传输
- In-VM Pipe(管道协议,JVM的一种进程)
协议支持:
- HTTP以及WebSocket
- SSL安全套接字协议支持
- Google Protobuf(序列化框架)
- 支持zlib、gzip压缩
- 支持大文件的传输
- RTSP(实时流传输协议, 是TCP/IP协议体系中的一个应用层协议)
- 支持二进制协议并且提供完整的单元测试
三、为什么使用Netty不使用Java原生NIO
Netty主要采用的也是NIO,并且是基于JDK中的NIO做了一些实现以及升级
主要有四点:
- Netty的API对开发者更友好,JDK中的API功能薄弱且复杂(如:ByteBuffer改为ByteBuf)
- Netty中采用了Reactor线程模型,能够保证自身的线程安全
- Netty能实现高可用,解决了一些传输的问题,如粘包、半包、断路重连等
- 解决了Bug,如JDK的NIO中epoll bug
四、在使用Netty的项目
- 数据库: Cassandra
- 大数据处理: Spark、Hadoop
- Message Queue:RocketMQ
- 检索: Elasticsearch
- 框架:gRPC、Apache Dubbo、Spring5(响应式编程WebFlux)
- 分布式协调器:ZooKeeper
- 工具类: async-http-client
二、Reactor模型
Reactor线程模型是一种思想,不属于Java,也不属于Netty,其定义了三种角色
- Reactor:用于监听和分配事件,将I/O事件分给对应的Handler。新的事件包括建立连接就绪、读就绪、写就绪。
- Acceptor:处理客户端连接,并分配到处理器链中(可暂时简单理解为ServerSocketChannel)
- Handler:将自身与事件绑定,执行非阻塞的读和写任务,从channel中读入,完成处理业务逻辑, 再将结果写入channel
通过这三种角色定义出三种NIO的模式
单Reactor-单线程模式