Java高阶必备之Netty基础原理

一位Java大牛结合自己的业务和平台多年来在Netty实践中积累的经验总结《Netty进阶之路:跟着案例学Netty》。 写在前面 Netty是当前业界应用最广泛的Java开源异步框架。Netty框架能显著降低异步开发的门槛,使开发人员聚焦业务逻辑,免于处理复杂的底层通信机制和线程模型,从而能够简单和快速地开发异步应用。时至今日,越来越多的国内公司开始使用Netty来构建应用,使用Netty的开发者也日益增加。 随着Netty应用的不断深入,大家在使用过程中也会遇到各种各样的问题。但是相比于Netty的火热,市面上有关于Netty的学习资源却很少。 于是有一位Java大牛结合自己的业务和平台多年来在Netty实践中积累的 阅读详情

0?wx_fmt=png

Netty是Java程序员通向高阶之路必须要过的门槛之一。干了几年的Java程序员发现业务开发似乎就是在SSH的世界里摸滚打爬的时候,会开始感到迷茫,难道程序员的日子就是如此枯燥么?深入使用一下Netty,另一个世界的大门就会开始打开。枯燥的编码会渐渐变得有趣,自主思考的能力也会开始加强。

Netty是建立在Java NIO基础之上最广泛使用的高性能网络框架。了解Netty之前,必须对NIO的概念有所了解。

NIO的意思是非阻塞IO,也就是说单个线程可以同时进行多个IO操作,而不会被任何IO操作阻塞住。同一个线程即能同时Accept网络套件字,又可以同时对套件字进行读写操作,然后还可以同时处理消息。

NIO基于事件机制,所有的IO操作都能抽象成一个事件。当新连接到来时,可以从内核中拿到ServerSocket的可读事件。当连接上的消息到来时,可以从内核中拿到Socket的读事件。当Socket中的缓冲区未满的时候,可以从内核中拿到Socket的可写事件。

当NIO线程从内核中拿到一个事件Event,就会开始使用相应的事件处理器EventHandler对这个事件进行处理。如果拿到ServerSocket可读事件,就会调用ServerSocket.accept获取一个新的Socket连接,然后将这个Socket连接加入到感兴趣的描述符列表中,如果拿到Socket可读事件就会开始调用Socket.read读取套件字的消息进行处理,处理完毕将返回结果序列化成一个字节数组,当Socket可以拿到可写事件时,说明套件字缓冲区未满,就拼命的将字节数组往Socket里灌,也就是调用Socket.write进行IO的写操作。

0?wx_fmt=jpeg

NIO从内核中拿事件的操作使用的是Selector.select函数调用,它对应操作系统界面的IO多路复用API。在现代操作系统里mac平台上对应的是kqueue模型,linux平台对应的是epoll模型,windows平台对应的是iocp模型。Java是一个跨平台的语言,JVM底层对操作系统的具体实现进行了抽象,统一向上层提供的是Selector系列API。用户只需要使用Selector提供的通用API来处理NIO相关功能即可,而无需关系底层具的操作系统API的差别了。

Selector可以理解为一个描述符对象[SocketChannel]列表,Selector通过调用操作系统API,传递一个描述符列表参数,然后就可以拿到内核提供的与所有的描述符相关的事件[Key]列表。

0?wx_fmt=png

上面提到的NIO线程是一个单线程,但是实际上它可以是一个线程池,线程池中的每个线程负责一部分描述符的读写操作。它也可以是两个线程池,一个线程池只用来处理ServerSocket描述符建立新连接,另一个线程池专门干Socket读写的事。

// 两个线程池
ServerBootstrap bootstrap1 = new ServerBootstrap();
NioEventLoopGroup acceptorGroup = new NioEventLoopGroup(1); // 包含一个线程
NioEventLoopGroup rwGroup = new NioEventLoopGroup(4); // 包含四个线程
bootstrap1.group(acceptorGroup, rwGroup).channel(NioServerSocketChannel.class);

// 共享一个线程池
ServerBootstrap bootstrap2 = new ServerBootstrap();
NioEventLoopGroup group = new NioEventLoopGroup(4);
bootstrap2.group(group).channel(NioServerSocketChannel.class);

Netty提供了良好的封装,可以让我们很方便的配置线程池的功用。代码中的NioEventLoopGroup代表的就是一个线程池,池中每个线程都是一个独立的NioEventLoop,即Nio事件循环。当acceptor线程池接收到一个新连接后会将这个连接通过队列发送到读写线程池继续进行处理。线程池分开的好处是当读写线程池繁忙的时候不影响acceptor接收新连接。

NIO的读写操作也是一系列复杂的过程。当NIO读事件发生时,线程使用read操作读取到的消息可能是不完整的,剩下的部分可能还要在接下来多次读事件发生后才能读到完整的一个消息对象字节数组。也可能read操作读取到的消息包含多个消息对象,最后剩下的部分又是一个不完整的消息,这就需要在每个描述符关联对象中保存中间半包的状态。消息和消息之间又有组合关系,比如HTTP POST消息包含HTTP Header和HTTP Body两个部分,而HTTP Body又可能因为太大而分解为多个HTTP Chunks进行传输,这就要求NIO的读写消息的设计包含结构层级。写操作也不是一个简单的write操作就了事了,写操作要考虑到内核为每个套件字分配的buffer大小,如果buffer不够了,write写进去的数组是不能完全写进去的,写不进去的buffer必须保留起来,等待下次写事件发生时,也就是buffer有空闲空间了,才可以将剩下的数据发送过去。

0?wx_fmt=jpeg

Netty将消息的读写抽象为pipeline消息管道,结构上有点类似于计算机网络分层结构。pipeline的每一层会对应一个Handler,以上一层输出的消息结构作为输入,输出新的消息结构作为下一层的输入。pipeline对象挂接在每一个Socket链路上。

EventLoopGroup group = new NioEventLoopGroup(2);
ServerBootstrap bootstrap = new ServerBootstrap();
RedisOutputEncoder encoder = new RedisOutputEncoder();
MessageProcessor processor = new MessageProcessor();
bootstrap.group(group)
 .channel(NioServerSocketChannel.class)
 .childHandler(new ChannelInitializer<SocketChannel>() {
	@Override
	public void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipe = ch.pipeline();
		pipe.addLast(new ReadTimeoutHandler(60));
		pipe.addLast(new RedisInputDecoder());
		pipe.addLast(encoder);
		pipe.addLast(processor);
	}});

bootstrap.option(ChannelOption.SO_BACKLOG, 100)
 .option(ChannelOption.SO_REUSEADDR, true)
 .childOption(ChannelOption.TCP_NODELAY, true)
 .childOption(ChannelOption.SO_KEEPALIVE, true)
 .bind("localhost", 6379)
 .sync();

代码中我们在pipeline里定义了四层Handler,第一个是处理ReadTimeout,当一个连接长达60s没有任何消息的情况下会向下一层输出一个读超时消息。第二层是一个Redis消息解码器,将Socket中的字节流转换成Redis命令对象,第三层是一个Redis消息编码器,将Redis输出对象转称字节流,第四层是消息处理器,用来逐个处理Redis命令逻辑,这里一般就是我们复杂的业务逻辑所在地,我们会在业务逻辑里最终给Socket回馈消息输出,这个消息输出又会走一遍pipeline的每一层,直到转换成字节流写到内核socket缓冲区中才算完事。

然后我们设置一些套件字的特殊属性,比如监听队列大小、读写缓冲警戒水位大小、是否延迟发送等,然后绑定监听指定端口,服务器就可以开始永无止尽地工作了。

0?wx_fmt=jpeg

阿里架构师强烈推荐《Netty、Redis、ZooKeeper高并发实战》文档,带你剖析底层原理 前言 移动时代、5G时代、物联网时代的大幕已经开启,它们对于高性能、高并发的开发知识和技术的要求,抬升了Java工程师的学习台阶和面试门门槛。 大公司的面试题从某个侧面映射出生产场景中对专项技术的要求。高并发的面试题以前基本是BAT等大公司的专利,现在几乎蔓延至与Java项目相关的整个行业。例如,与JavaNI0、Reactor模式、高性能通信、分布式锁、分布式ID、分布式缓存、高并发架构等技... 阅读详情

相关推荐

Netty实现原理浅析

Netty实现原理浅析 图文并茂显示 清晰易懂

java三大框架是什么

java三大框架是什么 Struts、Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案。但你是否知道,这些知名框架最初是怎样产生的?推荐课程:Java教程。 我们知道,传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使的程序结构分为几层,有负责前台展示的JSP、负责流程逻辑控制的Servlet以及负责数据封装的Javabean。但是这种结构仍然存在问题:如JSP页.

阿星君 1234

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

深入剖析 Netty 核心原理

Netty 是一个基于 Java NIO 技术的网络应用框架,它提供了一套简洁而强大的 API,用于构建高性能、可扩展的网络应用程序。Netty 具有异步非阻塞、事件驱动、高度可定制等特点,能够轻松应对高并发、大流量的网络通信场景。

持续分享有趣的技术干货 1089

bcftools实战指南:从VCF文件处理到变异分析全流程解析

在基因组数据分析中,VCF(Variant Call Format)文件是存储基因序列变异信息的标准格式,广泛应用于群体遗传学和生物信息学研究。其核心原理是通过结构化文本记录SNP、INDEL等变异位点的基因型、质量值和注释信息。掌握高效处理VCF文件的技术,对于提升变异检测、数据清洗和下游分析的工作流效率具有重要价值。在生物信息学工具生态中,bcftools作为处理VCF/BCF文件的瑞士军刀,通过模块化设计实现了数据查询、过滤、统计和格式转换等核心功能。其流式处理架构支持管道化操作,能有效应对海量基因组

weixin_29081703的博客 324

Blender入门教程-3D视图界面介绍

3D视图用于与3D场景交互,可用于各种目的,例如建模、动画、纹理绘制等。在关闭 启动画面 后,启动场景会显示在3D视口中(如果没有加载其他blend文件)。01 标题栏标题栏包含了基于当前 模式 的各种菜单和控制。

weixin_52345129的博客 2291

netty原理

Netty IO模型 java有三种IO模型 BIO,NIO,AIO 1. BIO 同步阻塞模型,一个客户端对应一个处理线程 main() { ServerSocket server = new ServerSocket(50000); while(true) { Socket client = server.accept(); //没有客户端连接会阻塞 handler(client); //通过socket读取client发来的数据 会阻塞读取 可以new

James201904的博客 3888

【数据集处理】中国地面气候资料日值数据集(V3.0)(含MATLAB全代码)

简介数据集数据处理

WW、forever的博客 1万+

Java高阶必备之Netty基础原理 

Java高阶必备之Netty基础原理 Netty是Java程序员通向高阶之路必须要过的门槛之一。干了几年的Java程序员发现业务开发似乎就是在SSH的世界里摸滚打爬的时候,会开始感到迷茫,难道程序员的日子就是如此枯燥么?深入使用一下Netty,另一个世界的大门就会开始打开。枯燥的编码会渐渐变得有趣,自主思考的能力也会开始加强。 Netty是建立在Java NIO基础之上最广泛使用的高性能网络框架。了解Netty之前,必须对NIO的概念有所了解。 NIO的意思是非阻塞IO,也就是说单个线程可以同时.

阿星君 213

YOLO11改进策略【独家融合改进】| RCSOSA + SPD + WFU

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。WFU模块通过小波变换的频率分解与跨尺度融合机制,解决了传统上采样过程中的混叠和细节丢失问题,实现了高效、高保真的面部细节重建。

Limiiiing的博客 453

【精细解读】xapp585(多通道LVDS接口ADC)

xapp585的参考设计有Verilog和VHDL两种源码。

FPGA艺术家的博客 533

Java 开发必备! I/O与Netty原理精讲

简介:I/O技术在系统设计、性能优化、中间件研发中的使用越来越重要,学习和掌握I/O相关技术已经不仅是一个Java攻城狮的加分技能,而是一个必备技能。本文将带你了解BIO/NIO/AIO的发展历程及实现原理,并介绍当前流行框架Netty的基本原理。一 Java I/O模型1 BIO(Blocking IO)BIO是同步阻塞模型,一个客户端连接对应一个处理线程。在BIO中,accept和read方法都是阻塞操作,如果没有连接请求,accept方法阻塞;如果无数据可读取,read方法阻塞。2 NIO(No

阿里云开发者 3214

中小企业办公网络配置综合实验华为设备(NAT+策略路由+OSPF+VLAN)

组网需求: 1、PC1、2、3、4均可以访问internet的lo0:8.8.8.8 2、PC1、PC4通过电信ISP访问internet;PC2、PC3通过联通ISP访问internet; 需求分析: 1、internet路由器模拟公网,8.8.8.8模拟公网IP;电信ISP、联通ISP路由器模拟电信和联通运营商;出口路由为企业出口路由器;这四个路由器直连链路之间运行ospf,配置动态路由,实现互通; 2、出口路由与三层交换直连链路运行ospf,动态同步路由信息; 3、出口路由器内网端口配..

A soul tortured by desire 7125

Netty基础必备知识,ByteBuffer和ByteBuf底层原理

本文章只讨论ByteBuffer和ByteBufjava堆外内存详解(又名直接内存)和ByteBuffer中文称为缓冲区,指的是从网络或者文件读写数据的时候,在他们中间多了个缓冲区,应用程序只需要对着缓冲区 进行读写即可;然后缓冲区在将数据复制到内核或者从内核读取数据;这种方式加快读写速度,减少了IO次数;小文件的读写用不用缓冲区速度都没有多大区别,但是当我们进行大文件进行读写的时候一般都会使用到缓冲区;读写效率会以倍数增长;这种方法相当于设置ByteBUffer的position值,这边将读取位置指向了。

叶新东老师的博客 1189

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JAVA工程师必备技能——JAVA基础

持续更新积累。

小小博客 1009

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《Netty Zookeeper Redis 高并发实战》图书目录

《Netty Zookeeper Redis 高并发实战》目录 高并发研习社群 : 疯狂创客圈 【博客园 总入口 】 简介 机械工业出版社出版,尼恩编著的《Netty Zookeeper Redis 高并发实战》一书, 从操作系统底层的IO原理入手,同时提供高性能开发的实战案例,是一本高并发Java编程应用基础图书。 本书共分为12章。 第1~5章为高并发基础,浅显易懂地剖析高并发IO的...

架构师尼恩 6402

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Netty基础——快速入门

一. Netty介绍和应用场景 1. Netty介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github上的独立项目。 Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用。 Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景。 2. Netty应用场景 2.1 互联网行业 互联

程序无言 885

client netty 主动发数据_Java 开发必备! I/O与Netty原理精讲

阿里妹导读:I/O技术在系统设计、性能优化、中间件研发中的使用越来越重要,学习和掌握I/O相关技术已经不仅是一个Java攻城狮的加分技能,而是一个必备技能。本文将带你了解BIO/NIO/AIO的发展历程及实现原理,并介绍当前流行框架Netty的基本原理。文末福利:孤尽独家解读《Java开发手册(嵩山版)》。一 Java I/O模型1 BIO(Blocking IO)BIO是同步阻塞模...

weixin_33293612的博客 125

netty服务运行一段时间无响应_Java 开发必备! I/O与Netty原理精讲

简介:I/O技术在系统设计、性能优化、中间件研发中的使用越来越重要,学习和掌握I/O相关技术已经不仅是一个Java攻城狮的加分技能,而是一个必备技能。本文将带你了解BIO/NIO/AIO的发展历程及实现原理,并介绍当前流行框架Netty的基本原理。一 Java I/O模型1 BIO(Blocking IO)BIO是同步阻塞模型,一个客户端连接对应一个处理线程。在BIO中,accept和read...

weixin_39604897的博客 825

Netty 应用与原理

更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验本篇示例代码仓库:learn-netty在 I/O 操作中有这么两组概念,其中同步/异步 要和线程中的同步线程/异步线程要区分开,这里指的是同步IO / 异步IO阻塞/非阻塞:同步/异步:常见的 IO 模型:BIO 是 blocking I/O 的简称,它是同步阻塞型 IO,其相关的类和接口在 java.io 下,简单来讲:编写一个简单的 BioServer: 对应来一个简单的 Client: 这种 IO 模型的弊端十分明显:

LYS00Q的博客 1162

书单丨Java架构师成长丛书,巩固基础蓄力进阶

“Java程序员如何提升自己”这其实是一个对每个人而言都至关重要的职业发展规划问题,准备充分的人生才有更多选择的机会。 今天博文菌带来3本咕泡学院Java架构师成长丛书,从 Spring 到 Netty 再到 Spring Cloud Alibaba 全面为你助力! Spring 在1996年,Java还只是一门新兴的、初出茅庐的编程语言。2004年3月24日,Spring正式发布。Spring的出现,恰如其名,开启了全世界Java程序员的春天。 Spring本身就应用了许多优雅的设计理念,...

博文视点(北京)官方博客 1100

Netty学习路线图 - 第一阶段:Java基础与网络编程基础

打好Java基础与网络编程基础是学习Netty的必经之路。在掌握了这些知识后,我们才能真正理解Netty的设计理念和实现机制,为后续深入学习Netty核心概念打下坚实基础。下一篇,我们将深入探讨Java NIO的核心概念与编程模型,敬请期待!作者:by.G如需转载,请注明出处。

doke99的博客 651
上一篇: 天下无难试之Redis面试刁难大全
下一篇: 如何优雅的关闭Go Channel【译】
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值