前置条件

源码版本netty4.1

了解Java NIO、Reactor模型和Netty的基本使用。

解释一下:

  • Java NIO:了解BIO和NIO的区别以及Java NIO基础API的使用
  • Reactor模型:Netty是基于Netty模型对Java NIO封装的框架
  • Netty的基本使用:先学会基本使用再看源码,这样可以带着看源码,事半功倍(这个api为啥这么样设计,这个对象又是在什么时候生成的巴拉巴拉)

Netty中的Reactor模型

Netty的线程模型参考了Reactor主从多线程模型,但又不完全一样。

图1,来源:Scalable IO in Java

此为Reactor主从多线程模型

  1. MainReactor负责监听客户端连接事件,创建连接后将连接交给SubReactor

  2. SubReactor负责监听读取事件,有事件发生时,交由Handler处理

  3. Handler负责读写数据,实际的业务逻辑交由线程池处理(图中的Thread Pool)

    读 → 线程池处理 → 异步等待线程池处理完成 → 写

图,2,来源于网络

此为Netty的线程模型

BossGroup和WorkerGroup可以简单理解为线程池(描述不准确,用来简单比喻),实际工作的是其内的NioEventLoop

  1. BossGroup负责监听客户端连接事件,创建连接后将连接交给WorkerGroup
  2. WorkerGrou负责监听读取事件,有事件发生时,读取数据并交由Handler处理

与Reactor主从多线程模型不同的是,Netty的Handler不负责读写数据,专注于数据的处理

Netty的组件

此部分来源于《Netty In Action》的摘抄

Channel接口

提供基本的 I/O 操作(bind()、connect()、read()和 write()),依赖于底层网络传输所提供的原语。类比就是Java网络编程中的Socket

EventLoop接口

定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。

  • 一个 EventLoopGroup 包含一个或者多个 EventLoop;
  • 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
  • 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
  • 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
  • 一个 EventLoop 可能会被分配给一个或多个 Channel。

注意,在这种设计中,一个给定 Channel 的 I/O 操作都是由相同的 Thread 执行的,实际

上消除了对于同步的需要。

EventLoopGroup接口

可以理解为EventLoop的池,用于创建和分配EventLoop

ChannelHandler接口

处理入站和出站数据的容器(简单理解就是处理业务逻辑的地方)

划分为入站处理(ChannelInboundHandler)和出站处理(ChannelOutboundHandler

ChannelPipeline接口

提供了 ChannelHandler 链的容器,并定义了用于在该链上传播入站和出站事件流的 API。

责任链模式。


参考资料:

《Netty in Action》,Norman Maurer

《Scalable IO in Java》,Doug Lea

Netty源码解读(一)-前置准备的更多相关文章

  1. Netty源码解读(二)-服务端源码讲解

    简单Echo案例 注释版代码地址:netty 代码是netty的源码,我添加了自己理解的中文注释. 了解了Netty的线程模型和组件之后,我们先看看如何写一个简单的Echo案例,后续的源码讲解都基于此 ...

  2. Netty源码解读(四)-读写数据

    读写Channel(READ)的创建和注册 在NioEventLoop#run中提到,当有IO事件时,会调用processSelectedKeys方法来处理. 当客户端连接服务端,会触发服务端的ACC ...

  3. Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,跟踪进去看看 // ...

  4. Netty异步Future源码解读

    本文地址: https://juejin.im/post/5df771ee6fb9a0161d743069 说在前面 本文的 Netty源码使用的是 4.1.31.Final 版本,不同版本会有一些差 ...

  5. Redisson源码解读-分布式锁

    前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).Redisson有一样功能是可重入的分布式锁.本文来讨论一下这个功能的特点以及源 ...

  6. ThreadPoolExecutor源码解读

    1. 背景与简介 在Java中异步任务的处理,我们通常会使用Executor框架,而ThreadPoolExecutor是JUC为我们提供的线程池实现. 线程池的优点在于规避线程的频繁创建,对线程资源 ...

  7. Netty 源码中对 Redis 协议的实现

    原文地址: haifeiWu的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 近期一直在做网络协议相关的工作,所以博客也就与之相关的比较多,今天楼主结合 Re ...

  8. Netty源码分析第4章(pipeline)---->第2节: handler的添加

    Netty源码分析第四章: pipeline 第二节: Handler的添加 添加handler, 我们以用户代码为例进行剖析: .childHandler(new ChannelInitialize ...

  9. Netty源码分析第4章(pipeline)---->第3节: handler的删除

    Netty源码分析第四章: pipeline 第三节: handler的删除 上一小节我们学习了添加handler的逻辑操作, 这一小节我们学习删除handler的相关逻辑 如果用户在业务逻辑中进行c ...

随机推荐

  1. 做SaaS的程序员们,是时候关注企业架构了

    SaaS赛道是一个超大赛道,足够容纳上万家服务商,不太可能有哪个服务商能满足所有场景,大部分SaaS服务商在某个垂直领域,提供差异化的产品和服务.SaaS产品大部分都是面向B端客户,少部分面向C端客户 ...

  2. Spring配置及依赖注入

    入门 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-we ...

  3. 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ...

  4. PostGIS 扩展创建失败原因调查

    Issue 升级 PostgreSQL 9.1 的一个集群,由于该集群用到了 PostGIS,在升级 PostgreSQL 时也需要升级一下 PostGIS.PostGIS 相关软件安装好后,在 Po ...

  5. 翻页组件page-flip调用问题

    翻页组件重新调用解决方案 翻页组件:page-flip import { PageFlip } from 'page-flip' pagefile() { //绘制翻页 this.pageFlip = ...

  6. AntdVue使用

    AntdVue使用 配置与安装 #安装 npm install ant-design-vue --save #按需加载 import { Button, Layout, Row, Col, Menu, ...

  7. SPPNet(特征金字塔池化)学习笔记

    SPPNet paper:Spatial pyramid pooling in deep convolutional networks for visual recognition code 首先介绍 ...

  8. [补漏]shift&算法

    题意:regular number 给你一个字符串,要你输出所有(每位都符合要求的)子串,输入时告诉你每位只能填的数集. 思路: bitsetc[x]存每个数字可以存在的字符串位的二进制集合.(如3可 ...

  9. select into 与 insert into 的区别

    1.select * into table_A  from table_B table_A是个新创建表,table_B是个已经存在的表. 2.insert into table_A from tabl ...

  10. Jmeter跨线程组获取token(彻底解决因格式token报错)

    将token设置为全局变量网上方式方法千千万,但是你就是获取token会失败,不是提示格式错误,就是提示无法获取token,没安装Jmeter的可以查看前两期教程,有详细介绍 在工作当中如果仅仅是一个 ...