您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring 微服务:数据压缩技术

时间:2023-10-25 12:13:06  来源:今日头条  作者:代码小人物

介绍

随着云原生架构的兴起,微服务已成为可扩展和可维护系统的重要构建块。顾名思义,微服务是小型的、独立的服务,它们共同构成一个完整的系统。当使用微服务构建系统时,尤其是那些具有大量数据交换的系统时,确保服务之间的数据传输快速高效变得至关重要。

优化此数据传输的一种方法是通过数据压缩技术。在Spring微服务的背景下,有多种方法可以实现数据压缩以实现更快的响应。在这篇文章中,我们将探讨其中一些技术并了解如何将它们集成到 Spring 微服务中。

数据压缩简介

数据压缩的核心是减少表示信息所需的数据量的艺术和科学。这项技术并不新鲜,多年来,它已经成为许多领域不可或缺的一部分,包括数据存储、多媒体、电信等。

了解基础知识

从高层次来看,数据压缩可以分为两个主要类别:

  • 无损压缩:这是一种可以从压缩数据完美重建原始数据的压缩类型。换句话说,在压缩过程中不会丢失任何信息。此方法适用于文本压缩等应用,在这些应用中,保留每一位信息都至关重要。
  • 有损压缩:顾名思义,这种方法在压缩过程中会丢失一些数据。这听起来像是一个缺点,但在许多情况下,丢失的数据对于人类感官来说通常是微不足道的或无法察觉的。一个典型的例子是图像和音频压缩,其中人类通常感知不到的微小细节可以被删除以实现更高的压缩率。

数字时代的相关性

随着数字时代每天生成的数据量不断增加,数据压缩的重要性也日益凸显。

  • 节省存储空间:数据压缩最直接的好处之一是减少存储需求。对于处理大量数据的组织来说,存储成本的节省可能是巨大的。
  • 更快的数据传输:压缩数据意味着需要移动的数据更少,从而加快上传、下载和数据同步的速度。在时间至关重要的时代,这种速度提升对于企业和最终用户都至关重要。
  • 带宽效率:对于在线服务,尤其是流媒体平台,压缩数据可以显著节省带宽,从而降低成本并为用户提供更流畅的体验。

方法和算法

多年来,已经开发了多种算法和方法来促进数据压缩。一些得到广泛认可的包括:

  • 霍夫曼编码:一种流行的无损数据压缩算法。它使用可变长度代码对源符号进行编码,其中频繁出现的符号被赋予较短的代码,而不太频繁的符号被赋予较长的代码。
  • 游程编码:此技术对于具有重复值序列的数据非常有用。它使用单个数据值和计数来表示此类序列。
  • JPEG:一种著名的有损压缩算法,主要用于数字图像。它通过去除人眼不易察觉的某些细节来实现压缩。

挑战和考虑因素

虽然数据压缩提供了许多好处,但必须意识到其中的挑战。尤其:

  • 处理开销:压缩和解压缩需要计算资源。根据所使用的算法和数据大小,这可能会导致延迟。
  • 数据完整性:尤其是在有损压缩中,压缩率和数据质量之间需要权衡。过度压缩可能会导致数据质量显著下降。

使用 Spring 压缩 HTTP 响应

Spring Boot 是一种广泛使用的用于构建微服务的框架,为 HTTP 响应压缩提供了固有的支持。此功能旨在减小 HTTP 响应正文的大小,从而可以通过减少通过网络传输的数据量来增强服务的性能。

为什么使用 HTTP 响应压缩?

在深入了解细节之前,让我们先了解一下为什么 HTTP 响应压缩至关重要:

  • 更快的数据传输:压缩数据需要更少的带宽,这意味着减少数据传输时间。对于满足不同网络速度的客户的服务,这可以确保更一致的用户体验。
  • 减少服务器负载:传输较小的数据包可以减少服务器资源的负载,特别是网络接口的负载。
  • 增强的用户体验:对于面向客户端的服务,尤其是那些提供 Web 内容的服务,压缩响应可以缩短页面加载时间。

在 Spring Boot 中配置压缩

在 Spring Boot 应用程序中启用 HTTP 响应压缩非常简单。您可以这样做:

使用Application.properties:

server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plAIn,text/css,text/JAVAscript,application/JavaScript,application/json
server.compression.min-response-size=2048

使用 application.yml:

server:
  compression:
    enabled: true
    mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
    min-response-size: 2048

上述配置实现了以下目的:

  • enanle:此标志打开 HTTP 响应压缩。
  •  mime-types:指定应对哪些 MIME 类型应用响应压缩。提供的列表主要包括文本和 JSON 类型,
  • min-response-size:设置压缩响应的最小大小。小于此大小的响应将不会被压缩。

底层:GZIP 和 Deflate

Spring Boot 使用标准压缩算法(主要是 GZIP 和 Deflate)进行 HTTP 响应压缩。这些算法受到现代浏览器和 HTTP 客户端的广泛支持,确保了兼容性。

启用压缩后,Spring Boot 会检查传入请求中的 Accept-Encoding 标头,以确定客户端支持哪种压缩算法。基于此,它选择最佳算法来压缩响应。

注意事项和最佳实践

虽然 Spring Boot 中的 HTTP 响应压缩很容易设置,但必须考虑以下事项:

CPU 开销:对于高流量的服务,可能会观察到 CPU 使用率增加。相应地监控和扩展您的资源至关重要。

选择性压缩:并非所有内容都同样受益于压缩。例如,图像或视频等二进制格式的尺寸可能不会显著减小,在某些情况下甚至可能会增加。建议主要压缩基于文本的内容,例如 HTML、CSS、JS 和 JSON。

缓存压缩响应:如果有不经常更改的特定响应,请考虑缓存压缩的内容。这可以减少重复压缩相同数据的开销。

使用 Spring Cloud Gateway 进行数据压缩

Spring Cloud Gateway 作为微服务领域的 API 网关,提供路由、速率限制和熔断等功能。鉴于其在客户端应用程序和后端微服务之间的关键地位,它在优化数据传输方面发挥着至关重要的作用。这些优化之一就是数据压缩。

为什么利用 Spring Cloud Gateway 进行压缩

使用 Spring Cloud Gateway 进行压缩具有一些明显的优势:

  • 集中压缩:网关不是在每个微服务上处理压缩,而是提供一个集中点来管理和应用压缩,确保一致性并减少冗余。
  • 从微服务解耦压缩:通过在网关级别管理压缩,各个微服务可以继续专注于其核心业务逻辑,将压缩开销解耦到网关。
  • 自适应压缩:基于路由规则和过滤器,网关可以为各种服务或端点应用不同的压缩策略或级别,从而提供针对每个用例量身定制的自适应压缩。

在 Spring Cloud Gateway 中配置响应压缩

Spring Cloud Gateway 基于 Spring WebFlux 和.NETty 的基本功能构建,使其支持响应压缩。要启用此功能:

确保 Netty 依赖项位于类路径上。如果您使用 Maven,请添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

在 application.yml 或 application.properties 中配置压缩。这是一个示例 application.yml 配置:

spring:
  cloud:
    gateway:
      routes:
      - id: my_service_route
        uri: http://my-service-url
        predicates:
        - Path=/my-service/**
        filters:
        - name: ModifyResponseBodyGatewayFilterFactory

虽然
ModifyResponseBodyGatewayFilterFactory 过滤器可用于各种响应修改(包括压缩),但必须确保后端微服务设置为以可压缩格式传递内容,或者网关的修改是压缩友好的。

支持的压缩算法

Spring Cloud Gateway 默认情况下利用 Netty 提供的底层压缩支持,其中包括以下算法: gzip:这是一种流行的算法,可以在压缩率和处理速度之间提供良好的平衡。

deflate:另一种广泛接受的算法,它比 gzip 更快,但压缩率可能稍低。

网关将检查传入请求中的 Accept-Encoding 标头,以确定客户端支持哪种压缩算法,确保兼容性和高效的数据传输。

使用 Spring Cloud Gateway 进行压缩时的注意事项

  • 后端服务响应:确保后端服务的响应尚未被压缩,除非网关设置为处理双重压缩或在重新压缩之前解压缩。
  • 性能开销:就像引入压缩的任何其他层一样,网关也会经历计算开销。适当的资源配置和监控至关重要。
  • 测试和验证:始终测试压缩的响应,尤其是在使用像ModifyResponseBodyGatewayFilterFactory这样的过滤器时,以确保数据的完整性以及正确应用压缩。

在服务级别压缩数据

虽然压缩 HTTP 响应非常常见,但在某些情况下,服务逻辑内的压缩是必要的。这可能是由于需要以压缩格式存储大型数据集、通过消息传递系统发送压缩消息或处理来自需要压缩输入/输出的源的数据。

为什么要在服务级别压缩数据?

以下是一些动机:

  •  优化存储:存储大量数据时,压缩可以显著节省存储空间,尤其是在处理冗余或重复的数据结构时。
  • 高效的数据交换:对于通过消息代理(例如 Kafka 或 RabbitMQ)进行通信的微服务,发送压缩消息可以提高吞吐量并减少网络负载。
  • 互操作性:某些外部系统或服务可能会发送或期望压缩数据,从而需要即时压缩或解压缩。

Java 的内置压缩实用程序

Java 在 java.util.zip 包下提供了一套全面的压缩实用程序。

该包中的两个主要类,Deflater 和 Inflater,分别促进数据压缩和解压缩。 这是展示其用途的基本示例:

import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class CompressionUtility {

    public static byte[] compressData(byte[] data) throws Exception {
        Deflater deflater = new Deflater();
        deflater.setInput(data);
        deflater.finish();

        byte[] compressedData = new byte[data.length];
        int compressedDataLength = deflater.deflate(compressedData);
        deflater.end();

        byte[] result = new byte[compressedDataLength];
        System.arraycopy(compressedData, 0, result, 0, compressedDataLength);
        return result;
    }

    public static byte[] decompressData(byte[] compressedData) throws Exception {
        Inflater inflater = new Inflater();
        inflater.setInput(compressedData);

        byte[] decompressedData = new byte[compressedData.length * 2];
        int decompressedDataLength = inflater.inflate(decompressedData);
        inflater.end();

        byte[] result = new byte[decompressedDataLength];
        System.arraycopy(decompressedData, 0, result, 0, decompressedDataLength);
        return result;
    }

与 Spring 集成

将这些实用程序集成到 Spring 服务中时,您可以为压缩任务创建一个服务 bean:

@Service
public class CompressionService {
    
    public byte[] compress(byte[] data) throws Exception {
        return CompressionUtility.compressData(data);
    }
    
    public byte[] decompress(byte[] compressedData) throws Exception {
        return CompressionUtility.decompressData(compressedData);
    }
}

然后,您可以在 Spring 组件中任何需要的地方自动装配和使用此服务。

注意事项

压缩率:实现的压缩取决于数据的性质。例如,文本数据通常可以很好地压缩,而已经压缩的格式(如 JPEG 图像)可能不会看到太多压缩。

开销:压缩和解压缩数据会带来一些开销。确保压缩的好处(在存储或带宽节省方面)超过计算成本至关重要。

数据丢失:当数据完整性至关重要时,确保使用无损压缩方法。对于可以接受某些数据丢失的情况(例如多媒体流),有损压缩可能更合适。

总结

数据压缩是优化微服务之间通信的一项重要技术,尤其是在存在大量数据交换的场景中。无论您是使用 Spring Boot 的开箱即用支持进行 HTTP 响应压缩、利用 Spring Cloud Gateway 的功能,还是在服务级别手动压缩数据,确保高效的数据传输都将带来更快的响应和更好的用户体验。



Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  Search: Spring  点击:(52)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: Spring  点击:(39)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: Spring  点击:(9)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Spring  点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: Spring  点击:(86)  评论:(0)  加入收藏
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring  点击:(93)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Spring  点击:(90)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring  点击:(131)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring  点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring  点击:(115)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(52)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(46)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(67)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条