• 【博学谷学习记录】超强总结,用心分享|架构师-Netty核心组件


    Bootstrap

    引导配置netty
    Netty中提供了2种类型的引导类,一种用于客户端(Bootstrap),而另一种(ServerBootstrap)用于服务器 ,区别在于:
    1、ServerBootstrap 将绑定到一个端口,因为服务器必须要监听连接,而 Bootstrap 则是由想要连接 到远程节点的客户端应用程序所使用的
    2、引导一个客户端只需要一个EventLoopGroup,但是一个ServerBootstrap则需要两个

    channel

    Netty中的Channel是与网络套接字相关的,可以理解为是socket连接,在客户端与服务端连接的时候就会 建立一个Channel,它负责基本的IO操作,比如:bind()、connect(),read(),write() 等。
    主要作用:

    1. 通过Channel可获得当前网络连接的通道状态。
    2. 通过Channel可获得网络连接的配置参数(缓冲区大小等)。
    3. Channel提供异步的网络I/O操作,比如连接的建立、数据的读写、端口的绑定等。

    不同协议、不同的I/O类型的连接都有不同的 Channel 类型与之对应。

    EventLoopGroup&EventLoop

    Netty是基于事件驱动的,比如:连接注册,连接激活;数据读取;异常事件等等,有了事件,就需要一 个组件去监控事件的产生和事件的协调处理,这个组件就是EventLoop(事件循环/EventExecutor),在 Netty 中每个Channel 都会被分配到一个 EventLoop。一个 EventLoop 可以服务于多个 Channel。每个 EventLoop 会占用一个 Thread,同时这个 Thread 会处理 EventLoop 上面发生的所有 IO 操作和事件。

    EventLoopGroup 是用来生成 EventLoop 的,包含了一组EventLoop(可以初步理解成Netty线程池)

    ChannelHandler、ChannelHandlerContext、ChannelPipeline

    每个Channel都有个ChannelPipeline对应;
    ChannelPipeline是由于ChannelHandlerContext构成的双向链表
    ChannelHandlerContext内部是ChannelHandler,可以理解为ChannelHandler的上下文

    ByteBuf

    Java NIO 提供了ByteBuffer 作为它的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐。Netty 使用ByteBuf来替代ByteBuffer,它是一个强大的实现,既解决了JDK API 的局限性, 又为网络应用程序的 开发者提供了更好的API 。

    从结构上来说,ByteBuf 由一串字节数组构成。数组中每个字节用来存放信息,ByteBuf提供了两个索引, 一个用于读取数据(readerIndex ),一个用于写入数据(writerIndex)。这两个索引通过在字节数组中 移动,来定位需要读或者写信息的位置。而JDK的ByteBuffer只有一个索引,因此需要使用flip方法进行读 写切换

    堆缓冲区(HeapByteBuf):内存分配在jvm堆,分配和回收速度比较快,可以被JVM自动回收,缺点是,如果进行 socket的IO读写,需要额外做一次内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下 降。由于在堆上被 JVM 管理,在不被使用时可以快速释放。可以通过 ByteBuf.array() 来获取 byte[] 数据。
    直接缓冲区(DirectByteBuf):内存分配的是堆外内存(系统内存),相比堆内存,它的分配和回收速度会慢一些, 但是将它写入或从Socket Channel中读取时,由于减少了一次内存拷贝,速度比堆内存块。
    复合缓冲区(CompositeByteBuf):顾名思义就是将两个不同的缓冲区从逻辑上合并,让使用更加方便。

    Future & Promise

    future和promise,目的是将值(future)与其计算方式(promise) 分离,从而允许更灵活地进行计算,特别是通过并行化。Future 表示 目标计算的返回值,Promise 表示计算的方式,这个模型将返回结果 和计算逻辑分离,目的是为了让计算逻辑不影响返回结果,从而抽象 出一套异步编程模型。而计算逻辑与结果关联的纽带就是 callback。

    Netty中有非常多的异步调用,譬如:client/server的启动,连接,数 据的读写等操作都是支持异步的。

  • 相关阅读:
    Github优秀项目-使用Python基于Wav2Lip的AI主播
    sql数据库入门(1)
    Java#21(抽象与接口)
    Doris从理论详解到千万级数据量场景使用
    20 _ 散列表(下):为什么散列表和链表经常会一起使用?
    Linux 之 Firewalld
    《算法竞赛·快冲300题》每日一题:“点灯游戏”
    PDF转Word免费的软件有哪些?教给你三种转换方法
    2022国赛数学建模思路汇总A题B题C题D题 高教社杯
    工业级Netty网关,京东是如何架构的?
  • 原文地址:https://blog.csdn.net/qq_22043649/article/details/126576082