接口优化!Spring Boot 整合 Kryo 提升接口性能,传输数据更小

文摘   2025-01-18 10:04   新疆  

Spring Boot 3实战案例合集》现已囊括超过80篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

【重磅发布】《Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有80个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。这意味着,随着技术的不断发展和Spring Boot 3的深入应用,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

🔥🔥精彩内容不容错过
《Spring Boot 3实战案例锦集》汇聚了众多精心挑选的实战案例,旨在帮助您快速掌握Spring Boot 3的核心技术和实战技巧。无论您是初学者还是有一定经验的开发者,都能从中受益匪浅。

💌💌如何获取
请立即订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集




环境:SpringBoot3.2.5



1. 简介

在之前的一篇文章我们已经介绍过通过protobuf实现接口的调用(二进制传输),详细见下面链接:

接口优化!Spring Boot 集成 Protobuf 并使用 RestTemplate 实现微服务间通信

既然已经有了protobuf(并且Spring官方还默认提供了对应的HttpMessageConverter消息转换器),为什么还要选择kryo呢?

答案:因为kryo序列化后的大小更小。

1.1 什么是kryo

Kryo 是一个为Java设计的高速、高效的二进制对象图序列化框架。该项目的目标是实现高速度、低体积以及易于使用的API。每当需要将对象持久化(无论是保存到文件、数据库还是通过网络传输)时,该项目都非常有用。

Kryo 还可以执行自动的深度和浅度复制/克隆。这是直接从对象到对象的复制,而不是对象到字节再到对象的复制。

快速入门

public class HelloKryo {  public static void main (String[] args) throws Exception {    Kryo kryo = new Kryo() ;    // 你要序列化的类(必须先注册)    kryo.register(SomeClass.class) ;    // 将要序列化的实例对象    SomeClass object = new SomeClass();    object.value = "Hello Kryo!";    // 结果输出到文件    Output output = new Output(new FileOutputStream("file.bin"));    // 写对象    kryo.writeObject(output, object);    output.close();    // 从文件中读取二进制数据    Input input = new Input(new FileInputStream("file.bin"));    // 反序列化为对象    SomeClass object2 = kryo.readObject(input, SomeClass.class);    input.close() ;     }  public static class SomeClass {    String value;  }}

以上一个简单的示例展示了如果通过kryo实现java对象的序列化及反序列化。整个操作还是非常的简单的。

1.2 线程安全问题

我们既然要选择使用kryo序列化对象,那么对线程安全这块就必须清楚。kryo不是线程安全的,对应到上面的代码中,每一个线程都应该有自己的Kryo,Input,Output对象。

由于非线程安全,并且构造Kryo实例比较昂贵,所以在多线程环境下,我们可以考虑ThreadLocal或Pooling技术。如下示例:

使用ThreadLocal

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章