业界哪些流行的开源框架用Netty作为底层通信框架
- Dubbo: 阿里开源的高性能RPC框架
- RocketMQ: 阿里出品的高性能消息队列
- Spark: 炙手可热的大数据处理引擎,底层使用Netty
- Elasticsearch: 分布式多用户的全文搜索引擎
- Apache Cassandra:开源分布式搜索数据库
- Flink:分布式高性能高可用的流处理框架
- Netty-SocketIO的java服务端实现
- Spring5:使用Netty作为http协议框架
- Play:简单易用的http服务器
- Grpc:google开源的高性能rpc通信框架
- Infinispan:针对缓存的高并发键值对数据存储
- HornetQ:支持集群和多种协议,可嵌入、高性能的异步消息系统
- Vert.x轻量级高性能能JVM应用平台
-
完整的参考列表
业界有哪些公司在使用Netty
在大型企业中有:Apple、Twitter的Finagle、Facebook的Nifty、Google、Square、Instagram
在初创企业中有:做http长连接的Firebase、支持各种各样消息推送通知的Urban Airship
当然,Netty也从这些项目中受益。通过实现 FTP、 SMTP、 HTTP 和 WebSocket 以及其他的基于二进制和基于文本的协议, Netty 扩展了它的应用范围及灵活性。
Netty是什么
- 异步和事件驱动的高性能网络通信框架。
- **特点:**它可以以任意的顺序响应在任意的时间点产生的事件,可以实现最高级别的可伸缩性。
- **目的:**用于快速开发高性能服务端和客户端
- **封装:**JDK底层BIO和NIO模型,提供高度可用的API,满足各类业务场景,其中ChannelHandler的热插拔机制解放了业务逻辑之外的细节问题,让业务逻辑的添加和删除非常容易
- 自带编解码器解决拆包粘包问题,用户只关心业务逻辑
- 精心设计的reactor线程模型支持高并发海量连接
- 自带各种协议栈如http、websocket,处理任何一种通信协议都几乎不用亲自动手
- **架构方法和设计原则:**每个小点都和它的技术性内容一样重要,穷其精妙。如关注点分离–业务和网络逻辑解耦,模块化和可复用性,可测试性。
Netty的特性总结
## Socket & Netty 
##Netty基本组件
- NioEventLoop ->Thread
- Channel ->Socket
NioSocketChannel implements Channel
Chennel is a nexus to a network socket or a component which is capable operations such as read,write,connect,and bind - ByteBuf ->IO Bytes
readBytes()、writeBytes() and so on - Pipline ->Logic Chain 逻辑链
- ChannelHandler ->Logic处理块
##Netty核心组件
###1. Channel-Socket
Channel是通讯的载体,其基本构造是Socket
是对网络底层读写和连接原语言的抽象
###2. EventLoop-控制流、多线程处理、并发
定义了 Netty 的核心抽象, 用于处理连接的生命周期中所发生的事件
###注: Channel、 EventLoop、 Thread 以及EventLoopGroup 之间的关系
#####A. 一个 EventLoopGroup 包含一个或者多个 EventLoop;
#####B. 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定
#####C. 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
#####D. 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
#####E. 一个 EventLoop 可能会被分配给一个或多个 Channel
#####F. 一个给定 Channel 的 I/O 操作都是由相同的 Thread 执行的, 实际上消除了对于同步的需要。
###3. ChannelFuture-异步通知
Netty 中所有的 I/O 操作都是异步的,用于在之后的某个时间点确定其结果的方法
###4. ChannelHandler和ChannelPipeline
ChannelHandler负责Channel中的逻辑处理
其旨在简化应用程序处理逻辑的开发过程
充当了所有处理入站和出站数据的应用程序逻辑的容器
ChannelHandler子接口:
ChannelInboundHandler——处理入站数据以及各种状态变化
ChannelOutboundHandler——处理出站数据并且允许拦截所有的操作
ChannelInboundHandler的方法:
ChannelOutboundHandler的方法:
ChannelPipeline 提供了 ChannelHandler链的容器
定义了用于在该链上传播入站和出站事件流的API
###5. ByteBuf-Netty的数据容器
Java NIO提供了ByteBuffer作为它的字节容器
Netty的ByteBuffer替代品是ByteBuf
A. 它可以被用户自定义的缓冲区类型扩展,通过内置的复合缓冲区类型实现了透明的零拷贝;
B.容量可以按需增长(类似于 JDK 的 StringBuilder)
C.读和写使用了不同的索引
D.支持方法的链式调用
E.支持引用计数
F.支持池化
###6. Bootstap-引导客户端和无连接协议
Bootstrap类负责为客户端和使用无连接协议的应用程序创建 Channel
单元测试
使用EmbeddedChannel 测试 ChannelHandler
- 测试入站消息
- 测试出站消息
- 测试异常处理
##编解码器
-
解码器
将字节解码为消息
将一种消息类型解码为另一种 -
编码器
将消息编码为字节
将消息编码为消息
##Netty服务端启动
- 创建服务端Channel
- 初始化服务端Channel
- 注册Selector
- 端口绑定,实现对本地端口的接听
##预置的ChannelHandler和编解码器
- 通过 SSL/TLS 保护 Netty 应用程序
- ChannelHandler处理 HTTP 和 HTTPS协议
- 支持WebSocket
- ChannelHandler检测空闲连接以及超时
- FileRegion,通过支持零拷贝的文件传输的Channel来发送的文件区域
- 使用JDK、JBOSS Marshalling、Protocol Buffers序列化数据
- 使用UDP广播事件
###创建服务端Channel
bind()[用户代码入口] ->initAndRegister()[初始化并注册] ->newChannel()[创建服务端channel]
##如何使用Netty进行RPC服务器的开发?
- 定义RPC请求消息、应答消息结构,里面要包括RPC的接口定义模块、包括远程调用的类名、方法名称、参数结构、参数值等信息。
- 服务端初始化的时候通过容器加载RPC接口定义和RPC接口实现类对象的映射关系,然后等待客户端发起调用请求。
- 客户端发起的RPC消息里面包含,远程调用的类名、方法名称、参数结构、参数值等信息,通过网络,以字节流的方式送给RPC服务端,RPC服务端接收到字节流的请求之后,去对应的容器里面,查找客户端接口映射的具体实现对象。
- RPC服务端找到实现对象的参数信息,通过反射机制创建该对象的实例,并返回调用处理结果,最后封装成RPC应答消息通知到客户端。
- 客户端通过网络,收到字节流形式的RPC应答消息,进行拆包、解析之后,显示远程调用结果。
客户端并发发起RPC调用请求,然后RPC服务端使用Netty连接器,分派出N个NIO连接线程,这个时候Netty连接器的任务结束。然后NIO连接线程是统一放到Netty NIO处理线程池进行管理,这个线程池里面会对具体的RPC请求连接进行消息编码、消息解码、消息处理等等一系列操作。最后进行消息处理(Handler)的时候,处于性能考虑,这里的设计是,直接把复杂的消息处理过程,丢给专门的RPC业务处理线程池集中处理,然后Handler对应的NIO线程就立即返回、不会阻塞。这个时候RPC调用结束,客户端会异步等待服务端消息的处理结果,通过消息回调机制实现。
Netty对于RPC消息的解码、编码、处理对应的模块和流程,具体如下图所示: