SpringBoot中開啟Gzip壓縮的兩種方式詳解
前言
在當(dāng)今數(shù)字化時代,隨著互聯(lián)網(wǎng)應(yīng)用的飛速發(fā)展,數(shù)據(jù)傳輸?shù)男屎托阅艹蔀榱酥陵P(guān)重要的問題。GeoJSON 是一種基于 JSON 格式的地理空間數(shù)據(jù)交換格式,它廣泛應(yīng)用于地理信息系統(tǒng)(GIS)領(lǐng)域,用于描述地理空間數(shù)據(jù)的幾何形狀、屬性等信息。GeoJSON 數(shù)據(jù)通常包含大量的地理坐標(biāo)點、幾何形狀等信息,數(shù)據(jù)量往往較大。在 Web 地理信息系統(tǒng)應(yīng)用中,如地圖展示、地理數(shù)據(jù)可視化等場景,GeoJSON 數(shù)據(jù)的傳輸效率直接關(guān)系到地圖加載的速度和用戶體驗。因此,對 GeoJSON 數(shù)據(jù)進(jìn)行有效的壓縮,以減少數(shù)據(jù)傳輸?shù)捏w積,顯得尤為重要。對于基于SpringBoot 框架構(gòu)建的 WebGIS 應(yīng)用來說,如何高效地傳輸數(shù)據(jù)、減少網(wǎng)絡(luò)帶寬的占用,是提升用戶體驗和系統(tǒng)性能的關(guān)鍵所在。而 Gzip 壓縮技術(shù),作為一種被廣泛采用的解決方案,無疑為這一問題的解決提供了強(qiáng)大的助力。

以 GeoJSON 數(shù)據(jù)為例,通過在 SpringBoot 應(yīng)用中開啟 Gzip 壓縮,對 GeoJSON 數(shù)據(jù)進(jìn)行瘦身,不僅可以顯著減少數(shù)據(jù)傳輸?shù)捏w積,提高地圖加載的速度,還可以提升用戶的交互體驗。在實際的 Web 地理信息系統(tǒng)開發(fā)中,這種優(yōu)化手段是非常實用和有效的。通過對 GeoJSON 數(shù)據(jù)的壓縮處理,我們可以更好地滿足用戶對于地圖快速加載和流暢交互的需求,同時也為整個應(yīng)用的性能優(yōu)化提供了有力的支持。
在接下來的內(nèi)容中,我們將詳細(xì)介紹在 SpringBoot 中開啟 Gzip 壓縮的兩種方式的具體實現(xiàn)步驟,并通過實際的 GeoJSON 數(shù)據(jù)壓縮案例,展示這兩種方式的應(yīng)用效果和優(yōu)缺點。希望通過本文的介紹,能夠幫助讀者更好地理解和掌握在 SpringBoot 應(yīng)用中使用 Gzip 壓縮技術(shù)的方法,從而提升自己開發(fā)的 WebGIS 應(yīng)用的性能和用戶體驗。
一、GZIP壓縮知識簡介
GZIP 是一種數(shù)據(jù)壓縮格式,只能用于壓縮單個文件。它可用于網(wǎng)絡(luò)文件傳輸時的壓縮,例如 nginx 中的 ngx_http_gzip_module,啟用壓縮功能后可以節(jié)約帶寬;也可用于本地文件存儲時的壓縮。本節(jié)將重點對Gzip進(jìn)行一個簡單的介紹,讓大家對Gzip的相關(guān)知識有一個簡單的了解。
1、什么是Gzip
Gzip 的壓縮算法基于 LZ77 算法 和 Huffman 編碼 的結(jié)合。具體過程如下:
LZ77 算法:LZ77 算法通過查找和替換重復(fù)的字節(jié)序列來壓縮數(shù)據(jù)。它維護(hù)一個滑動窗口,在窗口內(nèi)查找匹配的字符串,然后使用指針來替代這些重復(fù)的字符串。例如,對于字符串 "http://jiurl.yeah.nethttp://jiurl.nease.net",LZ77 算法會將其壓縮為 "http://jiurl.yeah.net(22,13)nease(23,4)",其中 (22,13) 表示距離當(dāng)前位置 22 個字符處的 13 個字符與當(dāng)前位置的字符相同。
Huffman 編碼:Huffman 編碼是一種基于字符頻率的編碼方法。它為出現(xiàn)頻率高的字符分配較短的編碼,為出現(xiàn)頻率低的字符分配較長的編碼,從而達(dá)到壓縮的目的。在 Gzip 中,LZ77 算法的輸出結(jié)果會進(jìn)一步通過 Huffman 編碼進(jìn)行壓縮。
Gzip 文件結(jié)構(gòu):Gzip 文件包含文件頭、壓縮數(shù)據(jù)塊和文件尾。文件頭存儲文件的元數(shù)據(jù),如壓縮方法、時間戳等;壓縮數(shù)據(jù)塊是使用 DEFLATE 算法壓縮后的數(shù)據(jù);文件尾存儲校驗和(CRC32)和原始文件大小,以確保文件的完整性
2、Gzip特點
無損壓縮:Gzip 是一種無損壓縮算法,數(shù)據(jù)在解壓縮后可以完全還原,沒有任何損失。
高效的壓縮率:對于文本文件(如 HTML、JSON、XML),Gzip 的壓縮率通常在 50%-90% 之間。它通過查找重復(fù)的字符串并用較短的指針替代,以及根據(jù)字符頻率進(jìn)行編碼,從而實現(xiàn)高效壓縮。
廣泛支持:Gzip 被幾乎所有現(xiàn)代瀏覽器、服務(wù)器和編程語言支持。在 HTTP 傳輸中,服務(wù)器可以根據(jù)瀏覽器的請求頭(如 Accept-Encoding: gzip)來判斷是否使用 Gzip 壓縮響應(yīng)內(nèi)容。
壓縮和解壓速度較快:Gzip 的壓縮和解壓速度相對較快,尤其是解壓過程,因為解壓時只需根據(jù)指針和編碼還原數(shù)據(jù),計算量相對較小。
適用于特定文件類型:Gzip 對文本文件的壓縮效果較好,但對于已經(jīng)壓縮過的文件(如圖片、音樂、視頻)效果不明顯,甚至可能導(dǎo)致文件變大
3、Gzip在GIS方面的應(yīng)用
地理數(shù)據(jù)傳輸:在 GIS 應(yīng)用中,地理數(shù)據(jù)(如 GeoJSON 文件)通常包含大量的坐標(biāo)點和幾何形狀信息,數(shù)據(jù)量較大。使用 Gzip 壓縮可以顯著減少數(shù)據(jù)傳輸?shù)捏w積,加快地圖加載速度,提升用戶體驗。
服務(wù)器端優(yōu)化:在服務(wù)器端,可以配置 Web 服務(wù)器(如 Nginx)開啟 Gzip 壓縮功能。當(dāng)客戶端請求地理數(shù)據(jù)時,服務(wù)器會自動對響應(yīng)內(nèi)容進(jìn)行壓縮,減少網(wǎng)絡(luò)帶寬的占用。
前端性能優(yōu)化:在前端開發(fā)中,可以通過工具(如 Webpack 的 Compression-webpack-plugin 插件)在構(gòu)建過程中對地理數(shù)據(jù)文件進(jìn)行 Gzip 壓縮,然后在服務(wù)器上直接提供壓縮后的文件,減少服務(wù)器的實時壓縮負(fù)載。
數(shù)據(jù)存儲優(yōu)化:對于存儲在服務(wù)器上的地理數(shù)據(jù)文件,使用 Gzip 壓縮可以節(jié)省存儲空間。在需要讀取數(shù)據(jù)時,再進(jìn)行解壓處理。
總之,Gzip 壓縮技術(shù)在 GIS 領(lǐng)域的應(yīng)用,不僅可以提高數(shù)據(jù)傳輸效率,還可以優(yōu)化服務(wù)器性能和存儲空間,是提升 GIS 應(yīng)用性能的重要手段之一。
二、SpringBoot中開啟Gzip的方式
SpringBoot 是一個非常流行的 Java 基于 Spring 框架的快速開發(fā)框架,它極大地簡化了 Spring 應(yīng)用的開發(fā)過程。在 SpringBoot 應(yīng)用中,通過合理的配置和編程,可以很方便地集成 Gzip 壓縮功能,從而實現(xiàn)對響應(yīng)數(shù)據(jù)的自動壓縮。這不僅可以提高數(shù)據(jù)傳輸?shù)男?,還可以減輕服務(wù)器的負(fù)載,提升整個應(yīng)用的性能。本節(jié)將重點介紹在SpringBoot中關(guān)于Gzip的相關(guān)知識以及在SpringBoot中GeoJSON的一些實踐案例。
1、在SpringBoot中開啟Gzip的知識簡介
在 SpringBoot 中,開啟 Gzip 壓縮主要有兩種方式:一種是通過配置文件進(jìn)行全局配置,另一種是通過編程的方式在特定的控制器或方法上進(jìn)行局部配置。這兩種方式各有優(yōu)缺點,適用于不同的應(yīng)用場景。
全局配置方式 :通過在 SpringBoot 的配置文件(如 application.yml 或 application.properties)中添加相關(guān)的 Gzip 壓縮配置,可以實現(xiàn)對整個應(yīng)用的 HTTP 響應(yīng)進(jìn)行統(tǒng)一的壓縮處理。這種方式簡單方便,適用于大多數(shù)需要壓縮的場景,但缺乏對特定數(shù)據(jù)類型的針對性處理。
局部配置方式 :通過在控制器或方法上添加自定義的注解或邏輯,可以實現(xiàn)對特定數(shù)據(jù)類型的壓縮處理。這種方式更加靈活,可以根據(jù)不同的數(shù)據(jù)類型和業(yè)務(wù)需求,定制不同的壓縮策略,但相對來說實現(xiàn)起來較為復(fù)雜,需要更多的編程工作。
這里首先簡單介紹了兩種在SpringBoot中開啟Gzip壓縮的方式,為下文全面講解這兩種方式做準(zhǔn)備,先讓大家了解相關(guān)知識。
2、SpringBoot中GeoJSON的實例
GeoJSON在WebGIS中的用處很多,很多矢量數(shù)據(jù)的邊界,范圍點等數(shù)據(jù),我們都是直接以GeoJSON的格式返回給前端,并直接進(jìn)行展示的。比如之前很多的行政區(qū)劃展示,省市縣等不同的行政區(qū)劃范圍展示等,我們的實現(xiàn)過程都是在后臺的Controller層中返回一個包含GeoJSON的對象,方法如下:
package com.yelang.project.meteorology.domain;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper=true)//callSuper=true表示輸出父類屬性
@EqualsAndHashCode(callSuper=false)
public class AreaWeatherVO extends WeatherNow implements Serializable{
private static final long serialVersionUID = -7559774548761847068L;
@TableField(exist = false,value= "province_code")
private String provinceCode;
@TableField(exist = false,value= "province_name")
private String provinceName;
@TableField(exist = false,value= "city_code")
private String cityCode;
@TableField(exist = false,value= "city_name")
private String cityName;
@TableField(exist = false,value= "area_name")
private String areaName;
@TableField(exist = false)
private String geomJson;
private String lat;
private String lon;
}上面是一個視圖對象的具體代碼,在Controller的方法中我們調(diào)用如下:
@RequiresPermissions("met:province:weather:list")
@GetMapping("/list/{pcode}")
@ResponseBody
public AjaxResult ewsnProvinceList(@PathVariable("pcode") String pcode){
String day = "2025-08-17";
List<AreaWeatherVO> dataList = weatherNowService.getWeatherByProvinceAndday(pcode,day);
return AjaxResult.success().put("data", dataList);
}經(jīng)過以上的代碼輸出接口中就包含GeoJOSN數(shù)據(jù),如下圖所示:

其具體的geoJSON值如下圖:

在網(wǎng)絡(luò)窗口中可以看到整個接口返回的數(shù)據(jù)大小大約為5MB,如果遇到更大范圍的行政區(qū)劃,返回的數(shù)據(jù)肯定會大,比如西藏的行政區(qū)劃大約有14MB,如圖所示:

那么如何通過開啟Gzip來減少這些數(shù)據(jù)的輸出呢?下面兩個部分來重點講解。
三、全局開啟Gzip實現(xiàn)
本節(jié)將詳細(xì)介紹如何在SpringBoot中開啟Gzip壓縮的配置。
1、實現(xiàn)原理
在 application.yml 或 application.properties 中添加以下配置:
示例:application.yml
server:
compression:
enabled: true
mime-types: application/json
min-response-size: 1KB # 小于1KB的響應(yīng)不壓縮或者application.properties中:
server.compression.enabled=true server.compression.mime-types=application/json server.compression.min-response-size=1024
請注意:該配置會對所有返回 application/json 的接口啟用 GZIP 壓縮。
2、實現(xiàn)效果
在我們的工程中配置文件是以yml的形式配置的,按照上面的步驟進(jìn)行設(shè)置后,重新啟動應(yīng)用程序后來看一下同樣的接口,其返回的數(shù)據(jù)量大小是多少:

通過以上圖片可以直觀的看到,開啟全局壓縮后,我們的接口返回大小,從14.4M下降了5MB,幾乎是原來的1/3,這個壓縮比例還是可以的。
四、局部約定配置
上面的這種實現(xiàn)方式全局的開啟,也就是所有的接口都會開啟,雖然可以設(shè)置mime-types來進(jìn)行一定的過濾,但是依然會有很大的覆蓋面。如果只想對某個接口生效或者指定一些接口生效又應(yīng)該怎么實現(xiàn)呢?本節(jié)來講講針對這種情況的實現(xiàn)。
1、實現(xiàn)原理
基于局部約定配置的方式的實現(xiàn)原理其實是通過自定義 Filter 來精確控制哪些接口啟用壓縮,因此通過過濾器就可以將我們需要設(shè)定的請求路徑進(jìn)行針對性過濾,從而開啟針對這些接口的Gzip過濾壓縮。下面我們來看看在SpringBoot中如何實現(xiàn)呢?
2、具體代碼實現(xiàn)
首先在SpringBoot中直接創(chuàng)建一個過濾器Filter,關(guān)鍵代碼如下:
package com.yelang.framework.interceptor.gzip;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.zip.GZIPOutputStream;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
@Component
public class SelectiveGzipFilter implements Filter {
private final AntPathMatcher pathMatcher = new AntPathMatcher();
private final List<String> gzipPatterns = Arrays.asList(
"/eq/province/geojson/**",
"/eq/province/detourcoefficient/list/**",
"/eq/info/home/earthinfo",
"/eq/province/abbreviations/list"
);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String requestUri = req.getRequestURI();
String contextPath = req.getContextPath();
boolean match = gzipPatterns.stream()
.anyMatch(pattern -> pathMatcher.match(pattern, requestUri));
if (match) {
System.out.println("成功匹配");
// 啟用 GZIP 壓縮邏輯(同上)
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Content-Encoding", "gzip");
res.setHeader("Content-Type", "application/json");
GZIPResponseWrapper gzipResponse = new GZIPResponseWrapper(res);
chain.doFilter(request, gzipResponse);
gzipResponse.finish();
} else {
System.out.println("未匹配上...");
chain.doFilter(request, response);
}
}
static class GZIPResponseWrapper extends HttpServletResponseWrapper {
private final GZIPOutputStream gzipOutputStream;
public GZIPResponseWrapper(HttpServletResponse response) throws IOException {
super(response);
gzipOutputStream = new GZIPOutputStream(response.getOutputStream());
}
@Override
public ServletOutputStream getOutputStream() {
return new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
gzipOutputStream.write(b);
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setWriteListener(WriteListener writeListener) {
throw new UnsupportedOperationException();
}
};
}
public void finish() throws IOException {
gzipOutputStream.finish();
}
}
}這里演示了如何設(shè)置多個目標(biāo)URL地址的配置方式,使用AntPathMatcher 來進(jìn)行匹配實現(xiàn)。需要注意的是,這里我們沒有區(qū)分請求的頭地址,以若依為例,可能會在匹配時無法正確對應(yīng),導(dǎo)致無法正常的開啟Gzip壓縮,因此為了保證正確的啟用,我們在進(jìn)行地址匹配時,需要自動過濾項目的服務(wù)名稱,詳細(xì)代碼如下:
String contextPath = req.getContextPath();
// 去掉 context-path 部分,只匹配相對路徑
String relativePath = requestUri.substring(contextPath.length());
System.out.println("relativePath==>" + relativePath);
/*boolean match = gzipPatterns.stream()
.anyMatch(pattern -> pathMatcher.match(pattern, requestUri));*/
boolean match = gzipPatterns.stream()
.anyMatch(pattern -> pathMatcher.match(pattern, relativePath));其實這里的contenxPath對應(yīng)的就是配置文件中定義的參數(shù):
# 開發(fā)環(huán)境配置
server:
# 服務(wù)器的HTTP端口,默認(rèn)為80
port: 8080
servlet:
# 應(yīng)用的訪問路徑
context-path: /earthqadminGeoJSON 數(shù)據(jù)通常體積較大,壓縮后可顯著減少傳輸時間。以下是實戰(zhàn)建議:
| 項目 | 建議值 | 說明 |
|---|---|---|
| 壓縮類型 | GZIP | 瀏覽器原生支持 |
| 最小壓縮閾值 | 1KB 或更小 | GeoJSON 一般遠(yuǎn)大于此值 |
| MIME 類型 | application/json | 保持標(biāo)準(zhǔn)兼容 |
| 實測效果 | 原始 15MB → 壓縮后 300KB | 壓縮率可達(dá) 90%+ |
只有加上以上代碼后才能實現(xiàn)正確匹配,在訪問地址被請求是輸出如下信息:

五、總結(jié)
以上就是本文的主要內(nèi)容,我們將詳細(xì)介紹在 SpringBoot 中開啟 Gzip 壓縮的兩種方式的具體實現(xiàn)步驟,并通過實際的 GeoJSON 數(shù)據(jù)壓縮案例,展示這兩種方式的應(yīng)用效果和優(yōu)缺點。希望通過本文的介紹,能夠幫助讀者更好地理解和掌握在 SpringBoot 應(yīng)用中使用 Gzip 壓縮技術(shù)的方法,從而提升自己開發(fā)的 WebGIS 應(yīng)用的性能和用戶體驗。博文首先簡單介紹了Gzip的相關(guān)知識,然后介紹了在SpringBoot中開啟Gzip的方式,最后以代碼加案例的形式詳細(xì)的介紹全局開啟Gzip和局部開啟Gzip的兩種不同模式實現(xiàn)原理及具體代碼實現(xiàn)。行文倉促,定有不足之處,歡迎各位朋友在評論區(qū)批評指正,不勝感激。
以上就是SpringBoot中Gzip壓縮的兩種開啟方式詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Gzip壓縮開啟方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring-boot 多線程并發(fā)定時任務(wù)的解決方案
這篇文章主要介紹了spring-boot 多線程并發(fā)定時任務(wù)的解決方案,需要的朋友可以參考下2019-08-08
Spring?MVC中@Controller和@RequestMapping注解使用
這篇文章主要介紹了Spring?MVC中@Controller和@RequestMapping注解使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
bootstrap.yml如何讀取nacos配置中心的配置文件
這篇文章主要介紹了bootstrap.yml讀取nacos配置中心的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
深入理解JVM之Class類文件結(jié)構(gòu)詳解
這篇文章主要介紹了深入理解JVM之Class類文件結(jié)構(gòu),結(jié)合實例形式詳細(xì)分析了Class類文件結(jié)構(gòu)相關(guān)概念、原理、結(jié)構(gòu)、常用方法與屬性,需要的朋友可以參考下2019-09-09
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之字符串暴力匹配
字符串暴力匹配算法是指在一個長字符串中暴力尋找是否包含某一子串所謂暴力匹配,就是不使用任何其他算法,將兩個字符串中的字符一一進(jìn)行比對2022-02-02
Flink結(jié)合Kafka實現(xiàn)通用流式數(shù)據(jù)處理
這篇文章將和大家一起深入探討Flink和Kafka的關(guān)系以及它們在數(shù)據(jù)流處理中的應(yīng)用,并提供一些最佳實踐和實際案例,希望對大家有一定的幫助2025-03-03

