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

相关文章
Netty实战: HTTP文件列表服务器
Netty实战: HTTP文件列表服务器
259 0
|
NoSQL 前端开发 Java
Lettuce的特性和内部实现问题之Lettuce基于Netty框架实现的问题如何解决
Lettuce的特性和内部实现问题之Lettuce基于Netty框架实现的问题如何解决
313 0
|
7月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
498 0
|
网络协议 Java 测试技术
阿里内部Netty实战小册,值得拥有
Netty 是一个高性能的 Java 网络通信框架,简化了网络编程并涵盖了最新的Web技术。它提供了一种抽象,降低了底层复杂性,使得更多开发者能接触网络编程。Netty 因其易用性、高效性和广泛的应用场景受到推崇,适合互联网行业从业者学习,有助于理解和开发基于Netty的系统。免费的《Netty实战小册》详细介绍了Netty的各个方面,包括概念、架构、编解码器、网络协议和实际案例,帮助读者深入理解和应用Netty。如需完整版小册,可点击链接获取。
阿里内部Netty实战小册,值得拥有
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
223 0
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
244 12
|
API 开发者
Netty运行原理问题之Netty实现低开发门槛的问题如何解决
Netty运行原理问题之Netty实现低开发门槛的问题如何解决
131 1
|
编解码 NoSQL Redis
(十一)Netty实战篇:基于Netty框架打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。
605 3
|
移动开发 网络协议 算法
(十)Netty进阶篇:漫谈网络粘包、半包问题、解码器与长连接、心跳机制实战
在前面关于《Netty入门篇》的文章中,咱们已经初步对Netty这个著名的网络框架有了认知,本章的目的则是承接上文,再对Netty中的一些进阶知识进行阐述,毕竟前面的内容中,仅阐述了一些Netty的核心组件,想要真正掌握Netty框架,对于它我们应该具备更为全面的认知。
1119 2
|
前端开发 网络协议
Netty实战巅峰:从零构建高性能IM即时通讯系统,解锁并发通信新境界
【8月更文挑战第3天】Netty是一款高性能、异步事件驱动的网络框架,适用于开发高并发网络应用,如即时通讯(IM)系统。本文将指导你利用Netty从零构建高性能IM程序,介绍Netty基础及服务器/客户端设计。服务器端使用`ServerBootstrap`启动,客户端通过`Bootstrap`连接服务器。示例展示了简单的服务器启动过程。通过深入学习,可进一步实现用户认证等功能,打造出更完善的IM系统。
607 1