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

简介: 当涉及到网络通信和高性能的Java应用程序时,Netty是一个强大的框架。它提供了许多功能和组件,其中之一是JNI传输。JNI传输是Netty的一个特性,它为特定平台提供了高效的网络传输。在本文中,我们将深入探讨Netty提供的特定平台的JNI传输功能,分析其优势和适用场景。我们将介绍每个特定平台的JNI传输,并讨论其性能、可靠性和可扩展性。通过了解这些特定平台的JNI传输,您将能够更好地选择和配置适合您应用程序需求的网络传输方式,以实现最佳的性能和可靠性。

背景介绍

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

相关文章
|
4天前
Netty实战: HTTP文件列表服务器
Netty实战: HTTP文件列表服务器
24 0
|
4天前
|
网络协议 Java 测试技术
阿里内部Netty实战小册,值得拥有
Netty 是一个高性能的 Java 网络通信框架,简化了网络编程并涵盖了最新的Web技术。它提供了一种抽象,降低了底层复杂性,使得更多开发者能接触网络编程。Netty 因其易用性、高效性和广泛的应用场景受到推崇,适合互联网行业从业者学习,有助于理解和开发基于Netty的系统。免费的《Netty实战小册》详细介绍了Netty的各个方面,包括概念、架构、编解码器、网络协议和实际案例,帮助读者深入理解和应用Netty。如需完整版小册,可点击链接获取。
阿里内部Netty实战小册,值得拥有
|
4天前
|
NoSQL Redis
Netty实战:模拟Redis的客户端
Netty实战:模拟Redis的客户端
18 0
|
4天前
|
负载均衡 Java 调度
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(Dispatcher和EventListener)(下)
经过阅读《【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)》,相信您已经对网络通信框架的网络通信层的实现原理和协议模型有了一定的认识和理解。
43 0
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(Dispatcher和EventListener)(下)
|
8月前
|
监控 Java Linux
由浅入深Netty基础知识NIO网络编程1
由浅入深Netty基础知识NIO网络编程
43 0
|
8月前
|
缓存 安全 Java
由浅入深Netty基础知识NIO三大组件原理实战 2
由浅入深Netty基础知识NIO三大组件原理实战
48 0
|
8月前
|
Java
由浅入深Netty基础知识NIO三大组件原理实战 1
由浅入深Netty基础知识NIO三大组件原理实战
62 0
|
4天前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
4天前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
8月前
|
存储 Java Docker
由浅入深Netty基础知识NIO网络编程 2
由浅入深Netty基础知识NIO网络编程
48 0