栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

netty入门(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

netty入门(二)

基于NIO实现的netty框架, 前面讲了NIO的Selector, ServerSocketChannel, SocketChannel, ByteBuffer, 本章节升华以netty框架实现的client-server间的交互。

netty的优点:

零拷贝, 可拓展事件模型, 支持TCP, UDP, HTTP, WebSocket等协议, 支持安全传输, 压缩, 大文件传输, 编解码等!

1. 设计优雅, 提供阻塞和非阻塞的socket, 提供灵活可拓展的事件模型, 提供高度可定制的线程模型。

2. 具有更高的性能和更大的吞吐量, 使用零拷贝最小化了内存消耗

3. 提供安全传输特性

4. 支持多种主流协议, 预置多种编码功能, 支持用户开发私有协议

一. 线程模型

1. 传统阻塞IO模型

2. Reactor模型:有三种典型的实现

单Reactor 单线程

单Reactor 多线程

主从Reactor 多线程

Reactor模式指当有多个请求来到服务端时, 由一个主线程进行IO复用监听, 收到事件后, 派发(dispatcher)给相应的处理线程(进程)。

解析主从Reactor模式:

由主线程通过selector监听客服端l连接请求, 分发给Acceptor处理连接请求。

Acceptor处理完之后与客服端建立socket连接, 由MainReactor交由SubReactor处理以后的IO事件

SubReactor将连接加入到自己的连接队列进行监听, 并创建handler对事件进行处理。

当连接上发生事件时, 就会调用对应的handler处理。

Handler通过read从连接上读取请求数据, 将请求数据分发给worker线程进行业务处理。

 worker线程会分配真正独立的线程处理真正的业务, 并将数据返回给handler, handler通过send返回给客服端。

二. netty主要是基于主从Reactor的改进

简单版的模型

1. BoosGroup 维护Selector, ServerSocketChannel 注册到这个Selector中, 只关注连接事件

2. 当接受到连接请求后, 由accpet()方法获取SocketChannel , 并封装成NIO... 注册到WorkGroup的Selector中,之后专门用来处理IO事件。 当然每个线程对应一个Selector, 可以有多个Selector.

3. workGroup监听到感兴趣的事件就交给Handle处理。

进 阶模型:

1. BoosGroup中可以有多个Selector, 每个都可以接收连接请求并处理,WorkGroup也是一样

2. 每个BoosGroup中的线程循环执行三个步骤:

A. 轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)

B. 处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到 WorkerGroup 中某个线程上的 Selector 上

C. 再去以此循环处理任务队列中的下一个事件 3. 每个WorkGroup执行一下三个步骤: A.  轮训注册在其上的 NioSocketChannel 的 read/write 事件( OP_READ/OP_WRITE 事 件) B. 在对应的 NioSocketChannel 上处理 read/write 事件 C. 再去以此循环处理任务队列中的下一个事件 详细版模型:

就是把多个Selecot事件循环, 放到一个NioEventLoopGroup, 相当于事件循环组, 每个事件循环相当于一个NioEventLoop, 对应一条线程。每个NioEventLoopGroup可以有多个线程。

每个BossNioEventLoop中循环三个步骤:

step1. select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)step2. processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上

step3.runAllTasks:再去以此循环处理任务队列中的其他任务

每个WorkerNioEventLoop中循环三个步骤:

step1. select :轮训注册在其上的 NioSocketChannel 的 read/write 事件 OP_READ/OP_WRITE 事件) step2: processSelectedKeys :在对应的 NioSocketChannel 上处理 read/write 事件 step3: runAllTasks :再去以此循环处理任务队列中的其他任务 在以上两个 processSelectedKeys 步骤中,会使用 Pipeline (管道), Pipeline 中引用了 Channel ,即通过 Pipeline 可以获取到对应的 Channel , Pipeline 中维护了很多的处理器 (拦截处理器、过滤处理器、自定义处理器等)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777766.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号