对Netty组件的基本介绍

Netty的介绍

netty是一个异步的基于事件的框架,主要针对在tcp协议下,开发面向clients端的高并发应用。

netty本质是一个nio框架。

IO模型

Java共支持3中io模型 : BIO,AIO,NIO

BIO

同步阻塞,一个连接一个线程,有连接请求时服务端就需要启动一个线程处理。如果这个线程不做任何事就会造成不必要的开销。当并发数较大时,需要创建大量线程来处理连接。

NIO

同步非阻塞,可以做到一个线程处理多个操作。

NIO 有三大核心部分,Channel,Buffer ,selector

selector、 channel 和buffer的关系

  1. 每个channel 对应一个buffer
  2. selector 对应一个线程,一个线程对应多个channel
  3. 程序切换哪个channel 是由事件决定的。event
  4. selector 会根据不同的事件,在各个通道上切换
  5. Buffer 就是一个内存块,底层是有一个数组
  6. 数据的读取写入是通过buffer,既可以读也可以写, 两者切换的方法是flip
  7. channel 是双向的

Buffer缓冲区

一个可以读写数据的内存块,可以理解成一个容器对象。它负责从channel中读取数据,封装成Buffer对象。Buffer为每一个基本数据类型都提供了实现类。它主要有三个属性:

  • capacity

内存块的固定大小值

  • position

下一个要进行读写位置的索引

  • limit

在写模式下,limit = position ,在读模式下,它表示你最多读到之前写入的最大值

重要的方法

allocate(int count) 初始化buffer容量

get () 从 position 位置读

flip() 由写模式切换为读模式

Channel 通道

作用类似于流,但是可以同时进行读写,可以异步读写。

Channel在NIo中是一个接口,它的实现类有:

  • FileChannel 用于文件读写
  • ServerSocketChannel TCP数据读写
  • DatagramChannel 用于UDP数据读写

主要方法:

  • read 从通道读取数据并放到缓冲区中
  • write 把缓冲区的数据写到通道中
  • transferfrom
  • transferto

Selector 选择器

能够监测多个注册的通道上是否有事件发生,如果有事件发生获取事件交给通道处理。

主要方法:

  • open 获取一个选择器对象
  • SelectionKey register(seelctor,常量) 注册通道 ,常量一共有4种,read读,write写,connect 连接已建立 ,accept(有新的网络连接可以接入)
  • select() 监测所有注册的通道,阻塞

原生NIo存在的问题

类库与API复杂,开发难度大,有bug

Netty模型

  1. netty抽象出2组线程池,bossGroup 负责接受客户端的连接,workGroup 负责读写
  2. bossGroup 与workerGroup 都是NioEventLoopGroup
  3. 每一个NioEventLoopGroup相当于一个事件循环组,每个循环都是NIoEventLoop
  4. NIoEventLoop表示一个不断循环处理执行任务的线程

Netty核心模块组件

Bootstrap,ServerBootstrap

Channel

ChannelFuture

netty中所有操作都是异步的,所以我们需要一个能够确定其结果的方法。通过addListener() 方法获取通知。

ChannelHandler

处理入站和出栈逻辑的容器。

生命周期方法

handlerAdded 当ChannelHandler 添加到ChanelPipeLine中调用

handlerRemoved 移除时调用

它主要有2个子接口, ChannelInboundHandler 和 ChannelOutBoundHandler

ChannelPipeLine

它是ChannelHandler 的容器,内部定义了一组ChannelHandler,是一组过滤器链

ChannelHandlerContext

用于ChannelPipe 和 ChannelHandler的关联,同一个ChannelPipeline 里的ChannelHandler的交互。

ByteBuf

netty的数据容器,是netty实现数据传输的数据结构。

内部维护了两个不同的索引,readIndex ,writeIndex。通过这两个索引将数据划分为3个区域。已经读过的字节,可读字节,可写字节。相比于jdk原生的bytebuf ,它有两个指针,在读写转换时不需要进行flip()

到此这篇关于对Netty组件的基本介绍的文章就介绍到这了,更多相关Netty组件介绍内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java设计模式之责任链模式的概念、实现以及netty中的责任链模式

    本文先介绍了责任链模式的概念及简单实现.再贴了netty中对责任链的实现.最后总结了一点点思考. 1.概念相关 1.1.概念 责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,沿着这条链传递请求,直到有对象处理它为止. 1.2.解决了什么: 客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 1.3.场景: 1.有多个对象可以处理同一

  • Springboot+Netty+Websocket实现消息推送实例

    前言 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输. Netty框架的优势 1. API使用简单,开发门槛低:  2. 功能强大,预置了多种编解码功能,支持多种主流协议:  3. 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展:  4. 性能高,通过与其他业界主流的NIO框架对比,Netty的综

  • 详解Netty编码器和解码器

    目录 一.java的编解码 二.Netty编解码器 2.1 解码器(Decoder) 2.2 代码实现 2.3 编码器(Encoder) 2.4 代码实现 2.5 测试结果 三.编码解码器Codec 3.1 代码实现: 一.java的编解码 1.编码(Encode)称为序列化, 它将对象序列化为字节数组,用于网络传输.数据持久化或者其它 用途. 2.解码(Decode)称为反序列化,它把从网络.磁盘等读取的字节数组还原成原始对象(通常是原 始对象的拷贝),以方便后续的业务逻辑操作. java序列

  • Springboot整合Netty实现RPC服务器的示例代码

    一.什么是RPC? RPC(Remote Procedure Call)远程过程调用,是一种进程间的通信方式,其可以做到像调用本地方法那样调用位于远程的计算机的服务.其实现的原理过程如下: 本地的进程通过接口进行本地方法调用. RPC客户端将调用的接口名.接口方法.方法参数等信息利用网络通信发送给RPC服务器. RPC服务器对请求进行解析,根据接口名.接口方法.方法参数等信息找到对应的方法实现,并进行本地方法调用,然后将方法调用结果响应给RPC客户端. 二.实现RPC需要解决那些问题? 1. 约

  • SpringBoot+netty-socketio实现服务器端消息推送

    首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用netty-socketio.websocket是不支持对接socket.io框架的. netty-socketio顾名思义他是一个底层基于netty'实现的socket. 在springboot项目中的集成,请看下面的代码 maven依赖 <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>ne

  • 对Netty组件的基本介绍

    Netty的介绍 netty是一个异步的基于事件的框架,主要针对在tcp协议下,开发面向clients端的高并发应用. netty本质是一个nio框架. IO模型 Java共支持3中io模型 : BIO,AIO,NIO BIO 同步阻塞,一个连接一个线程,有连接请求时服务端就需要启动一个线程处理.如果这个线程不做任何事就会造成不必要的开销.当并发数较大时,需要创建大量线程来处理连接. NIO 同步非阻塞,可以做到一个线程处理多个操作. NIO 有三大核心部分,Channel,Buffer ,se

  • React-Native之截图组件react-native-view-shot的介绍与使用小结

    目录 一.现象 二.解决 三.总结: 一.现象 1.需求:把某展示页面进行截取保存到相册.并可进行以海报的形式分享出去: 2.支持iOS和安卓 二.解决 1.安装: npm i --save react-native-view-shot 2.进行链接处理:react-native link react-native-view-shot 3.当为IOS时执行还需要执行一下命令(安卓不用):cd ios && pod install && cd .. 4.使用: (1).引用:

  • Netty组件NioEventLoopGroup创建线程执行器源码解析

    目录 通过上一章的学习, 我们了解了Server启动的大致流程, 有很多组件与模块并没有细讲, 从这个章开始, 我们开始详细剖析netty的各个组件, 并结合启动流程, 将这些组件的使用场景及流程进行一个详细的说明 这一章主要学习NioEventLoop相关的知识, 何为NioEventLoop? NioEventLoop是netty的一个线程, 在上一节我们创建两个NioEventLoopGroup: EventLoopGroup bossGroup = new NioEventLoopGro

  • React过渡动画组件基础使用介绍

    目录 1. 基础使用 2. 将animate.css集成到csstranistion中 3. 列表过渡 4. switchTransition动画 5. 路由切换过渡 6. 高阶组件实现路由切换过渡 1. 基础使用 介绍: 在项目中可能会给一些组件的显示或隐藏添加某种过渡动画,这样可以很好的增加用户的使用体验, react-transition-group 是 react 的第三方模块,借助这个模块可以实现动画切换效果. 安装: yarn add react-transition-group 使

  • Spring Cloud Stream消息驱动组件使用方法介绍

    目录 1.Stream解决的痛点问题 2.Stream重要概念 3.传统MQ模型与Stream消息驱动模型 4.Stream消息通信方式及编程模型 4.1.Stream消息通信方式 4.2.Stream编程注解 4.3.Stream消息驱动之开发生产者端 4.4.Stream消息驱动之开发消费者端 5.Stream高级之自定义消息通道 6.Stream高级之消息分组 MQ:消息队列/消息中间件/消息代理,产品有很多,ActiveMQ RabbitMQ RocketMQ Kafka 1.Strea

  • React路由渲染方式与withRouter高阶组件及自定义导航组件应用详细介绍

    目录 1. 路由的三种渲染方式 1.1 component渲染方式 1.2 render方式渲染 1.3 案例-登录成功才能访问某个页面 1.4 children方式渲染 2. withRouter高阶组件 3. 自定义导航组件 1. 路由的三种渲染方式 1.1 component渲染方式 描述: 这种渲染方式有两种,一种是类方式渲染,一种是函数方式渲染. 语法: <Route path="/home" component={Home} /> 或 <Route pat

  • React组件的应用介绍

    目录 1. 介绍 2. 组件的创建方式 2.1 函数创建组件 2.2 类组件 3. 父子组件传值 3.1 函数组件 3.2 类组件 1. 介绍 组件允许你将 UI 拆分为独立可复用的代码片段,并对每个片段进行独立构思.从概念上类似于 JavaScript 类或函数.它接受任意的形参( props ),并返回用于描述页面展示内容的 React元素( jsx ). 定义好的组件一定要有返回值. react中定义组件的2种方式 函数组件(无状态组件/UI组件) 类组件(状态组件/容器组件) 2. 组件

  • 微信小程序父子组件通信详细介绍

    组件间的基本通信方式有以下几种: WXML 数据绑定:用于父组件向子组件的指定属性设置数据. 事件:用于子组件向父组件传递数据,可以传递任意数据. 如果以上两种方式不足以满足需要,父组件还可以通过 this.selectComponent() 方法获取子组件实例对象,这样就可以直接访问组件的任意数据和方法. 父组件通过 properties 属性给子组件传递数据: // 父组件 home.wxml <search-input placeholderText="搜明星.达人">

  • Vue组件基础操作介绍

    目录 一.组件 二.组件的创建 三.组件中的data 四.组件中的methods 一.组件 组件是vue的重要的特征之一,可以扩展html的功能,也可以封装代码实现重复使用. 二.组件的创建 1. 非脚手架方式下创建 ​ 第一步:使用Vue.extend创建组件 ​ 第二步:使用Vue.component注册组件 ​ 第三步:在html页面中使用组件 <div id="app"> <my-com></my-com> <!-- 使用组件:名称之间

  • .NET中开源文档操作组件DocX的介绍与使用

    前言 相信大家应该都有所体会,在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文档操作的需求,开发者较多的会使用到微软自行提供的插件,在一定程度上简化了开发人员的工作量,但是同时也给用户带来了一些困扰,例如需要安装庞大的office,在用户体验性就会降低很多,并且在国内,很多人都还是使用wps,这就导致一部分只安装了wps的使用者很是为难,在对Ex

随机推荐