<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>性能优化 on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</link>
        <description>Recent content in 性能优化 on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jiangwan.ink/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>HTTP压缩的原理与应用</title>
        <link>https://jiangwan.ink/p/http-compression-principles-and-application/</link>
        <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://jiangwan.ink/p/http-compression-principles-and-application/</guid>
        <description>&lt;p&gt;　　最近在优化个人项目的网络请求时，给后端的 Rust 服务顺手加了一个中间件。结果非常出乎意料：在仅仅添加了两三行配置代码后，接口的传输速度直接提升了 70% 到 90%。&lt;/p&gt;
&lt;p&gt;　　这种投入产出比极高的优化手段，底层依赖的正是 Web 开发中非常经典且普及的技术——HTTP 压缩。今天就来系统梳理一下 HTTP 压缩的工作流、底层策略以及在现代框架中的工程实践。&lt;/p&gt;
&lt;h2 id=&#34;一-什么是-http-压缩&#34;&gt;一、 什么是 HTTP 压缩
&lt;/h2&gt;&lt;p&gt;　　HTTP 压缩是一种内置于 Web 服务器和浏览器中的网络技术，核心目的在将网页数据通过网络发送给用户之前先缩小体积。这就像发邮件时先把一个巨大的文档打包成压缩包，对方收到后再解压阅读。在 Web 请求中，这个“打包-发送-解压”的过程是瞬间且自动完成的。&lt;/p&gt;
&lt;h3 id=&#34;1-http压缩工作流&#34;&gt;1. HTTP压缩工作流
&lt;/h3&gt;&lt;p&gt;　　整个压缩过程由浏览器和服务器通过 HTTP 请求头进行：&lt;/p&gt;
&lt;p&gt;　　首先是浏览器表态。当浏览器请求网页时，会在请求头中通过 &lt;code&gt;Accept-Encoding&lt;/code&gt; 字段告诉服务器自己支持的压缩格式，例如 &lt;code&gt;Accept-Encoding: gzip, deflate, br&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;　　随后服务器进行处理。如果服务器支持浏览器提出的格式，就会对目标文件进行压缩，并在响应头中加上 &lt;code&gt;Content-Encoding: gzip&lt;/code&gt; 告知浏览器。&lt;/p&gt;
&lt;p&gt;　　最后浏览器收到压缩后的数据流，在后台底层自动解压并渲染。整个过程对前端业务代码和用户是完全透明的。&lt;/p&gt;
&lt;h3 id=&#34;2-主流压缩算法对比&#34;&gt;2. 主流压缩算法对比
&lt;/h3&gt;&lt;p&gt;　　目前业界最常用的压缩算法主要有两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gzip&lt;/strong&gt;：最经典且普及率极高的算法，通常能将纯文本文件压缩掉 60% 到 80% 的体积。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brotli (br)&lt;/strong&gt;：由 Google 开发的新一代算法。专门针对 Web 文本进行了优化，在同等 CPU 消耗下，Brotli 的压缩率通常比 Gzip 还要高出 15% 到 20%，现代浏览器已全面支持。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二-压缩策略&#34;&gt;二、 压缩策略
&lt;/h2&gt;&lt;p&gt;　　HTTP 压缩能够大幅提升网页加载速度并节省服务器带宽成本，但它并不是万能的。压缩是一个消耗 CPU 算力的过程，因此必须对处理的文件类型进行严格过滤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;必须压缩的内容&lt;/strong&gt;：HTML、CSS、JavaScript、JSON 以及 SVG 矢量图等纯文本数据是压缩的绝佳对象。文本文件中通常存在大量重复的字符、标签和空格，现代压缩算法极度擅长处理这类数据，压缩收益极大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不能压缩的内容&lt;/strong&gt;： 图片（如 JPEG、PNG、WebP）、音视频流和 PDF 文档等格式，在生成时就已经经过了高度的底层压缩。如果强行对它们进行 HTTP 压缩，不仅体积不会减小，还会白白浪费服务器和浏览器的 CPU 资源。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三-现代框架的http压缩应用&#34;&gt;三、 现代框架的HTTP压缩应用
&lt;/h2&gt;&lt;p&gt;　　在现代 Web 框架中，我们很少需要手动去写压缩算法。HTTP 压缩作为通用国际标准，各大语言生态的实现思路出奇地一致：自动协商、智能过滤、透明解压。&lt;/p&gt;
&lt;h3 id=&#34;1-自动压缩机制&#34;&gt;1. 自动压缩机制
&lt;/h3&gt;&lt;p&gt;　　你去翻看各大语言的主流框架（如 Python 的 FastAPI、Java 的 Spring Boot 或是 Rust 的 Web 框架），底层的中间件机制都遵循着几乎相同的过滤逻辑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按内容类型过滤&lt;/strong&gt;：自动识别响应头中的 &lt;code&gt;Content-Type&lt;/code&gt;。如果是纯文本则执行压缩；如果检测到媒体文件则自动放行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按文件大小过滤&lt;/strong&gt;：通常会设有一个最小字节阈值。对于只有几十字节的极小数据，强行压缩带来的网络收益无法抵消 CPU 时间损耗，中间件会选择不压缩。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-代码配置实践以-rust-为例&#34;&gt;2. 代码配置实践（以 Rust 为例）
&lt;/h3&gt;&lt;p&gt;　　既然底层机制框架都帮我们封装好了，在实际开发中开启 HTTP 压缩通常都非常简单。以我目前使用的 Rust 框架 tauri 的后端为例，开启压缩只需要两步：&lt;/p&gt;
&lt;p&gt;　　首先在 &lt;code&gt;Cargo.toml&lt;/code&gt; 中为 &lt;code&gt;tower-http&lt;/code&gt; 启用相应的特性支持：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;tower-http&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;version&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;0.x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;features&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;compression-gzip&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;compression-br&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　随后在服务的入口文件 &lt;code&gt;async_main.rs&lt;/code&gt; 中引入中间件，并将其挂载到路由栈上：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tower_http&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;compression&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;CompressionLayer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Router&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 其他路由和中间件配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;layer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CompressionLayer&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　至此后端配置结束。无论前端是使用 &lt;code&gt;fetch&lt;/code&gt; 还是 Axios，拿到的直接就是解压好的明文 JSON 数据。&lt;/p&gt;
&lt;h2 id=&#34;四-进阶设计&#34;&gt;四、 进阶设计
&lt;/h2&gt;&lt;p&gt;　　在个人项目或独立服务中，像上面这样直接在代码里开启 &lt;code&gt;CompressionLayer&lt;/code&gt; 是最简单高效的方案。但在大型项目的生产环境中，架构设计会有所不同。压缩动作本质上是用 CPU 算力换取网络带宽。为了让后端的业务服务器更专注于处理数据库查询和复杂逻辑，架构师通常会将压缩工作卸载给更前置的网关或反向代理。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  graph LR
    A[用户浏览器] -- &amp;#34;外网 (gzip / br 压缩传输)&amp;#34; --&amp;gt; B[Nginx / CDN 网关]
    B -- &amp;#34;内网 (明文高速传输)&amp;#34; --&amp;gt; C[Rust / Python 业务后端]
&lt;/pre&gt;

&lt;p&gt;　　在这种架构下，后端程序全速输出明文数据，由 Nginx 在将数据发往公网的前一刻瞬间完成压缩。这种各司其职的设计，是目前高并发系统中标准实践。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
