目录
Reactor Netty是什么?
Netty是一个基于Java NIO(New I/O)的异步事件驱动网络应用框架。它提供了一个高度可定制的客户端和服务器端编程框架,用于构建各种网络应用,特别是网络服务器。Netty的设计目标是帮助开发者构建高性能、高可靠性和可维护性的网络应用。
Netty提供了一套抽象的、易于使用的API,简化了网络应用的开发过程。它在底层的事件驱动模型上构建了一个高级的抽象层,使得开发者可以专注于业务逻辑的开发,而无需关注底层网络的复杂性。
适用于微服务架构,Reactor Netty提供背压就绪网络引擎HTTP(包括网页套接字),TCP和UDP。
Reactor Netty在Java 8上面运行。
(1)Reactive Streams v1.0.3
(2)Reactor Core v3.x
(3)Netty v4.1.x
为什么要使用Netty?
使用 Netty 的原因主要归结于其高性能、灵活性和强大的网络处理能力,尤其在需要处理高并发、大量数据传输的场景中。
Netty被广泛应用于各种网络应用领域,包括服务器端的高性能网络通信、分布式系统的通信、游戏服务器、实时通信系统、物联网等。它是一个非常成熟和受欢迎的网络应用框架,被许多知名的开源项目和企业所采用和推荐。
(1)高性能(NIO、事件驱动)
非阻塞的 I/O (NIO):Netty 基于 Java NIO 实现,能够通过少量线程处理大量的连接。使用多路复用机制,Netty 能够在单个线程中管理多个连接,减少了对线程的过度创建和切换,提升了性能。
事件驱动架构:Netty 采用事件驱动模型,通过 ChannelHandler 处理 I/O 事件,高效地处理大量的网络请求。
(2)高并发
Netty 非常适合处理高并发场景,能够轻松支持上万甚至更多的并发连接。它通过使用少量的工作线程和事件循环(EventLoop)模型,高效处理大规模的连接和数据传输。
(4)高扩展性
Netty 具有良好的扩展性,提供了丰富的钩子和扩展点。开发者可以通过实现自定义的 ChannelHandler 来扩展其功能,如处理业务逻辑、数据解析、异常处理等。
(5)内存优化
ByteBuf 内存管理:Netty 提供了高效的内存缓冲区管理方式(如: PooledByteBufAllocator),能够避免频繁的内存分配和垃圾回收,从而提升性能。它通过池化内存缓冲区的方式降低了垃圾回收的频率。
(6)丰富的协议支持
Netty 不仅支持基础的 TCP/UDP 协议,还支持常见的高层协议如 HTTP、WebSocket、SSL/TLS 等,甚至可以定制自己的协议。这使得 Netty 能够适应各种不同的应用场景。
(7)简单易用的 API
Netty 提供了高度抽象的 API,简化了复杂的网络编程任务。开发者无需深入理解底层的 Java NIO 操作,使用 Netty 的 API 即可轻松构建高性能的网络应用。
(8)安全性
Netty提供了强大的安全性支持,包括SSL/TLS和加密解密等功能,可以保护网络通信的安全性和机密性。
(9)成熟和稳定
Netty 是一个经过长时间打磨的网络框架,已经被大量大型项目和高流量场景验证过的稳定性和可靠性。很多知名企业和开源项目(如 Hadoop、Elasticsearch、Kafka)都在使用 Netty 作为网络通信的基础。
(10)跨平台
Netty 基于 Java 构建,具有跨平台特性,能够在各种操作系统(如 Windows、Linux、MacOS)上运行,极大地增强了其通用性。
Netty典型应用场景
(1)高并发服务器
如:即时通讯系统、在线游戏服务器、消息推送系统等。
(2)代理服务器
反向代理、负载均衡等。
(3)数据传输服务
大数据集群中的数据传输模块,如 Kafka 和 Hadoop 中的网络通信模块。
总体来说,Netty 由于其性能、灵活性以及强大的协议支持,使得它成为构建高并发、高性能网络应用的首选框架。
BOM和版本控制
Reactor Netty是Project Reactor BOM(自Aluminium发布系列以来)的一部分。这个策划列表将旨在很好地协同工作的工件分组,尽管这些工件中可能存在不同的版本控制方案,但仍提供相关版本。
工程遵循版本控制方案:MAJOR.MINOR.PATCH-QUALIFIER,而BOM使用CalVer启发的方案进行版本控制:YYYY.MINOR.PATCH-QUALIFIER ==> 2020.0.14
版本标识 | 描述 |
---|---|
YYYY | 给定发布周期中第一个GA(正式发)发布的年份(例如 1.0.0 代表 1.0.x) |
MAJOR | 一个从0开始的数字,随着每个新的发布周期递增。代表当前一代的Reactor,每一代都会给项目的结构带来根本性的变化(重要迁移) ①:在项目的情况下,它通常反映更广泛的变化,可以表明适度的迁移工作 ②:在BOM的情况下,允许区分发布周期,以防两个在同一年首次发布 |
PATCH | 是一个从0开始的数字,随着每个服务版本递增 |
-QUALIFIER | 是一个文本限定符,在GA版本的情况下被省略() |
-M1 ~ -M9 | 里程碑(预计每个服务版本不超过9个) |
-RC1 ~ -RC9 | 候选版本(预计每个服务版本不会超过9个) |
-SNAPSHOT | 快照 |
版本描述
(1)Beta:测试版本
(2)GA(General Availability):正式发布的版本
BOM版本管理
BOM总结:在项目顶层的POM文件中,可以看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号
dependencyManagement里只是声明依赖,并不实现引入;因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
历史版本说明:
在BOM使用版本序列方案进行版本控制,代号后跟限定符,并且限定符略有不同。
Aluminium-RELEASE(第一个GA版本,现在类似 YYYY.0.0)
Bismuth-M1、Californium-SR1(服务版本现在类似于 YYYY.0.1)
Dysprosium-RC1、Dysprosium-BUILD-SNAPSHOT(在每个补丁之后,会回到相同的快照版本。类似于现在的YYYY.0.X-SNAPSHOT,所以每个补丁获得1个快照)