概述

  1. 基于NIO 的框架,目的是简化开发NIO的工作量
  2. 异步的 ,基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序
  3. Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、 通信行业等获得了广泛的应用

传统线程模型 和 Reactor模式

1. 传统 阻塞I/O 模型



写过原生java socket编程的都清楚 , client每次连接都会创建一个线程 用于维护连接,如果没有数据读取,线程也会一直保持阻塞,连接一多,及其耗费系统资源.

2.Reactor模式



又称为 反应器模式,分发者模式 通知者模式

特点:

  • Reactor 模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)

  • 服务器端程序处理传入的多个请求,并将它们同步分派到相应的处理线程, 因此Reactor模式也 叫Dispatcher模式(分发)

  • Reactor 模式使用IO复用监听事件, 收到事件后,分发给某个线程(进程)

如图所示,只需 ServiceHandler维护连接即可,并监听客户端发出的各种请求时间,并分类交由 对应的事件处理器处理,例如 连接事件,读请求,等等. 待处理完成后 ,并释放自身占用的线程.重复使用

Reactor 模式的三种实现:

单Reactor单线程:



实现思路:

  1. 服务器端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等)

  2. 多客户端过来的连接 处理还是 业务处理都是同一个线程. 编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑( 接待员和服务员 是同一个人 )

单Reactor多线程



实现思路:

  1. Reactor 对象通过select 监控客户端请求事件, 收到事件后,通过dispatch进行分发

  2. 如果建立连接请求, 则由Acceptor 通过accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件

  3. 如果不是连接请求,则由reactor分发调用连接对应的handler 来处理

  4. handler 只负责响应事件,不做具体的业务处理, 通过read 读取数据后,会分发给后面的worker线程池的某个线程处理业务

  5. worker 线程池会分配独立线程完成真正的业务,并将结果返回给handler

  6. handler收到响应后,通过send 将结果返回给client

Reator 仅仅只是接受各种事件,具体的工作由Worker线程池中Worker去处理,如果请求过多,单线程的Reator还是会出现瓶颈(一个接待员 多个服务员)

主从Reactor 多线程

  1. Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后,通过Acceptor 处理连接事件

  2. 当 Acceptor 处理连接事件后,MainReactor 将连接分配给SubReactor

  3. subreactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理

  4. 当有新事件发生时, subreactor 就会调用对应的handler处理

  5. handler 通过read 读取数据,分发给后面的worker 线程处理

  6. worker 线程池分配独立的worker 线程进行业务处理,并返回结果

  7. handler 收到响应的结果后,再通过send 将结果返回给client

  8. Reactor 主线程可以对应多个Reactor 子线程, 即MainRecator 可以关联多个SubReactor

监听请求的Reactor也变成多个,由主监听连接事件 由从监听其他事件 这样的组合也有可以有多个(多个接待员 多个服务员)

Netty模型

  1. Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写
  2. BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup
  3. NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多个事件循环 ,每一个事件循环是NioEventLoop
  4. NioEventLoop 表示一个不断循环的执行处理任务的线程, 每个NioEventLoop 都有一个selector , 用于监听绑定在其上的socket的网络通讯
  5. NioEventLoopGroup 可以有多个线程, 即可以含有多个NioEventLoop
  6. 每个Boss NioEventLoop 循环执行的步骤有3步
  • 轮询连接 事件
  • 处理 连接 事件 , 与client建立连接 , 生成NioScocketChannel , 并将其注册到某个worker NIOEventLoop 上的 selector
  • 处理任务队列的任务 , 即 runAllTasks
  1. 每个 Worker NIOEventLoop 循环执行的步骤
  • 轮询read, write 事件
  • 处理i/o事件, 即read , write 事件,在对应NioScocketChannel 处理
  • 处理任务队列的任务 , 即 runAllTasks
  1. 每个Worker NIOEventLoop 处理业务时,会使用pipeline(管道), pipeline 中包含了 channel , 即通过pipeline 可以获取到对应通道, 管道中维护了很多的 处理器

Netty 将 Reactor 和 Handler 分别抽象为 BossGroup 和 WorkerGrop 其中每个Group中都维护了多个事件循环对象:NioEventLoop 每个事件循环 都保持一个for无限循环,监听其感兴趣的 事件发生 并处理 .

Netty笔记(1) - Netty概述 和 框架结构的更多相关文章

  1. Netty学习笔记(二)——netty组件及其用法

    1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...

  2. netty系列之:netty架构概述

    目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和 ...

  3. Netty笔记——技术点汇总

    目录 · Linux网络IO模型 · 文件描述符 · 阻塞IO模型 · 非阻塞IO模型 · IO复用模型 · 信号驱动IO模型 · 异步IO模型 · BIO编程 · 伪异步IO编程 · NIO编程 · ...

  4. netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...

  5. Netty 系列之 Netty 高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10 W TPS(1 K 的复杂 POJO 对象)的跨 ...

  6. Netty系列之Netty高性能之道

    转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...

  7. 转:Netty系列之Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用 ...

  8. OGG学习笔记01-基础概述

    OGG学习笔记01-基础概述 OGG(Oracle Golden Gate),最近几年在数据同步.容灾领域特别火,甚至比Oracle自己的原生产品DataGuard还要风光,主要是因为其跨平台.跨数据 ...

  9. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!

    Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...

  10. TensorFlow笔记-01-开篇概述

    人工智能实践:TensorFlow笔记-01-开篇概述 从今天开始,从零开始学习TensorFlow,有相同兴趣的同志,可以互相学习笔记,本篇是开篇介绍 Tensorflow,已经人工智能领域的一些名 ...

随机推荐

  1. 【记录一个问题】gin框架中,ShouldBindUri()函数依赖特定版本编译器,更换库的版本号后导致panic

    panic发生在这一行: uriBindErr = c.ShouldBindUri(methodLastInParam.Interface()) 导致panic的堆栈信息如下: err=reflect ...

  2. 跟着文档学Fabric:获取通道配置

    原文在这里. 1. 获取通道配置 peer channel fetch config config_block.pb -o $ORDERER_CONTAINER -c $CH_NAME --tls - ...

  3. Gorm 数据库表迁移与表模型定义

    目录 一.Docker快速创建MySQL实例 1.1 创建 1.3 创建数据库 二.AutoMigrate介绍与使用 2.1 AutoMigrate介绍 2.2 AutoMigrate 基本使用 三. ...

  4. 从零开始配置vim(19)——终端配置

    在上一篇文章中,我们熟悉了终端模式,并且配置了终端模式的一些操作.但是它总是有那么一点不符合我们的使用习惯.这篇我们将通过强大的插件来完善终端操作的体验. 在介绍插件之前让我们先回退到上一个版本,我们 ...

  5. 深入浅出Java多线程(二):Java多线程类和接口

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第二篇内容:Java多线程类和接口.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代计算机系统中,多线程 ...

  6. Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

    Prompt-"设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务" 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型 ...

  7. conda创建虚拟环境后文件夹中只有conda-meta文件夹,无法将环境添加到IDE中

    1.问题描述:anaconda的envs的其中一个环境目录下,没有python.exe文件,只有conda-meta和scripts 平时创建虚拟环境都是: conda create -n test ...

  8. Centos安装Python3.8

    最直白的centos8安装python3.8yum install -y update安装 gcc和make插件:yum install gcc gcc-c++yum -y install gcc a ...

  9. SpringCloud之Ribbon负载均衡

    上述案例中,我们启动了一个msg-service,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问. 但是实际环境中,我们往往会开启很多个user-service的集 ...

  10. 【算法】C程序超详细的qsort排序函数解释和模拟

    C程序利用冒泡排序的思想模拟实现qsort排序函数 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之 ...