java多线程框架 netty,JavaSocket编程之Netty框架线程模型
1.Netty概述
Netty是一个由JBoss提供的高效的Java NIO client-server(客户端-服务器)开发框架,使用Netty可以快速开发网络应用。Netty提供了一种新的方式来使开发网络应用程序,使其很容易使用且有很强的可扩展性。Netty的内部实现是很复杂的,但是Netty提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,采用事件驱动机制,非阻塞执行,所以整个Netty都是异步的。Netty框架体系结构图如下:
Netty框架体系结构图
2.Java NIO缓冲区与通道
一个Buffer对象是固定数量的数据的容器,其作用是一个存储器。通道Channel是I/O传输发生时通过的入口,而缓冲区是这些数据传输的来源或目标。对于离开缓冲区的传输,您想传递出去的数据被置于一个缓冲区,被传送到通道。缓冲区是包在一个对象内的基本数据元素数组。Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。缓冲区家族成员如下所示:
缓冲区Buffer具有四个属性来提供关于其所包含的数据元素的信息。
它们是:
容量(Capacity):缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,且不能被改变。
上界(Limit):缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。
位置(Position):下一个要被读或写的元素的索引。位置会自动由相应的get( )和put( )函数更新。
标记(Mark):一个备忘位置。调用mark( )来设定mark = postion。调用reset( )设定position = mark。标记在设定前是未定义的(undefined)。
这四个属性之间总是遵循以下关系
0 <= mark <= position <= limit <= capacity
3.Netty核心网络模型
Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。Netty是事件驱动,非阻塞的,可以通过ChannelHandler链来控制执行流向。
3.1 Refactor单线程模型
Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成;
Reactor单线程模型特点:
1)Java NIO服务端,接收客户端的TCP连接;
2)Java NIO客户端,向服务端发起TCP连接;
3)Java NIO服务端/客户端,读取通信对端的请求或者应答消息;
4)Java NIO服务端/客户端,向通信对端发送消息请求或者应答消息
使用场景:对于一些小容量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用场景却不合适,比如一个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送。Reactor单线程模型如下图所示:
3.2 Refactor多线程模型
Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理IO操作。
Reactor多线程模型的特点:
1)有一个专门的NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求;
2)网络IO操作-读、写等由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送;
3)1个NIO线程可以同时处理N条链路,但是1个链路只对应1个NIO线程,防止发生并发操作问题。
Reactor多线程模型如下图所示:
3.3 Netty服务器端创建过程
Netty服务器启动时,创建两个NIOEventLoopGroup独立的Reator线程池,一个用于接收客户端的TCP连接,一个用于处理IO的相关的读写操作。
Netty线程模型是建立在Reactor模型的基础上,线程模型并不是一成不变的,通过启动参数的配置,可以在不同的线程模型之间切换。Netty服务器端创建过程序列图如下:
Netty服务器端创建过程序列图
1)首先创建一个ServerBootstrap实例,这是Netty服务端的启动辅助类;
2)设置并绑定Reactor线程池,Netty的Reactor线程池是EventLoopGroup,它其实就是EventLoop线程的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector上的Channel;
3)设置并绑定服务端NIOserverSocketChannel, Netty通过工厂类,利用反射方式创建NioServerSocketChannel对象
4)设置TCP连接参数,TCP链路建立时创建并初始化ChannelPipeline,它本质是一个负责处理网络事件的职责链,负责管理和执行ChannelHandler。网络事件以事件流的形式在ChannelPipeline中流转,由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行;
5)添加并设置ChannelHandler,加入到ChannelPipeline事件流;
6)服务器端绑定监听端口,并启动服务器;
7)启动NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合;
8)当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法;
9)执行Netty系统并调度执行ChannelHandler业务逻辑
3.4 Netty线程模型实例
注册两个OutboundHandler,执行顺序为注册顺序的逆序,注册两个InboundHandler,执行顺序为注册顺序,注册HelloServerInHandler用于接收客户端消息已经向客户端发送消息,主要代码如下:
本订阅号提供Java相关技术分享,从Java编程基础到Java高级技术,从JavaWeb技术基础Jsp、Servlet、>JDBC到SSH、SSM开发框架,从REST风格接口设计到分布式项目实战。剖析主流开源技术框架,用亲身
实践来谱写深度Java技术日志。
Java技术日志
欢迎关注 Java技术日志 微信订阅号
java多线程框架 netty,JavaSocket编程之Netty框架线程模型相关推荐
- JavaSocket编程之Netty框架线程模型
1.Netty概述 Netty是一个由JBoss提供的高效的Java NIO client-server(客户端-服务器)开发框架,使用Netty可以快速开发网络应用.Netty提供了一种新的方式来使 ...
- Java多线程系列--“JUC原子类”01之 框架
2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...
- cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用
原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...
- 网络编程之Netty(网络通信框架)的基础篇
网络编程 Netty的介绍及应用场景 Netty的介绍 Netty的应用场景 I/O模型 I/O模型基本说明 BIO.NIO.AIO适用场景分析 Java BIO Java BIO基本介绍 Java ...
- Netty实战七之EventLoop和线程模型
简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提 ...
- Java多线程笔记(零):进程、线程与通用概念
前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...
- 并发编程之二:线程创建方法、运行原理、常见方法(sleep,join,interrupt,park,守护线程等)
线程创建方法.运行原理.常见方法 线程的创建方法 继承Thread 实现Runnable FutureTask 线程的运行原理 栈与栈帧 线程运行情况 线程的上下文切换(Thread Context ...
- Java网络编程之MINA框架(1)
1.MINA: 一个简洁易用的基于TCP/IP通信的JAVA框架 2.下载地址: http://mina.apache.org/downloads-mina_2_0.html 3.至少需要: (在下载 ...
- 并发编程之Disruptor框架介绍和高阶运用
1. Disruptor是什么 1.1 技术背景 LMAX是在英国注册并受到FCA监管(监管号码为509778)的外汇黄金交易所, LMAX架构是LMAX内部研发并应用到交易系统的一种技术.它 ...
- java并发编程_Java并发编程之 synchronized
大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...
最新文章
- numpy比较运算符和其对应的通用函数
- jvm垃圾收集器的发展史及回收算法
- SAP gateway处理multiple key的逻辑
- python compare excel_python简单操作excle的方法
- oracle导出报错04063,Oracle EXP导出报错的解决方法
- Vue 项目 Element-ui CDN引入后体积不变或变大的问题
- 2021考研——复习规划(数学篇)
- CCYYMMDD时间格式
- 人教版五年级下册计算机试题答案,人教版五年级下册语文试卷
- Vmware安装CensOS6.4
- 随机码生成器[10位字母+数字]
- 【深度学习】 为Tesla K40c(显卡算力小于3.5)安装pytorch(要求显卡算力3.7以上)笔记
- JVM面试题附带答案
- 福建力得温控器_福建力得干变温控器LD-B10-10D、LD-B10-10F、LD-B10-10E系列高精度变压器温度控制器...
- 都匀三中2021高考成绩查询,都匀高考语文指南
- Html 分页自动控制、分页自动生成、分页数量可控制
- 使用RANSAC的鲁棒TDOA Chan定位算法
- 硬盘安装Debian7(Wheezy)以及初级配置
- 【Opencv基础学习】 VideoWriter打开本地摄像头并保存mp4格式视频
- Pytorch快速计算余弦相似性矩阵