Netty知识结构分析

Netty知识结构

  • Netty介绍
  • Netty架构实现
  • Netty模块分析
  • Netty HTTP tunnel
  • Netty对socket的实现
  • Netty压缩与解压缩
  • Netty对于RPC的支持
  • Websocket的实现与原理分析
  • Websocket连接建立方式与生命周期分解
  • Websocket服务端与客户端开发
  • RPC框架分析
  • Google protobuf使用方式分析
  • Apache Thrift的使用方式与文件编写方式分析
  • Netty大文件传输支持
  • 可扩展的 事件模型
  • Netty统一通信API
  • 零拷贝在Netty中的实现与支持
  • TCP粘包与拆包分析
  • NIO模型在Netty中的实现
  • NIO编解码技术
  • Netty重要的类与接口源码剖析
  • Channel分析
  • 序列化讲解

Terwer...小于 1 分钟Netty新思路新笔记newnotenetty
利用Nginx的stream实现Netty的TCP负载均衡

随着设备连接数增多,单台服务器支撑的TCP长连接数有限,这个时候程序架构就需要改变,一般都会采取横向扩展,增加多台服务器程序。怎么将TCP长连接均衡的路由到不同的服务器,这个时候就需要实现负载均衡了。


Terwer...大约 2 分钟实用技巧经验分享nettynginxloadbanancetcp
自定义RPC框架之基于Netty实现RPC框架

基于Netty实现RPC框架

Dubbo 底层使用 Netty 作为网络通讯框架,要求使用 Netty 实现一个简单的 RPC 框架,消费者和提供者约定协议和接口,消费者远程调用提供者的服务。

1、创建一个接口,定义抽象方法,用于消费者和提供者之间的约定。

2、创建一个提供者,该类需要监听消费者的请求,并按照约定返回数据。

3、创建一个消费者,该类需要透明的调用自己不存在的方法,内部需要使用 Netty 进行数据通信。


Terwer...大约 7 分钟后端开发分布式rpcnetty
Netty线程模型

Netty线程模型

Netty的设计主要基于主从Reactor的多线程模式,并做了一定的改进。

  1. 简单版Netty模型

    image-20220419225802316
    image-20220419225802316
    • BossGroup线程维护Selector,ServerSocketChannel注册到Selector上,只关注连接请求处理事件(主Reactor)
    • 当接收到来自客户端的连接请求事件时,通过ServerSocketChannel的accept方法获得对应的SocketChannel,并封装成NIOSocketChannel注册到WorkerGroup中的Selector,每个Selector运行在一个线程中(从Selector)
    • 当WorkerGroup中的Selector监听到对应的IO事件后,就调用对应的handler进行处理
  2. 进阶版Netty模型

    image-20220419231353965
    image-20220419231353965
    • 有两组线程池:BossGroup和WorkerGroup,BossGroup中的线程专门负责和客户端建立连接,WorkerGroup中的线程专门负责连接上的读写
    • BossGroup和WorkerGroup含有多个不断循环的执行事件处理的线程,每个线程包含一个Selector,用于监听注册在它上面的Channel
    • 每个BossGroup中的线程循环执行以下三个步骤
      • 轮询注册在其上的ServerSocketChannel的accept事件,OP_ACCEPT事件
      • 处理accept事件,与客户端建立连接,生成一个NIOSocketChannel,并将其注册到WorkerGroup中某个线程的Selector上
      • 以此循环处理任务队列中的下一个事件
    • 每个WorkerGroup中的线程循环执行以下三个步骤:
      • 轮询注册在其上的NIOSocketChannel的read/write事件,OP_READ/OP_WRITE事件
      • 在对应的NIOSocketChannel上处理read/write事件
      • 以此循环处理任务队列中的下一个事件
  3. 详细版Netty模型

    image-20220419233502608
    image-20220419233502608
    • Netty抽象出两组线程池:BossGroup和WorkerGroup,也可以叫BossNioEventLoopGroup和WorkerNioEventLoopGroup。

      每个线程池都有NioEventLoop线程。

      BossGroup中的线程专门负责和客户端建立连接,WorkerGroup中的线程专门负责处理连接上的读写。

      BossGroup和WorkerGroup的类型都是NioEventLoopGroup。

    • NioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就是一个NioEventLoop。

    • NioEventLoop表示一个不断循环的执行事件处理的线程,每个NioEventLoop都包含一个Selector,用于监听注册在其上的socket连接(Channel)。

    • NioEventLoopGroup可以包含多个线程,即含有多个NioEventLoop。

    • 每个BossNioEventLoop循环执行以下三个步骤

      • select:轮询注册在其上的ServerSocketChannel的accept事件,OP_ACCEPT事件
      • processSelectedKeys:处理accept事件,与客户端建立连接,生成一个NIOSocketChannel,并将其注册到WorkerNioEventLoop的Selector上
      • runAllTasks:以此循环处理任务队列中的其他任务
    • 每个WorkerNioEventLoop循环执行以下三个步骤

      • select:轮询注册在其上的NIOSocketChannel的read/write事件,OP_READ/OP_WRITE事件
      • processSelectedKeys:在对应的NIOSocketChannel上处理read/write事件
      • runAllTasks:以此循环处理任务队列中的其他任务
    • 在以上两个processSelectedKeys步骤中,会使用Pipline(管道),Pipline中引用了Channel。

      通过Pipline可以获取对应的Channel,Pipline中维护了很多处理器(拦截处理器、过滤处理器、自定义处理器等)。


Terwer...大约 3 分钟后端开发分布式reactornetty
Nety源码剖析

本文对Netty源码进行了深入剖析,透过Netty源码来理解Netty框架背后的原理。


Terwer...大约 8 分钟后端开发分布式nettysource
2