Apache Fury 0.9.0正式发布,支持Kotlin和Quarkus高性能序列化

241 阅读4分钟

大家好,非常高兴向大家发布 Apache Fury 0.9.0 版本。该版本包含了来自14个 contributor的34个PR的贡献,可以参考安装文档获取最新版本。
Release Notes:github.com/apache/fury…

Apache Fury简介

Apache Fury 是一个基于JIT动态编译和零拷贝的高性能多语言序列化框架,只Java/Python/JavaScript/Golang/Scala/C++等语言,提供最高170倍的性能和极致的易用性
项目github repo地址:github.com/apache/incu…
官网主页:fury.apache.org

如何安装

Fury Java 安装

要使用 Maven 添加对 Apache Fury 的依赖,请使用以下配置:

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-core</artifactId>
  <version>0.9.0</version>
</dependency>

Fury Scala 安装

要使用 Maven 添加 scala 2.13 的 Fury scala 依赖,请使用以下配置:

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-scala_2.13</artifactId>
  <version>0.9.0</version>
</dependency>

要使用 Maven 添加 scala 3 的 Fury scala 依赖,请使用以下配置:

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-scala_3</artifactId>
  <version>0.9.0</version>
</dependency>

要使用 sbt 添加 scala 2.13 的 Fury scala 依赖,请使用以下配置:

libraryDependencies += "org.apache.fury" % "fury-scala_2.13" % "0.9.0"

要使用 sbt 添加 scala 3 的 Fury scala 依赖,请使用以下配置:

libraryDependencies += "org.apache.fury" % "fury-scala_3" % "0.9.0"

Fury Kotlin安装

<dependency>
  <groupId>org.apache.fury</groupId>
  <artifactId>fury-kotlin</artifactId>
  <version>0.9.0</version>
</dependency>

Highlight

  • 正式发布Fury Kotlin支持,支持任意Kotlin对象高性能序列化
  • 支持高效率的 UTF-8 字符串编码,比 JDK utf8 编码快 2 倍
  • 对于长度小于16字节的小字符串,减少metastring hashcode 开销,空间大小优化7 bytes
  • 支持在 Windows 平台上构建 Fury C++ 库
  • 实现Quarkus Fury 扩展,支持在Quarkus Native Image里面使用Fury进行序列化github.com/quarkiverse…

使用示例

Fury Kotlin使用示例

import org.apache.fury.Fury
import org.apache.fury.ThreadSafeFury
import org.apache.fury.serializer.kotlin.KotlinSerializers

data class Person(val name: String, val id: Long, val github: String)
data class Point(val x : Int, val y : Int, val z : Int)

fun main(args: Array<String>) {
    // 注意:以下 fury 初始化代码应只在全局范围内执行一次,
    // 而不是在每次序列化时初始化。
    val fury: ThreadSafeFury = Fury.builder().requireClassRegistration(true).buildThreadSafeFury()
    KotlinSerializers.registerSerializers(fury)
    fury.register(Person::class.java)
    fury.register(Point::class.java)
    val p = Person("Shawn Yang", 1, "https://github.com/chaokunyang")
    println(fury.deserialize(fury.serialize(p)))
    println(fury.deserialize(fury.serialize(Point(1, 2, 3))))
}

Quarkus Fury 扩展使用示例

安装依赖:

<dependency>
    <groupId>io.quarkiverse.fury</groupId>
    <artifactId>quarkus-fury</artifactId>
    <version>0.1.0</version>
</dependency>

代码示例:

import java.util.List;
import java.util.Map;

import io.quarkiverse.fury.FurySerialization;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

import org.apache.fury.BaseFury;

@FurySerialization
record Foo(int f1, String f2, List<String> f3, Map<String, Long> f4) {
}

@Path("/fury")
@ApplicationScoped
public class FuryResources {
  @Inject
  BaseFury fury;

  @GET
  @Path("/record")
  public Boolean testSerializeFooRecord() {
    Foo foo1 = new Foo(10, "abc", List.of("str1", "str2"), Map.of("k1", 10L, "k2", 20L));
    Foo foo2 = (Foo) fury.deserialize(fury.serialize(foo1));
    return foo1.equals(foo2);
  }
}

功能特性

Bug修复

其它改进

新贡献者

完整变更记录: github.com/apache/fury…

感谢

特别感谢为这次发布做出贡献的同学:@effigies @apupier @wywen @mandrean @HuangXingBo @pjfanning @chaokunyang @penguin-wwy @An-DJ @Forchapeatl @orisgarno @zhaommmmomo @caicancai @Aliothmoon