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: truemime-types: text/html, text/xml, text/plain, text/css, text/javascript, application/javascript, application/json, application/xmlmin-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 压缩,进一步优化你的应用性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis集成篇(一)

Spring 框架集成Mybatis 目前主流Spring框架体系中&#xff0c;可以集成很多第三方框架&#xff0c;方便开发者利用Spring框架机制使用第三方框架的功能。就例如本篇Spring集成Mybatis 简单集成案例&#xff1a; Config配置&#xff1a; Configuration MapperScan(basePack…

路面交通工具和个数识别,支持YOLO,COCO,VOC三种格式,带标注可识别自行车,摩的,公共汽车,装载机,面包车,卡车,轿车等

预处理 自动定向&#xff1a; 已应用 调整大小&#xff1a; 拉伸至 640x640 增强 每个训练示例的输出&#xff1a; 3 翻转&#xff1a; 水平 自行车 公交车

长时间无事可做是个危险信号

小马加入的是技术开发部&#xff0c;专注于Java开发。团队里有一位姓隋的女同事&#xff0c;是唯一的web前端工程师&#xff0c;负责页面开发工作&#xff0c;比小马早两个月入职。公司的项目多以定制化OA系统为主&#xff0c;后端任务繁重&#xff0c;前端工作相对较少。在这样…

LABVIEW Modbus 串口

VISA写入&#xff1a; 写入缓冲区改为“十六进制显示”&#xff0c;并输入数据。 数据缓冲区显示&#xff1a;使用“十六进制”显示。

如何寻找适合的HTTP代理IP资源?

一、怎么找代理IP资源&#xff1f; 在选择代理IP资源的时候&#xff0c;很多小伙伴往往将可用率作为首要的参考指标。事实上&#xff0c;市面上的住宅IP或拨号VPS代理IP资源&#xff0c;其可用率普遍在95%以上&#xff0c;因此IP可用率并不是唯一的评判标准 其实更应该关注的…

FCBP 认证考试要点摘要

理论知识 数据处理与分析&#xff1a;包括数据的收集、清洗、转换、存储等基础操作&#xff0c;以及数据分析方法&#xff0c;如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化&#xff1a;涉及图表类型的选择与应用&#xff0c;如柱状图、折线图、饼图…

初识C++:指针与引用的异同,inline关键字

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 一.指针和引用的关系 1.1 概念 1.2 相似点 1.3 不同点 二.inline关键字 2.1 概念 2.2 工作原理 2.3 使用场景 2.4 注意事项 三.nullptr 3.1 引入背景 3.2 语义和类型 3.3 使用场景 兄弟们共勉 &#xff01;&…

DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解

目录 引言 伪彩色映射的概念 基本原理 查找表&#xff08;Look-Up Table, LUT&#xff09; 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中&#xff0c…

韦东山stm32hal库--定时器喂狗模型按键消抖原理+实操详细步骤

一.定时器按键消抖的原理: 按键消抖的原因: 当我们按下按键的后, 端口从高电平变成低电平, 理想的情况是, 按下, 只发生一次中断, 中断程序只记录一个数据. 但是我们使用的是金属弹片, 实际的情况就是如上图所示, 可能会发生多次中断,难道我们要记录3/4次数据吗? 答:按键按下…

【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…

如何借助AI生成PPT,让创作轻松又高效

PPT是现代职场中不可或缺的表达工具&#xff0c;但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作&#xff0c;常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化&#xff0c;还重新定义了效率与创意的关系…

基于时间维度优化“开源 AI 智能名片 S2B2C 商城小程序”运营策略:提升触达与转化效能

摘要&#xff1a; 随着数字化商业生态的蓬勃发展&#xff0c;“开源 AI 智能名片 S2B2C 商城小程序”融合前沿技术与创新商业模式&#xff0c;为企业营销与业务拓展带来新机遇。本文聚焦于用户时间场景维度&#xff0c;深入剖析如何依据不同时段用户行为特征&#xff0c;精准适…

【消息序列】详解(8):探秘物联网中设备广播服务

目录 一、概述 1.1. 定义与特点 1.2. 工作原理 1.3. 应用场景 1.4. 技术优势 二、截断寻呼&#xff08;Truncated Page&#xff09;流程 2.1. 截断寻呼的流程 2.2. 示例代码 2.3. 注意事项 三、无连接外围广播过程 3.1. 设备 A 启动无连接外围设备广播 3.2. 示例代…

vue3的prop

- 父组件需要传多个值给子组件 把值放对象&#xff0c;通过v-bind传整个对象 父组件 <script setup> import BlogPost from ./BlogPost.vue import { reactive } from vue; // 要传给子组件的所有值&#xff0c;用reactive包了该对象后&#xff0c;父组件的值变了&#…

Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成

Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 1、 Doxygen简介 Doxygen 是一个由 C 编写的、开源的、跨平台的文档生成系统。最初主要用于生成 C 库的 API 文档&#xff0c;但目前又添加了对 C、C#、Java、Python、Fortran、PHP 等语言的支持。其从源代码中提取注释&…

uniapp强制修改radio-group内单选组件的状态方法

在uniapp开发中&#xff0c;需要在radio-group内部切换时做判断&#xff0c;提醒客户是否要变换radio的值&#xff0c;但是大家知道radio是单选组件&#xff0c;往往你点击后&#xff0c;是不能再修改状态的&#xff0c;就算你在点击后做判断&#xff0c;修改current的值&#…

数据结构-最短路径问题

一.问题分类 二.无权图单源最短路算法 dist[]数组记录的是个个顶点到源点的距离这个数组的下标表示顶点 源点到自己的距离是0,dist[s]0 path[]数组记录的是这个顶点的前驱&#xff0c;可以同过这个数组找到源点到个个顶点的距离 代码如下 void Unweighted(MGraph Graph, Ver…

Vue.js 实现用户注册功能

在本篇博客中&#xff0c;我们将通过一个简单的例子来展示如何使用 Vue.js 来实现一个用户注册功能。我们将创建一个包含用户名、邮箱和密码输入的表单&#xff0c;并在用户点击“创建账号”按钮时进行简单的验证。 完整代码 <!DOCTYPE html> <html lang"en&q…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

impala入门与实践

1.impala基本介绍 impala是cloudera提供的一款高效率的sql查询工具&#xff0c;提供实时的查询效果&#xff0c;官方测试性能比hive快10到100倍&#xff0c;其sql查询比sparkSQL还要更加快速&#xff0c;号称是当前大数据领域最快的查询sql工具。impala是参照谷歌的新三篇论文…