【Netty 技术专题】「原理分析系列」Netty 强大特性之 Native transports 扩展开发实战

背景介绍
当涉及到网络通信和高性能的 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 文件中,可以使用<classifier>元素来指定分类器,构建系统中将 netty-transport-native-epoll 作为依赖项:
在上面配置,分类器是 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 作为依赖项:
构建 native transport 库
如果您已经有了 native transport 的 JAR 文件,就不需要再自行构建本地传输系统了,因为 JAR 文件中已经包含了必要的共享库文件(如 .so、.dll、.dynlib),它们会被自动加载。
Linux 版本要求
需要使用内核为 2.6 或更高版本的 64 位 Linux。还请安装所需的工具和库:
MacOS/BSD 版本要求
需要使用 MacOS 10.12 或更高版本。还请安装所需的工具和库:
总结归纳
Netty 提供的特定平台的 JNI 传输在 Linux 和 MacOS/BSD 上增加了更多的功能,并且通过减少垃圾的产生来提高性能。开发人员可以根据特定平台的需求选择合适的传输方式,以获得更好的性能和可靠性。
版权声明: 本文为 InfoQ 作者【洛神灬殇】的原创文章。
原文链接:【http://xie.infoq.cn/article/288ef3f5aca7c2f08cdff68e4】。文章转载请联系作者。
评论