写点什么

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

作者:洛神灬殇
  • 2024-02-08
    江苏
  • 本文字数:2268 字

    阅读完需:约 7 分钟

【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 作为依赖项:


<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 上增加了更多的功能,并且通过减少垃圾的产生来提高性能。开发人员可以根据特定平台的需求选择合适的传输方式,以获得更好的性能和可靠性。

发布于: 刚刚阅读数: 5
用户头像

洛神灬殇

关注

🏆 InfoQ写作平台-签约作者 🏆 2020-03-25 加入

👑 后端技术架构师,前优酷资深工程师 📕 个人著作《深入浅出Java虚拟机—JVM原理与实战》 💻 10年开发经验,参与过多个大型互联网项目,定期分享技术干货和项目经验

评论

发布
暂无评论
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战_Java_洛神灬殇_InfoQ写作社区