为什么越来越多程序员使用Netty编程框架,这些原因你都知道吗?

【Netty简单入门】-为什么Netty人见人爱? 前言 最近在看ES源码,Netty贯穿在整个ES之中,想要看懂和更好的理解ES源码,必须首先对Netty有一定的认识和了解,所以简单总结了Netty的一些基本架构和认知, 后续再总结更加深入的Netty知识。 什么是Netty,为什么使用Netty Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。 作为一个异步NIO框架,Netty的所有IO操作都是异步... 阅读详情

在这里插入图片描述

一、传统的BIO编程

​ 网络编程的基本模型是Client/Server 模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的 IP 地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连
接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。
​ 在基于传统同步阻塞模型开发中,ServerSocket负责绑定 IP 地址,启动监听端口;Socket 负责发起连接操作。连接成功之后,双方通过输入和输出流进行同步阻塞式通信。

​ 首先,我们通过下图所示的通信模型图来熟悉下 BIO 的服务端通信模型:采用 BIO 通信模型的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这就是典型的一请求一应答通信模型

image

​ 该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈 1:1 的正比关系,由于线程是 Java 虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

二、伪异步的I/O编程

​ 为了解决同步阻塞 I/O 面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数 M:线程池最大线程数 N 的比例关系,其中 M 可以远远大于 N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。

​ 当有新的客户端接入的时候,将客户端的Socket封装成一个 Task(该任务实现 java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK 的线程池维护一个消息队列和 N 个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

image

​ 伪异步 I/O 实际上仅仅只是对之前 I/O 线程模型的一个简单优化,它无法从根本上解决同步 I/O 导致的通信线程阻塞问题。下面我们就简单分析下如果通信对方返回应答时间过长,会引起的级联故障。

  1. 服务端处理缓慢,返回应答消息耗费60s,平时只需要10ms。

  2. 采用伪异步I/O的线程正在读取故障服务节点的响应,由于读取输入流是阻塞的,因此,它将会被同步阻塞60s。

  3. 假如所有的可用线程都被故障服务器阻塞,那后续所有的I/O消息都将在队列中排队。

  4. 由于线程池采用阻塞队列实现,当队列积满之后,后续入队列的操作将被阻塞。

  5. 由于前端只有一个Accptor线程接收客户端接入,它被阻塞在线程池的同步阻塞队列之后,新的客户端请求消息将被拒绝,客户端会发生大量的连接超时。

  6. 由于几乎所有的连接都超时,调用者会认为系统已经崩溃,无法接收新的请求消息。

三、NIO编程

​ NIO即New I/O,即较java传统支持的I/O是新增的非阻塞I/O。也被称为Non-block I/O。

​ 与 Socket类和 ServerSocket 类相对应,NIO 也提供了 SocketChannel 和ServerSocketChannel两种不同的套接字通道实现。这两种新增的通道都支持阻塞和非阻塞两种模式。阻塞模式使用非常简单,但是性能和可靠性都不好,非阻塞模式则正好相反。开发人员一般可以根据自己的需要来选择合适的模式,一般来说,低负载、低并发的应用程序可以选择同步阻塞 I/O 以降低编程复杂度,但是对于高负载、高并发的网络应用,需要使用 NIO 的非阻塞模式进行开发。

四、AIO编程

NIO2.0 引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果:

  • 通过java.util.concurrent.Future类来表示异步操作的结果;

  • 在执行异步操作的时候传入一个java.nio.channels;

  • CompletionHandler接口的实现类作为操作完成的回调。

NIO2.0 的异步套接字通道是真正的异步非阻塞 I/O,它对应UNIX网络编程中的事件驱动 I/O(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了 NIO 的编程模型。

五、I/O模型对比

image

六、主流NIO框架

​ 目前,业界主流的 NIO 框架主要有两款:Mina 和 Netty,两者都使用 Apache LICENSE-2.0 进行开源。不同之处是Mina 是 Apache 基金会的官方 NIO 框架,Netty 之前是 Jboss 的 NIO 框架,后来脱离 Jboss 独立申请了 netty.io 域名,与 Jboss 脱离关系,并对版本进行了重构,导致 API 无法向上兼容。

​ Mina 和 Netty 还 有 一 段 历 史 渊 源,Mina 最 初 版 本 的 架 构 师 是 Trustin Lee,后来,由于种种原因,Trustin Lee 离开了 Mina 社区加入到了 Netty 团队,重新设计并开发了 Netty。很多读者会发现Netty 中透着Mina 的影子,两个框架的架构理念也有很多相似之处,甚至一些代码都非常相似,原因就在这里。

​ 目前,Mina和 Netty 的应用已经非常广泛,很多开源框架都使用两者做底层的 NIO 框架,例如 Hadoop的通信组件Avro使用 Netty做底层的通信框架,Openfire则使用 Mina做底层通信框架,相比于 Mina,Netty社区目前更活跃,版本应用范围也更广。

七、为什么学习Netty

7.1 不选择Java原生NIO的原因

  1. NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

  2. 需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。

  3. 可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐的工作量和难度都非常大

7.2 选择Netty的理由

  • API使用简单,开发门槛低;

  • 功能强大,预置了多种编解码功能,支持多种主流协议;

  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;

  • 性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;

  • 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;

  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;

  • 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。

八、Netty开发环境搭建

8.1 Netty 的官网

Netty: Home

8.2 Maven仓库地址

https://mvnrepository.com/artifact/io.netty/netty-all

8.3 Maven依赖

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.66.Final</version>
</dependency>

8.4 Gradle依赖

// https://mvnrepository.com/artifact/io.netty/netty-all
implementation group: 'io.netty', name: 'netty-all', version: '4.1.66.Final

分类:java
标签:Netty

最新2021整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:484138291

在这里插入图片描述

Netty :Netty介绍 & 实现简易多人聊天室 Netty :Netty介绍 & 实现简易多人聊天室 博主在去年二月份就介绍了Java原生网络编程API,并用它们实现了多种I/O模型的简易多人聊天室: Java网络编程-Socket编程初涉一(简易客户端-服务器) Java网络编程-Socket编程初涉二(基于BIO模型的简易多人聊天室) Java网络编程-Socket编程初涉三(伪异步I/O模型的简易多人聊天室) Java网络编程-Socket编程初涉四(NIO模型的简易多人聊天室) Java网络编程-Socket编程初涉五 阅读详情

相关推荐

Netty札记-为什么要学习Netty

在学习Netty之前,有必要了解下我们为什么要学习Netty。 什么是Netty Netty User guide for 4.x中这样介绍 Netty是一个提供异步事件驱动的网络应用框架,是一个用以快速开发高性能、可扩展协议的服务器和客户端的工具。 换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Net

潘威威的博客 5466

Netty火热平时却接触不多?1515页Netty学习进阶笔记真香

Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目。Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO 程序。Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO 程序。Netty 主要针对在 TCP 协议下,面向 Clients 端的高并发应用,或者Peer-to-Peer 场景下的大量数据持续传输的应用。

知识分享官 485

Netty多通道多对话管理

这里推荐使用观察者模式(事件驱动)搭建多通道之间的交互,该模式的核心思想是基于事件和事件监听器的机制,当特定事件发生时,系统会通知已注册的监听器,并由它们来处理事件。这种方式使得程序可以更加灵活地响应用户的操作和系统的状态变化。有两种实现方式:使用ChannelId、使用ChannelHandlerContext的属性Attribute。使用ThreadLocal存储用户数据,当出现线程切换的时候,用户数据丢失。

qq_44460210的博客 1799

通俗地讲,Netty 能做什么?

前言:tomcat一度是web容器的标准,但是tomcat的并发量却只有200-400之间,即使现在有了aio模式,也没有提升太多。 所以现在大部分都是使用netty作为高性能服务器框架,在dubbo,vert.x,gateway等等开源项目中都使用了,那么netty为什么深受喜爱?下文将带你寻找答案 目录 (1) IO模型 (2) zero-copy (3) 堆外内存 (4) 高性能对象池 阅读netty会发现netty对于java有着很多改进,并适配了不同版本,不用升jdk版本就实现了相关j

分享Java技术知识,共同成长进步! 1180

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

安装oracle 19c 报错INS-06006 INS-44000 INS-32070

数据库版本oracle 19c 操作系统版本:centos7.8 安装oracle19c RAC 配置互信的时候setup显示成功,点test的时候报错INS-44000,继续点yes 报错INS-32070,继续往下点 报错INS-06006 处理过程 1.手动ssh node date 全部成功说明互信时没有问题的 2.查mos 文档ID 2555697.1 如果OpenSSH升级到8.x会有这个问题 MOS上的解决办法 #ssh -V OpenSSH_8.0p1, OpenSSL 1.0.2r 2

cqszpx的博客 1528

netty入门小程序

Netty的特性 设计统一的API,适用于不同的协议(阻塞和非阻塞)基于灵活、可扩展的事件驱动模型高度可定制的线程模型可靠的无连接数据Socket支持(UDP) 性能更好的吞吐量,低延迟更省资源尽量减少不必要的内存拷贝 安全完整的SSL/TLS和STARTTLS的支持能在Applet与Android的限制环境运行良好 健壮性不再因过...

weixin_33933118的博客 480

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4232

Netty的介绍以及应用场景

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

JeremyIverson的博客 1593

从Datasheet到可用的Verilog模块:手把手教你为N25Q128 SPI Flash写状态机驱动

本文详细介绍了如何从Datasheet到实现可用的Verilog模块,手把手教你为N25Q128 SPI Flash编写状态机驱动。文章涵盖SPI Flash的核心工作机制、数据手册解析方法、Verilog状态机设计实践以及调试与性能优化技巧,特别适合FPGA开发者和硬件设计工程师参考。

weixin_30596023的博客 177

【Out-of-Distribution Detection】Evidential Deep Learning in NeurIPS 2018 个人理解

核心思想是将分类器的概率输出视为一个狄利克雷分布(Dirichlet Distribution)并替换,之后引入两个损失分别负责保证预测结果准确性和提升被错误分类的样本的不确定性。

研究兴趣:开放集识别、开放世界识别、新类发现、增量学习、少样本学习 2436

什么时候会用到netty开发服务器?

定义 Netty是异步的 事件驱动的基于NIO实现的开源框架,用以快速轻松的实现高性能、高可靠性的网络客户端和服务器端最基础的通信组件,通俗的讲:Netty是Jboss开发做的JAR包,很好的封装了Socket,处理网络通信的一个开源通信框架。 一、Netty的特性 1)设计 统一的API,适用于不同的协议(阻塞和非阻塞) 基于灵活、可扩展的事件驱动模型 高度可定制的线程模型 可靠的无连接数据So...

xihuanyuye的博客 2264

C++面向对象编程-继承与派生练习题

2、共同派生类 3、人员类Person的派生(虚基类的使用)

编程小鹏的博客 1193

Netty 是什么,我们为什么使用 Netty

为什么要学习Netty: 在java的网络编程方面,最开始的BIO 到现在被广泛使用的NIO,它们都能完成网络编程的工作,但是使用原生的java API去完成网络编程,往往非常困难。连接管理、消息分割、数据编解码,还有对应应用层协议的实现,这些对开发人员的要求非常高。所以使用和学习Netty这样的网络框架是非常有必要的。 Netty是什么: Netty是对 Java NIO 的进一步封装,实现了众多的协议,并且提供了更加易用的API来帮助我们进行网络编程。本篇博客对Netty的概念进行了详细说名,并且介绍

不会骑摩托的程序员不是好的摄影师 4612

apple游客下单逆向分析

Apple游客下单Cookies注册激活流程逆向分析与算法实现

吴秋霖的博客 2002

Tesla v100 4张显卡组装机安装vllm和ollama在Ubuntu系统上的安装---AI大模型系统从零开始0032

本文提供Ubuntu22.04系统下vLLM的完整安装指南,适配4×32G Tesla显卡的单机4卡张量并行部署。教程包含:1)硬件要求(Ubuntu22.04、NVIDIA驱动≥535、CUDA12.1+);2)NVIDIA驱动自动安装方法;3)Python3.10虚拟环境配置;4)vLLM官方预编译包一键安装;5)单机4卡启动Qwen3.6-27B模型的完整参数说明(含FP8量化、多进程并行等关键配置)。文末附分布式部署的Ray集群方案参考链接,适用于多机8卡场景。

添柴程序猿的专栏 187

什么是Netty?为什么使用Netty?Netty有哪些组件?

文章目录什么是Netty为什么使用Netty应用场景Netty 的高性能表现Netty核心组件Bootstrap和ServerBootstrapEventLoop和EventLoopGroupChannel通道selectorChannelHandler出站ChannelOutboundHandler接口入站ChannelInboundHandler接口ChannelPipelineChannelHandlerContext 什么是Netty 1、Netty 是一个 基于 NIO 的 client-ser.

致力于不留技术债务cuizb.top 5157

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Netty是什么,为什么要使用Netty?

最近,也不知道什么原因,经常有粉丝问我关于Netty的问题。难道是大厂面试更卷了,开始关注更加底层的框架了?先不深究什么原因了,今天,我给大家分享一下什么是Netty,它能解决什么问题?另外,我花了1个多星期,准备了一份10W字的面试题解析配套文档,想获取的小伙伴可以从我的个人煮叶简介中找到。一句话总结,Netty就是一个基于Java NIO封装的高性能的网络通信框架。我从以下三个方面给大家归纳一下: 1、Netty提供了比NIO更简单易用的API,我们可以利用这些封装好的API快速开发自己的网络通信程序。

Tom弹架构 3739

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Netty介绍(一)————为什么使用Netty

Netty的简单介绍Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty 可以快速开发网络应用,例如服务器和客户 端协议。 Netty 提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。 Netty 的内部实现时很复杂的,但是 Netty 提供了简单易用的 api 从网络处理代码中解耦业务逻辑。 Netty 是完全基 于 N

lkj41110的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

为什么使用Netty

1、各种I/O模型               我们知道java的I/O模型一共有四种,分别是:传统的BIO,伪异步I/O,NIO和AIO。为了澄清概念和分清区别,我们还是先简单的介绍一下他们的概念,然后再去比较优劣。以及探讨我们为什么使用netty。 1.1 BIO        BIO,即Blocking I/O。网络编程的基本模型是Client/Server 模型,也就是两个进程之间进...

菜鸟不会飞 1946

SpringBoot使用netty

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP...

阿靖的博客 3万+

netty的使用场景,线程模型以及如何在springboot中使用netty?

文章目录1. 为什么使用netty? 1. 为什么使用netty?                  Netty是基于NIO来实现的(点击了解NIO),由于NIO的类库和 API 繁杂, 使用非常麻烦,需要熟练掌握Selector、 ServerSocketChannel、 SocketChannel、ByteBuffer等。且开发工作量和难度都非

qq_1149513559的博客 3342

【Netty】Netty的使用和常用组件详解

这篇文章主要介绍了Java网络应用框架Netty的基础知识和用法。Netty是基于Java NIO的异步事件驱动网络应用框架,提供了简单易用的API。文章解释了为何Netty选择NIO而不是AIO,主要是由于在Linux系统上,AIO并无显著性能优势。然后,文章还介绍了如何编写第一个Netty程序,包括服务端和客户端的创建和通信实现。最后,文章详细描述了Netty中的重要组件,如EventLoop、Channel和ChannelHandler等,并解释了它们各自的作用。有助于读者快速上手Netty。

小七的博客 6182

为什么Java程序员一定要会Netty?

关于Netty嘛,现在大厂招聘时岗位需求都有一条说要求会用或者熟悉Netty,但我敢说,绝大部分人对于Netty这个技术栈平时的接触肯定是不多的;大家只知道它是一个高性能、异步事件驱动的NIO框架,却从来没有深入研究过;目前很多的开源框架都开始将底层的通信框架切换到Netty.要想成为一位高级Java工程师,Netty将是你必须要踏过的坎!

weixin_50205273的博客 426

Netty为什么这么快

Netty 是一个高性能、异步事件驱动的NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果.

Admans的专栏 1526
上一篇: 关于服务连接器Servlet搞懂了吗?看完!你一定会有收获!
下一篇: 阿里架构师带你入门Springboot!三分钟学写“Hello,World”程序!
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值