【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
Netty强大特性之Native transports技术原理分析
- 背景介绍
- JNI概念介绍
- 不同平台的JNI实现
- 使用Native transports库
- Maven的分类器(Classifier)
- 使用Linux native transport
- 使用MacOS/BSD native transport库
- 构建native transport库
- Linux版本要求
- MacOS/BSD版本要求
- 总结归纳
背景介绍
当涉及到网络通信和高性能的Java应用程序时,Netty是一个强大的框架。它提供了许多功能和组件,其中之一是JNI传输。JNI传输是Netty的一个特性,它为特定平台提供了高效的网络传输。
在本文中,我们将深入探讨Netty提供的特定平台的JNI传输功能,分析其优势和适用场景。我们将介绍每个特定平台的JNI传输,并讨论其性能、可靠性和可扩展性。通过了解这些特定平台的JNI传输,您将能够更好地选择和配置适合您应用程序需求的网络传输方式,以实现最佳的性能和可靠性。
JNI概念介绍
JNI(Java Native Interface)是Java平台的一种机制,允许Java代码与本地代码(如C或C++)进行交互。Netty利用JNI传输来提供对特定平台的底层网络传输的支持。
通过JNI传输,Netty可以直接与操作系统的网络栈进行交互,绕过了Java虚拟机的网络层,从而提供了更高的性能和更低的延迟。这对于需要处理大量并发连接和高吞吐量的应用程序来说尤为重要。
不同平台的JNI实现
Netty提供了一些特定平台的JNI传输,这些传输针对不同的操作系统和网络栈进行了优化。通过使用这些特定平台的JNI传输,开发人员可以充分利用底层操作系统和硬件的优势,从而实现更高效的网络通信。

Netty提供了针对特定平台的JNI传输,包括Linux(自4.0.16版本开始)和MacOS/BSD(自4.1.11版本开始)。与基于NIO的传输相比,这些JNI传输在特定平台上增加了更多的功能,并且产生的垃圾更少,性能普遍提高,主要集中在以下两点:
- 利用了底层操作系统的特性和优化,以提供更高效的网络传输。
- 减少产生的垃圾,从而提高应用程序的效率和可靠性。
通过使用Netty提供的特定平台的JNI传输,开发人员可以充分利用底层操作系统的优势,以获得更好的性能和更少的资源消耗,这对于需要处理大量并发连接和高吞吐量的应用程序来说尤为重要。
使用Native transports库
Netty扩展传输库必须为依赖关系指定适当的分类器,以确保包含相应的本地库。当项目依赖于包含本地库(Native Library)的第三方库时,为了确保项目能够正确地使用这些本地库,必须为依赖关系指定适当的分类器(Classifier)。
Maven的分类器(Classifier)
分类器(Classifier)是用于区分不同构建版本的标识符,它可以用来指定包含本地库的特定构建版本,主要集中于
以下三个因素和范围。

- 操作系统和架构:区分不同操作系统和架构的构建版本。
- 构建类型:区分不同构建类型的构建版本。例如,可以使用release表示发布版本,debug表示调试版本。
- 资源类型:分类器可以用于区分不同类型的资源文件。例如,可以使用sources表示源代码文件,javadoc表示Java文档文件。
Maven的分类器(Classifier)常见操作系统架构分类

如果不为依赖关系指定适当的分类器,或者选择了错误的分类器,可能会导致项目无法正常运行或无法找到所需的本地库。因此,为了确保项目能够正确地使用依赖的本地库,必须注意为依赖关系指定适当的分类器。
使用Linux native transport
由于native transport与 NIO 传输兼容,因此只需进行以下搜索和替换操作即可:

在构建工具的配置文件中,可以通过在依赖项的声明中指定分类器来实现。例如,在Maven的pom.xml文件中,可以使用元素来指定分类器,构建系统中将 netty-transport-native-epoll 作为依赖项:
<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-epoll</artifactId><version>${project.version}</version><classifier>linux-x86_64</classifier></dependency>...</dependencies>
在上面配置,分类器是 linux-x86_64,这意味着依赖关系中包含的本地二进制文件是为Linux编译的,运行在 64 位 x86 CPU 上。其他 CPU 架构和某些特定的 Linux 发行版将需要不同的分类器。
注意:Linux 官方构建版都是根据 GLIBC 链接的。这意味着使用 Musl 作为 libc 实现的操作系统不支持 Netty 本地传输的官方构建。如果想在不支持的 CPU 架构或 libc 实现上使用 Netty 本地传输程序,则需要自行构建。
使用MacOS/BSD native transport库
由于native transport与 NIO 传输兼容,因此只需执行以下搜索和替换操作即可:

由于本地传输不是 Netty 核心的一部分,因此您需要在 Maven pom.xml 中将 netty-transport-native-kqueue 作为依赖项:
<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-kqueue</artifactId><version>${project.version}</version><classifier>osx-x86_64</classifier></dependency>...</dependencies>
构建native transport库
如果您已经有了native transport的JAR 文件,就不需要再自行构建本地传输系统了,因为 JAR 文件中已经包含了必要的共享库文件(如 .so、.dll、.dynlib),它们会被自动加载。
Linux版本要求
需要使用内核为 2.6 或更高版本的 64 位 Linux。还请安装所需的工具和库:
# RHEL/CentOS/Fedora:
sudo yum install autoconf automake libtool make tar \glibc-devel \libgcc.i686 glibc-devel.i686
# Debian/Ubuntu:
sudo apt-get install autoconf automake libtool make tar \gcc
MacOS/BSD版本要求
需要使用 MacOS 10.12 或更高版本。还请安装所需的工具和库:
brew install autoconf automake libtool
总结归纳
Netty提供的特定平台的JNI传输在Linux和MacOS/BSD上增加了更多的功能,并且通过减少垃圾的产生来提高性能。开发人员可以根据特定平台的需求选择合适的传输方式,以获得更好的性能和可靠性。
相关文章:
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
Netty强大特性之Native transports技术原理分析 背景介绍JNI概念介绍不同平台的JNI实现 使用Native transports库Maven的分类器(Classifier)使用Linux native transport使用MacOS/BSD native transport库构建native transport库Linux版本要求MacOS/BSD版…...
1-1 动手学深度学习v2-线性回归-笔记
简化核心模型 假设1: 影响房价的关键因素是卧室个数,卫生间个数和居住面积,记为 x 1 x_{1} x1, x 2 x_{2} x2, x 3 x_{3} x3假设2: 成交价是关键因素的加权和 y w 1 x 1 w 2 x 2 w 3 x 3 b yw_{1}x_{1}w_{2}x_{2}w_{3…...
算法每日一题: 使用循环数组所有元素相等的最少秒数 | 哈希
大家好,我是星恒,今天给大家带来的是一道需要感觉规律的题目,只要读懂题目中的规律,就可以做出来了 这道题用到了哈希,还有一个关键点比较类似循环队列 题目:leetcode 2808 给你一个下标从 0 开始长度为 n…...
canvas实现涂鸦画板功能
查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…...
6-3、T型加减速单片机程序【51单片机+L298N步进电机系列教程】
↑↑↑点击上方【目录】,查看本系列全部文章 摘要:根据前两节内容,已完成所有计算工作,本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知,T型加减速的关键内容是运动类型的判断以及定时…...
Flutter组件 StatefulWidget、StatelessWidget 可继承写法
前言 学过Java的同学,应该都知道面向对象语言的三大特征,封装、继承、多态; Dart也是面向对象的语言,但是在Flutter中的很多组件都被下划线 _ 标记为私有,导致无法继承,本文将介绍一种非私有的创建组件写…...
skywalking链路追踪
skywalking 1.简介1.1 skywalking介绍1.2 链路追踪框架对比1.3 Skywalking架构 2 环境构建2.1 windows环境2.1.1 启动skywalking服务和UI界面2.1.2 在IDEA启动项目中使用Skywalking2.1.3 skywalking持久化 2.2 linux环境 1.简介 微服务架构已经是一个很通用的系统架构…...
如何在苹果Mac上进行分屏,多任务处理?
Apple 在 macOS Catalina 中引入了 Split View,让您可以同时查看两个应用程序。如果同时处理多个应用程序,但在它们之间切换时感到沮丧,小编教给大家在 Macbook Pro/Air 或 iMac 上使用分屏功能流畅地进行多任务处理。 注意:您可…...
【Java EE】----Spring框架创建和使用
1.Spring框架创建 创建一个maven项目 添加Spring框架支持 <dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></depende…...
UE4 C++ 静态加载类和资源
静态加载类和资源:指在编译时加载,并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…...
洛谷C++简单题小练习day9—[AHOI2017]寻找探监点
day9--[AHOI2017]寻找探监点--2.7 习题概述 题目描述 一个nn 的网格图(标号由 1,1 开始)上有 m 个探测器,每个探测器有个探测半径 r ,问这 nn 个点中有多少个点能被探测到。 输入格式 第一行 3 个整数 n,m,r。 接下来 m 行&…...
JVM双亲委派机制
双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载…...
思科模拟器实验合集
目 录 实验一 常用网络命令的使用.................................... 1 实验二 双绞线制作.................................................. 12 实验三 网络模拟软件.............................................. 15 实验四 交换机基本配置..................…...
18.AUTOSAR 网络管理系统(一)
目录 1.为什么需要整车网络管理 2.本地唤醒和网络唤醒 3.小结 1.为什么需要整车网络管理 在描述AUTOSAR网络管理细节前,大家可以思考几个问题: 1.网络管理为整车系统提供了什么样的服务? 2.整车网络视角看,每个ECU的上下电是…...
802.11 MAC帧介绍
控制帧 RTS(Request To Send):用于申请无线媒介的使用时间CTS(Clear To Send):用于回复RTS帧ACK:对MAC帧的肯定确认PS-POLL:STA用于从AP中获取因省电模式而缓存的数据,只…...
【高阶数据结构】B-树详解
文章目录 1. 常见的搜索结构2. 问题提出使用平衡二叉树搜索树的缺陷使用哈希表的缺陷 3. B-树的概念4. B-树的插入分析插入过程分析插入过程总结 5. B-树的代码实现5.1 B-树的结点设计5.2 B-树的查找5.3 B-树的插入实现InsertKey插入和分裂测试 6. B-树的删除(思想&…...
elementui常用组件-个人版(间断更新)
Dialog 对话框 el-dialog <el-dialogtitle"提示":visible.sync"dialogVisible"width"30%":before-close"handleClose"><span>这是一段信息</span><span slot"footer" class"dialog-footer"…...
无人机在化工消防救援中的应用,消防无人机应用场景分析
火灾对社会环境具有较大影响,因此需要重视消防灭火救援工作,注重现代化技术的运用,将无人机应用到救援过程并保障其应用质量。无人机是一项重要技术,便于消防灭火救援操作,使救援过程灵活展开,排除不利影响…...
java设计模式- 建造者模式
一 需求以及实现方式 1.1 需求描述 我们要创建一个表示汽车的复杂对象,汽车包含发动机、轮胎和座椅等部分。用传统方式创建,代码如下 1.2 传统实现方式 1.抽象类 public abstract class BuildCarAbstaract {//引擎public abstract void buildEng…...
【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(下)
目录 1 -> 再谈构造函数1.1 -> 构造函数体赋值1.2 -> 初始化列表1.3 -> explicit关键字 2 -> static成员2.1 -> 概念2.2 -> 特性 3 -> 友元3.1 -> 友元函数3.2 -> 友元类 4 -> 内部类5 -> 匿名对象6 -> 拷贝对象时的一些编译器优化 1 -…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
