这一节和我一起开始正式的去研究Netty源码。在研究之前,我想先介绍一下Reactor模型。

我先分享两篇文献,大家可以自行下载学习。  链接:https://pan.baidu.com/s/1Utym7AS8DHCxrh5aNOD2Ew  提取码:18u3

      下面主要是对文献中一些内容和重要的图片进行说明:

1、Each handler may be started in its own thread, 这种方式在客户端负载增加的时候,有很严重的性能问题。

  • serversocket的accept方法,阻塞等待client连接,直到client连接成功。
  • 线程从socket inputstream  outputstream读写数据,会进入阻塞状态,直到全部数据读写完。
  • 即使没有数据的读写,仍然会占用一个线程,浪费资源。

2、对上面的模型进行优化, 采用事件驱动的模式,有事件发生的时候才会触发:

Reactor为单个线程,既要处理客户端的accept事件,又要负责发送请求到处理器中。由于只有单个线程,所以处理器中的业务需要能够快速处理完。

3、再次进行改进,加入线程池

这样Reactor线程处理完连接之后,将请求放在线程池中进行处理,不会受到Handler的阻塞。

4、使用多个Reactor

mainReactor负责监听连接,accept连接给subReactor处理,为什么要单独分一个Reactor来处理监听呢?因为像TCP这样需要经过3次握手才能建立连接,这个建立连接的过程也是要耗时间和资源的,单独分一个Reactor来处理,可以提高性能。mainReactor仅仅只负责处理客户端连接,subReactor负责后面的数据的读写。

在解决了什么是Reactor模式后,我们来看看Reactor模式是由什么模块构成。图是一种比较简洁形象的表现方式,因而先上一张图来表达各个模块的名称和他们之间的关系:

上面的图由五大角色构成,下面进行解释:

  • Handle(句柄或描述符):本质上是一种资源,由操作系统提供的,该资源用于表示一个个的事件,比如说文件描述符,或是针对网络编程中的Socket描述符,事件既可以来自于外部,又可以来自于内部,外部事件比如客户端的连接请求,客户端数据的读写等等;内部事件比如操作系统产生的定时器事件,它本质上就是一个文件描述符。简单来说,Handle就是事件产生的发源地。
  • Synchronous Event Demultiplexer(同步事件分离器):它本身是一个系统调用,用于等待事件的发生(一个或多个)。调用方在调用它的时候会一直阻塞,一直阻塞到同步分离器上有事件产生,对于Linux来说,同步事件分离器指的就是常用的I/O多路复用器,比如说select、poll、epoll等,在Java NIO 领域中,同步事件分离器的组件就是Selector; 对应的阻塞方法就是select()
  • Event Hander (事件处理器):本身由多个回调方法组成,这些回调方法构成了于应用相关的对于某个事件的反馈机制,Netty相比于Java的NIO来说,在事件处理器的这个角色上进行了一个升级,它为我们开发者指定了大量的回调方法,供我们在特定时间产生的时候实现相应的回调方法进行业务逻辑的处理。
  • Concrete Event Handler(具体事件处理器):是事件处理器的时间,本质上是我们所编写的一个个的处理器的实现
  • Initiation Dispatcher (初始分发器):实际上就是Reactor的角色,它本身定义了一些规范,这些规范用户控制事件的调度方式,同时又提供了应用事件处理器的注册、删除等设施,它本身是整个事件处理器的核心所在,会通过同步事件分离器来等待事件的发生,一旦事件发生,首先会分离出一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。

       

Netty源码分析--Reactor模型(二)的更多相关文章

  1. Netty源码分析--内存模型(上)(十一)

    前两节我们分别看了FastThreadLocal和ThreadLocal的源码分析,并且在第八节的时候讲到了处理一个客户端的接入请求,一个客户端是接入进来的,是怎么注册到多路复用器上的.那么这一节我们 ...

  2. Netty 源码分析系列(二)Netty 架构设计

    前言 上一篇文章,我们对 Netty做了一个基本的概述,知道什么是Netty以及Netty的简单应用. Netty 源码分析系列(一)Netty 概述 本篇文章我们就来说说Netty的架构设计,解密高 ...

  3. Netty源码分析 (十二)----- 心跳服务之 IdleStateHandler 源码分析

    什么是心跳机制? 心跳说的是在客户端和服务端在互相建立ESTABLISH状态的时候,如何通过发送一个最简单的包来保持连接的存活,还有监控另一边服务的可用性等. 心跳包的作用 保活Q:为什么说心跳机制能 ...

  4. Netty源码分析--内存模型(下)(十二)

    这一节我们一起看下分配过程 PooledByteBuf<T> allocate(PoolThreadCache cache, int reqCapacity, int maxCapacit ...

  5. Netty源码分析之NioEventLoop(二)—NioEventLoop的启动

    上篇文章中我们对Netty中NioEventLoop创建流程与源码进行了跟踪分析.本篇文章中我们接着分析NioEventLoop的启动流程: Netty中会在服务端启动和新连接接入时通过chooser ...

  6. Netty源码分析之ChannelPipeline(二)—ChannelHandler的添加与删除

    上篇文章中,我们对Netty中ChannelPipeline的构造与初始化进行了分析与总结,本篇文章我们将对ChannelHandler的添加与删除操作进行具体的的代码分析: 一.ChannelHan ...

  7. Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator

    Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例:我们先看一下ByteBufAllocator ...

  8. Netty源码分析之NioEventLoop(三)—NioEventLoop的执行

    前面两篇文章Netty源码分析之NioEventLoop(一)—NioEventLoop的创建与Netty源码分析之NioEventLoop(二)—NioEventLoop的启动中我们对NioEven ...

  9. netty源码分析之揭开reactor线程的面纱(二)

    如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下 reactor线程 我们已经了解 ...

随机推荐

  1. centos下载安装mysql,并设置远程访问

    思路 获取安装文件→配置好路径→安装→设置权限→处理常见的问题. 1.下载 先建议去官网看看https://dev.mysql.com/,然后根据自己的常识找到下载路径.同时也找到最新版本. 下载方式 ...

  2. 3 Task中的一些枚举 创建时候的、continue时候的

    创建时常用的枚举: None.PreferFairness.LongRunning.AttacthedToParent.DenyChildAttach.HideScheduler AttacthedT ...

  3. vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译

    vcmi源码编译 windows+cmake+mingw ##1 准备 HoMM3 gog.com CMake 官网 vcmi 源码 下载 QT5 with mingw 官网 Boost 源码1.55 ...

  4. 机器学习、深度学习实战细节(batch norm、relu、dropout 等的相对顺序)

    cost function,一般得到的是一个 scalar-value,标量值: 执行 SGD 时,是最终的 cost function 获得的 scalar-value,关于模型的参数得到的: 1. ...

  5. 1-9 RHEL7-文件权限管理

    本节所讲内容: 文件的基本权限:r w x (UGO+ACL) 文件的高级权限:suid sgid sticky 第1章 文件的基本权限 1.1 权限的作用 通过对文件设定权限可以达到以下三种访问限制 ...

  6. Form submit

    方法1:使用form onsubmit标签 return XXX()方法 <!--onsubmit--> <form id="formid" name=" ...

  7. OA 框架

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  8. WPF 流打印

    原文:WPF 流打印 PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { Syst ...

  9. Activity跳转通过EventBus传值问题

    根据阿里发布的Android开发规范:下载地址:https://102.alibaba.com/downloadFile.do?file=1520478361732/Android_v9.pdf Ac ...

  10. Go 的文件系统抽象 Afero

    Afero 是一个文件系统框架,提供一个简单.统一和通用的 API 和任何文件系统进行交互,作为抽象层还提供了界面.类型和方法.Afero 的界面十分简洁,设计简单,舍弃了不必要的构造函数和初始化方法 ...