JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述

随着 Web 应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量,提高用户体验,我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。

在这里插入图片描述

2、配置

Spring Boot 3 对 Gzip 压缩提供了开箱即用的支持,我们可以通过简单配置来启用 Gzip 压缩。

2.1 添加依赖

在 Spring Boot 3 项目中,无需额外添加依赖,因为 Gzip 支持是内置的。只需配置即可。

2.2 配置 Gzip 压缩

通过修改 application.yml 或 application.properties 文件,可以轻松启用 Gzip 压缩。

application.yml 配置示例:

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

application.properties 配置示例:

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

配置详解:

  • server.compression.enabled:启用或禁用 Gzip 压缩。设置为 true 以启用压缩。
  • server.compression.mime-types:定义哪些 MIME 类型的响应数据将被压缩。通常我们压缩 HTML、CSS、JavaScript、JSON 等类型的数据。
  • server.compression.min-response-size:设置压缩的最小响应大小(以字节为单位)。如果响应数据小于这个值,将不进行压缩。设置为 1024 表示只有响应大于 1KB 时才会进行压缩。

3、服务端应用

在 Spring Boot 3 中,启用 Gzip 压缩非常简单。以下是如何在后端服务中实现 Gzip 压缩以优化 API 响应数据的示例。假设有一个返回 JSON 数据的 API:

@RestController
public class DataController {

    @GetMapping("/data")
    public ResponseEntity<List<String>> getData() {
        List<String> data = List.of("Item 1", "Item 2", "Item 3", "Item 4", "Item 5");
        return ResponseEntity.ok(data);
    }
}

启用 Gzip 压缩后,当数据量较大时,这个 API 响应将被压缩以减少传输的数据量。

你可以使用 curl 来查看后端是否启用了 Gzip 压缩:

curl -H "Accept-Encoding: gzip" -I http://localhost:8080/data

你将会在响应头中看到类似的内容:

Content-Encoding: gzip

这表明 Gzip 压缩已经生效。

4、前端应用

在前端,Gzip 常用于压缩静态资源(如 HTML、CSS、JavaScript 文件),从而减少用户加载页面所需的时间。通常,这些静态资源通过 Web 服务器(如 Nginx 或 Apache)或打包工具(如 Webpack)进行 Gzip 压缩。

4.1 Nginx 配置静态资源的 Gzip 压缩

假设你在前端应用中使用 Nginx 作为静态资源服务器,你可以通过修改 Nginx 配置来启用 Gzip 压缩。Nginx 配置文件 (nginx.conf) 示例:

server {
    listen 80;
    server_name example.com;

    # 启用 gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 1024;
    gzip_comp_level 5;

    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }
}
  • gzip on:启用 Gzip 压缩。
  • gzip_types:指定要压缩的 MIME 类型(HTML、CSS、JavaScript、JSON 等)。
  • gzip_min_length:仅压缩大于指定长度(1024 字节)的文件。
  • gzip_comp_level:压缩级别(1-9),数字越大压缩越强,但同时 CPU 资源消耗更多。
4.2 使用 Webpack 对前端文件进行 Gzip 压缩

如果你在前端开发中使用 Webpack 构建工具,你可以借助 compression-webpack-plugin 对生成的静态资源进行 Gzip 压缩。

安装插件:

npm install compression-webpack-plugin --save-dev

修改 webpack.config.js:

const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        path: __dirname + '/dist',
        filename: 'bundle.js'
    },
    plugins: [
        new CompressionPlugin({
            filename: '[path].gz[query]',
            algorithm: 'gzip',
            test: /\.(js|css|html|svg)$/,
            threshold: 10240,
            minRatio: 0.8,
        }),
    ],
};
  • algorithm: ‘gzip’:使用 Gzip 算法。
  • test: /.(js|css|html|svg)$/:指定需要压缩的文件类型。
  • threshold: 10240:仅压缩大小超过 10KB 的文件。
  • minRatio: 0.8:压缩比最小值,只有压缩比小于 0.8 的文件才会被压缩。

运行 Webpack 构建后,静态资源将生成 Gzip 压缩版,服务器可以优先提供这些压缩后的文件给浏览器,减少加载时间。

5、性能提升

使用 Gzip 压缩后,响应数据量可以显著减少,尤其是在数据量较大的情况下,性能提升尤为明显。以下是一些优化结果的示例:

  • 压缩前:原始 JSON 响应大小为 120KB。
  • 压缩后:启用 Gzip 压缩后,响应数据大小减少到 30KB。
    通过减少传输数据的大小,应用的响应速度大幅提升,带宽消耗减少。

注意事项

  • CPU 开销:虽然 Gzip 压缩可以减少传输数据大小,但压缩和解压缩过程会消耗一定的 CPU 资源。如果你的应用对 CPU 敏感,建议合理设置 min-response-size 以避免对小文件进行压缩。
  • 静态资源:对于静态资源(如 CSS 和 JavaScript 文件),如果你使用了 Nginx 或其他代理服务器,建议在代理层进行 Gzip 压缩,而不是在 Spring Boot 中处理。

6、结论

在 Spring Boot 3 中启用 Gzip 压缩是优化应用性能的简单有效方式,尤其适用于需要处理大量静态资源和 API 响应的应用。通过合理的配置,你可以显著减少网络带宽消耗,提升应用的响应速度,从而为用户提供更好的体验。

希望这篇文章能够帮助你在 Spring Boot 3 项目中成功启用 Gzip 压缩,进一步优化你的应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python期末复习

其他复习资料 Python期末复习-系列数据类型-CSDN博客 期末python复习-异常和函数-CSDN博客 期末Python复习-输入输出-CSDN博客 目录 一、面向对象程序设计 1.思维导图 2.基本概念 3.类对象和实例对象 3.1创建对象 3.2定义类中的成员变量 3.3类中属性的公有和私有 3.…

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意&#xff1a;有一条无限长跑道&#xff0c;每个人可以规定自己跑步的方向&#xff0c;起点&#xff0c;跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告&#xff0c;每个报告给出了某人在某一时候所在的位置&#xff0c;问跑步的最少可能人数…

《用Python实现3D动态旋转爱心模型》

简介 如果二维的爱心图案已经无法满足你的创意&#xff0c;那今天的内容一定适合你&#xff01;通过Python和matplotlib库&#xff0c;我们可以实现一个动态旋转的3D爱心模型&#xff0c;充满立体感和动感。# 实现代码&#xff08;完整代码底部名片私信&#xff09; 以下是完…

Unity-Lightmap入门篇

&#xff1a;&#xff1a;这是一个实战文章&#xff0c;并没有知识分享&#xff0c;或理论知识&#xff1b;完全没有 关键字&#xff1a; “lightmap","全局光照”&#xff0c;“light Probe" (会混合一些中英文搜索&#xff0c;或者全英文搜索&#xff09; …

ElasticSearch通过es-head插件安装可视化及相关问题

1.es-head下载地址 GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster 2.启动 建议使用vscode启动&#xff0c;并安装好node.js环境 npm installnpm run start 通过http://localhost:9100就可以看到本地添加的es库 3.相关问题 3.1跨域问…

Android PMS(Package Manager Service)源码介绍

文章目录 前言一、PMS 启动流程二、APK 安装流程三、APK 卸载流程四、权限管理静态权限动态权限 五、 数据存储与一致性六、 PMS 的安全性策略1、权限检查2、签名认证3、动态权限管理4、应用安装验证5、保护系统目录 七、PMS 调试方法总结 前言 PackageManagerService&#xf…

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。

2024-11-22 &#xff0c;由格拉斯哥大学创建的OSPTrack数据集&#xff0c;目的是通过捕获在隔离环境中执行包和库时生成的特征&#xff0c;包括静态和动态特征&#xff0c;来识别开源软件&#xff08;OSS&#xff09;中的恶意指标&#xff0c;特别是在源代码访问受限时&#xf…

Web登录页面设计

记录第一个前端界面&#xff0c;暑假期间写的&#xff0c;用了Lottie动画和canvas标签做动画&#xff0c;登录和注册也连接了数据库。 图片是从网上找的&#xff0c;如有侵权私信我删除&#xff0c;谢谢啦~

MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结

文章目录 MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了&#xff1f;——阅读总结一、检测数据库实例健康状态的重要性二、常见检测方法及问题分析&#xff08;一&#xff09;select 1 判断法&#xff08;二&#xff09;查表判断法&#xff08;三&#xff09;更新判断…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

论文阅读笔记 | EEG:运动执行过程中的ERD

参考&#xff1a;https://mp.weixin.qq.com/s/RmcPSLv1ITMZZwqe2uZ_og?token1093147649&langzh_CN

Android U ART young cc流程分析

概述&#xff1a; 众所周知jvm虚拟机为了提高内存回收效率&#xff0c;更高效的进行内存管理与回收&#xff0c;对堆内存进行了分代管理比如hotspot虚拟机的新生代&#xff0c;老年代。根据各代的特征&#xff08; 新生代对象分配频繁而生存周期短&#xff0c;老年代生存周期长…

C++ 11重点总结1

智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…

Sickos1.1 详细靶机思路 实操笔记

Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担…

GB28181系列二:SIP信令

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP报文介绍 二、SIP交互流程&#xff1a; 1、Session Model 2、Pager Model 3、SIP信令交互过程中的3个定义 三、媒体传输&#xff08;SDP和RTP&#xff09; 一、SIP报文介绍 这里将会介绍SIP…

【接口自动化测试】一文从0到1详解接口测试协议!

接口自动化测试是软件开发过程中重要的环节之一。通过对接口进行测试&#xff0c;可以验证接口的功能和性能&#xff0c;确保系统正常运行。本文将从零开始详细介绍接口测试的协议和规范。 定义接口测试协议 接口测试协议是指用于描述接口测试的规范和约定。它包含了接口的请求…

CentOS7执行yum命令报错,已加载插件:fastestmirrorLoading mirror speeds from cached hostfile

一、出现一下异常问题&#xff0c;表示域名没有配置或配置错误 问题一&#xff1a; 0curl: (6) Could not resolve host: mirrors.aliyun.com; 未知的错误 问题二&#xff1a;虚拟机使用ping主机&#xff0c;提示network unreachable 2.原因分析 出现这个问题是因为yum在安装…

【Threejs进阶教程-着色器篇】9.顶点着色器入门

【Threejs进阶教程-着色器篇】9.顶点着色器入门 本系列教程第一篇地址&#xff0c;建议按顺序学习认识顶点着色器varying介绍顶点着色器与片元着色器分别的作用Threejs在Shader中的内置变量各种矩阵gl_Position 尝试使用顶点着色器增加分段数增强效果 制作平面鼓包效果鼓包效果…

Ubuntu 硬盘分区并挂载

一、什么是挂载 1.挂载的定义 在 Ubuntu&#xff08;或其他 Linux 系统&#xff09;中&#xff0c;挂载&#xff08;Mount&#xff09; 是将一个存储设备或分区连接到系统的文件系统层次结构中的过程。挂载后&#xff0c;你可以通过某个目录&#xff08;挂载点&#xff09;访问…

【前端开发】一文带你快速入门 JavaScript(上)Web 前端必备程序语言 | 环境搭建与基础知识

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…