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

相关文章
|
3月前
|
Java 调度
Netty运行原理问题之ChannelHandler在Netty中扮演什么角色
Netty运行原理问题之ChannelHandler在Netty中扮演什么角色
|
3月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
3月前
|
编解码 网络协议 开发者
Netty运行原理问题之NettyTCP的粘包和拆包的问题如何解决
Netty运行原理问题之NettyTCP的粘包和拆包的问题如何解决
|
3月前
|
调度
Netty运行原理问题之事件调度工作的问题如何解决
Netty运行原理问题之事件调度工作的问题如何解决
|
3月前
|
开发者
Netty运行原理问题之Netty高性能实现的问题如何解决
Netty运行原理问题之Netty高性能实现的问题如何解决
|
3月前
|
API 开发者
Netty运行原理问题之Netty实现低开发门槛的问题如何解决
Netty运行原理问题之Netty实现低开发门槛的问题如何解决
|
3月前
|
前端开发 网络协议
Netty实战巅峰:从零构建高性能IM即时通讯系统,解锁并发通信新境界
【8月更文挑战第3天】Netty是一款高性能、异步事件驱动的网络框架,适用于开发高并发网络应用,如即时通讯(IM)系统。本文将指导你利用Netty从零构建高性能IM程序,介绍Netty基础及服务器/客户端设计。服务器端使用`ServerBootstrap`启动,客户端通过`Bootstrap`连接服务器。示例展示了简单的服务器启动过程。通过深入学习,可进一步实现用户认证等功能,打造出更完善的IM系统。
141 1
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13497 1
|
6月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
127 1
|
11月前
|
NoSQL Java Redis
跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。 原本打算做个多人斗地主练习程序,但那需要织入过多的业务逻辑,因此一方面会带来不必要的理解难度,让案例更为复杂化,另一方面代码量也会偏多,所以最终依旧选择实现基本的IM聊天程序,既简单,又能加深对Netty的理解。
160 1