1. Netty 原理
Netty 是一个 高性能,异步的 NIO框架,支持 TCP,UDP,文件传输;所有IO操作都是异步非阻塞的
通过 Future-Listener 获取 IO结果
2. Netty 高性能
2.1 多路复用
将多个IO阻塞复用在用一个 Selector 阻塞上,支持单线程下同时处理多个requests
BIO 提供 Socket 和 ServerSocket,NIO提供 SocketChannel 和 ServerSocketChannel
其中 NioEventLoop 集成了 Selector 可以并发处理几千个Channel,由于读写非阻塞,充分提升 IO线程效率
2.2 NIO 异步
非阻塞IO 支持并发处理N个Client连接和读写,支持弹性伸缩,可用,优于BIO
2.3 零拷贝 (Direct Buffers 使用堆外直接内存)
- 使用 Direct Buffers,使用堆外内存socket读写,不需要进行byte buffer 的 二次拷贝
- 支持对组合buffer进行直接操作,不需要通过内存拷贝合并buffer
- Netty 使用 transferTo 进行文件传输,支持文件直接发送避免通过内存拷贝读写
2.4 内存池
Netty 支持内存池缓冲区重用机制,避免较多的Heap对象的分配和回收
2.5 高效 Reactor 线程
2.6 无锁设计,线程绑定
Netty 使用串行无锁,支持修改NIO线程参数,支持多个串行化线程并行
2.7 高性能的序列化框架
- 通过 NAGLE 算法将缓冲区小封包做成大封包,防止网络阻塞
- 通过IP+Port 计算 hash值,然后进行cpu绑定,均衡软中断在多个CPU上
3. Netty RPC 实现
RPC: Remote Procedure Call (远程过程调用)
在Java中 动态代理就是一种 RPC方式
使用 Protobuf,Thrift,Avro等序列化解决方案搭建RPC框架
4. Netty 通讯过程
netty通讯过程需要解决线程暂停和消息乱序的问题
- 使用 AtmoicLong 生成唯一的requestID
- 存放回调对象到 ConcurrentHashMap
- Synchronized 获取回调对象callback的锁并自旋wait
- 监听消息的thread获得消息,找到callback上的lock并且notify
5. RMI (Remote Method Invocation) 实现方式
- 写一个 RMI接口,继承 java.rmi.Remote 接口
- 写RMI实现类,继承 java.rmi.server.UnicastRemoteObject
- 运行 RMI编译器,创建客户端stub类和服务端skeleton类
- 启动一个RMI注册表
- 在 RMI注册表注册服务
- Client查找远程对象,调用远程方法
6. Protocol Buffer
结构化数据串行的工具
- 序列化/反序列化/速度快 (编码,解码简单)
- 数据压缩效果好 (采用 Varint, Zigzag 编码方式; 采用 T-L-V 数据结构)
7. Thrift (Apache Thrift)