Netty与RPC知识点总结

Netty原理

Netty是一个高性能的,异步事件驱动的NIO框架,基于JAVA NIO提供的API实现。它提供了堆TCP,UDP和文件传输的支持,作为一个异步NIO的框架,Netty的所有IO操作都是异步非阻塞的,通过Future-listener机制,用户可以方便的主动获取或者通过通知机制或得IO操作的结果。

Netty高性能

在IO编程过程中,当需要同时处理多个客户端接入请求的时候,可以利用多线程或者IO多路复用技术进行处理,IO多路复用技术通过吧多个IO阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求,与传统的多线程/多进程模型相比,I/O多路复用的最大优势就是系统开销较小,系统不需要创建新的额外的进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护代码量,节省了系统的资源。
与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。

NIO服务端通信序列图

在这里插入图片描述

  • 打开ServerSocketChannel
  • 绑定鉴定地址InetSocketAddress
  • 创建Selector,启动线程
  • 将ServerSocketChannel注册到Selector,监听SelectionKey.OP_ACCEPT
  • Selector轮询就绪的key
  • accpet新连接,HandleAccept()处理新的客户端接入
  • 设置新建客户端连接的Socket
  • 向Selector注册监听读操作,SelectionKey.OP_READ
  • handlerRead()异步读请求到ByteBuffer
  • decode请求
  • 异步写byteBuffer到SocketChannel

NIO客户端通信序列图

在这里插入图片描述

  1. 打开socketChannel
  2. 设置Socketchannel为非阻塞模式,同时设置TCP参数
  3. 异步连接服务器
  4. 判断连接结果,如果连接成功则调到步骤10
  5. 向Reactor线程的多路复用器注册OP_CONNECT事件
  6. 创建Selector启动线程
  7. Selector轮询就绪的Key
  8. handleConnect
  9. 判断连接完成,完成执行步骤10
  10. 向Selector注册OP_READ
  11. handleRead异步请求读取消息到ByteBuffer
  12. decode请求
  13. 异步写ByteBuffer到SocketChannel

Netty的IO线程是NIOEventLoop由于聚合了多路复用器Selector,可以同时并发的处理成百上千客户端channel,由于读写操作都是非阻塞的,这就重复提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起

零拷贝

  • Netty的接受和发送ByteBuffer采用DIRECT BUFFER,使用堆外的内存进行Socket读写,不需要进行字节缓冲区的二次拷贝,如果使用传统的堆内存HEAP BUFFERS进行读写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值