Netty「基础」之六大组件

简介: Netty「基础」之六大组件

前言

本篇主要讲解Netty的六大组件Handler, Pipeline, EventLoop, TaskQueue, Future和Promise

Future 和 Promise

Netty中的Future继承于jdkFuture, Promise是对Netty中的Future的扩展

  • jdk中的Future只能同步等待任务结束才能得到结果
  • Netty中的Future可以同步等待任务结束得到结果, 也可以异步方式得到结果, 但是都要等待任务结束
  • Netty中的Promise不仅有Netty - Future的功能 而且脱离了任务独立存在, 只作为两个线程之间传递结果的容器

Netty Future

Netty中的Future可以通过EventLoop.submit()方法来获取

  • 可以通过get()方法来阻塞的获取结果
  • 可以通过getNow()方法非阻塞的获取结果, 没有结果则为null
  • 可以通过future.addListener()方法, 在Callable方法执行的线程中, 异步获取返回结果

Netty Promise

Promise相当于一个容器, 可以用户存放各个线程中的结果, 然后让其他线程去获取该结果

ChannelHandler

Netty中, ServerHandlerClientHandler存在如下关系

  • 都继承于ChannelInboundHandlerAdapter
  • ChannelInboundHandlerAdapter继承于ChannelHandlerAdapter
  • ChannelHandlerAdapter实现了ChannelHandler

因此在Netty中不论是客户端还是服务端的Handler都可以称之为ChannelHandler

网络异常,图片无法展示
|

Netty中的ChannelHandler的作用是将当前ChannelHandler的 IO事件 进行处理并传递给同一个ChannelPipeline中的下一个ChannelHandler, 因此在同一个ChannelPipeline中的ChannelHandler就形成了一个责任链

  • inbound 是入站, 客户端到服务端是出站
  • outbound 是出站, 服务端到客户端

数据在基于Netty的服务器或客户端中的处理流程:

  • 读取数据
  • 解码数据
  • 处理数据
  • 编码数据
  • 发送数据 其中每个过程都会用到ChannelHandler责任链
    网络异常,图片无法展示
    |

Netty Pipeline

每一个Channel中都包含了一个ChannelPipeline, 每个ChannelPipeline中又包含了一个由ChannelHandlerContext构成的双向链表, 在ChannelHandlerContext中又包含了一个ChannelHandler

  • ChannelChannelPipeline相互引用

网络异常,图片无法展示
|

入站和出站

  • 当有入站操作的时候, 会从开始向后调用Handler, 直到Handler不是处理Inbound操作为止
  • 当有出站操作的时候, 会从开始向前调用Handler, 直到Handler不是处理OutBound操作为止

网络异常,图片无法展示
|

EventLoop 组件

事件循环对象EventLoop的本质是一个单线程执行器, 如果追踪他的继承链, 就会发现该类是继承于JUCExecutor, 同时每一个EventLoop都维护了一个Selector实例, Selector实例会监听注册在其上Channel的 IO事件

  • 一个Selector实例上会注册多个Channel

关于EventLoop组件, 我之前专门出过一篇文章, 从简单分析到源码阅读, 可以去看Netty「源码阅读」之 EventLoop 简单介绍到源码分析 - 掘金 (juejin.cn)

TaskQueue

Netty中的NioEventLoop有两个重要的属性, 分别是SelectorTaskQueue, 在之前我专门写过文章写过Selector

在上面, 我们讲解了会在Pipline中调用Handler来处理我们的业务, 那么假如在某一个Handler有一个长时间的操作, 这就势必会造成Pipline的阻塞, 这时我们就可以将这个耗时的处理提交到TaskQueue进行异步的执行

三种使用场景

  • 处理用户程序的自定义普通任务的时候
  • 处理用户程序的自定义定时任务的时候
  • 非当前Reactor线程调用当前Channel的各种方法的时候

结束

通过本次讲解, 我们对于Netty的六大组件都有了基本的了解, 再配合我们之前的文章, 就对Netty框架的整体架构, 运行流程都有了大概的了解




目录
相关文章
|
Java
由浅入深Netty组件实战3
由浅入深Netty组件实战3
62 0
|
前端开发 算法 Java
由浅入深Netty组件实战2
由浅入深Netty组件实战2
225 0
|
缓存 安全 Java
由浅入深Netty基础知识NIO三大组件原理实战 2
由浅入深Netty基础知识NIO三大组件原理实战
76 0
|
Java
由浅入深Netty基础知识NIO三大组件原理实战 1
由浅入深Netty基础知识NIO三大组件原理实战
103 0
|
前端开发 安全 Java
由浅入深Netty组件实战1
由浅入深Netty组件实战1
86 0
|
7月前
|
设计模式 前端开发 网络协议
面试官:说说Netty的核心组件?
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容: 1. 启动器 Bootstrap/ServerBootstrap 2. 事件循环器 EventLoopGroup/EventLoop 3. 通道 Channel 4. 通道处理器 ChannelHandler 5. 通道管道 ChannelPipeline 这些组件的交互流程如下: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1716
46 0
面试官:说说Netty的核心组件?
|
7月前
|
前端开发 Java 网络安全
【Netty 网络通信】Netty 核心组件
【1月更文挑战第9天】【Netty 网络通信】Netty 核心组件
|
7月前
|
前端开发 网络协议 Java
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
373 0
|
7月前
|
网络协议 前端开发 Java
Netty Review - 核心组件扫盲
Netty Review - 核心组件扫盲
101 0
|
编解码 前端开发 Java
源码分析Netty:核心组件及启动过程分析
本篇从实例出发,了解Netty核心组件的概念、作用及串联过程。从概念到设计原理,再到深入了解实现细节,从而能够清晰地掌握Netty的技术细节甚至存在的问题,才能最终更好地支持我们实际的各项业务。
353 0