深入浅出了解华为云API网关的Gzip功能

news2025/3/1 20:49:12

Gzip是什么

Gzip是一种用于数据压缩的编码格式,经常被使用在基于HTTP协议的网络传输中。Gzip功能允许服务器在传输数据是对其进行压缩,从而减小传输的数据量,加快页面加载速度,这对于节省带宽和提高用户体验非常有用。本文将从Gzip使用场景、Gzip原理、Gzip在nginx中的应用以及华为云API 网关的Gzip功能实现几个方面介绍Gzip。

Gzip使用场景

Gzip能够提升传输速度和降低带宽消耗,因此适合应用Gzip的场景有很多。

网页传输:在web开发中,使用Gzip可以减小文件大小,从而加快页面加载速度。

移动应用通信:在移动应用中,使用Gzip可以降低移动网络的数据消耗,加快数据传输速度,提升用户体验。

文件备份和传输:在进行文件备份或者文件传输时,使用Gzip可以减小备份文件的大小,节省存储空间和传输带宽。

网络传输限制:在网络带宽受限的环境下,使用 Gzip 可以减小数据传输量,提升网络性能。

API通信:对于 RESTful API 或其他数据接口的传输,使用 Gzip 可以降低传输的数据量,减少对网络带宽的占用,提升响应速度。

Gzip原理

gzip使用deflate算法进行压缩。其原理主要包括LZ77算法以及Huffman编码(哈夫曼编码)。

LZ77算法

LZ77算法是将重复字符串替换为长度距离对来达到压缩的目的。长度是重复字符串的长度,距离是重复字符串与第一个出现该字符串的距离,下图是一个简单的示例:

在LZ77算法中,主要运用了基于滑动窗口的字典压缩算法。首先是滑动窗口:

以上图为例,一开始,查找区是没有字符的。滑动窗口从K开始移动,依次在查找区尝试查找当前指向字符及之后字符的最长匹配,直到滑动窗口区不再有字符为止。这里就涉及到另外一个问题了,如何在查找区中快速的找到与滑动窗口中匹配的字符,LZ77显然不会采取暴力遍历查找的方法,通常使用哈希数组来实现字典的快速搜索。在哈希数组中有两个数组,一个数组用来存放最新重复字符串的哈希地址,一个数组用来解决哈希冲突。具体以下图为例进行说明:

当第一次扫描ABC时,对应数组1中4号位置为空,因此不用转化为长度距离对。当第二次扫描到ABC时,对应数组1中4号位置存放的是1,于是将4号位置替换为6,再将1放置在数组2中的6号位置,此时数组2的6号位置存放的是1,对当前字符串后的字符继续和1位置对应字符后的字符继续进行匹配,记录最长匹配字符长度。然后在数组2中查找1号位置,如果为空则结束匹配,最后将匹配到的最长字符替换为长度距离对。

Huffman编码

Huffman编码的原理是基于哈夫曼树。哈夫曼树是一种最优二叉树,是一种带权路径长度最短的二叉树。

以下是哈夫曼树的构造过程:

假设有A、B、C、D、E五个字母,他们对应出现的次数分别为5,6,8,12,20

构造哈夫曼树的基本流程:将A、B、C、D、E看作是只有一个结点的树,其中出现的次数作为他们的权值。将权值和最小的两个数进行合并称为一个新树,权值较小的树作为左子树,权值较大的树作为右子树,新树的根结点权值为两子树之和,然后将新树也加入到树的集合中,重复上述流程知道又有一棵树为止。

针对哈夫曼树编码, 左分支为0,右分支为1。可得出A、B、C、D、E的编码如下:

字符

E

D

C

A

B

编码

0

10

110

1110

1111

从最后的编码来看,出现次数最多的E的编码长度比出现次数较少的A或B要少。最终频率高的字符会使用较短的编码,频率低的字符会使用较长的编码,总体的编码长度就会变小,从而达到压缩的结果。

GzipNginx中的应用

Nginx作为当下很流行的开源网页服务器和反向代理服务器,原生支持了Gzip的功能。但是在Nginx中Gzip功能默认是不开启,需要在配置文件中配置相关指令才可以开启Gzip功能。常见的配置项如下:

华为云API 网关的Gzip功能

华为云 API 网关(APIG)为企业和开发者提供的高性能、高可用、高安全的云原生网关服务,融合安全、负载均衡、流量入口治理、微服务流量治理、运维等多项能力,也支持Gzip压缩功能。用户可以通过一键式开关控制Gzip功能的开启。同时APIG还开放了压缩等级,用户可以通过配置不同的压缩等级,根据自己的需求对Gzip功能进行性能调优。当一个客户端发送一个HTTP请求时,需要包含一个Accept-Encoding头部用来指示客户端支持的压缩算法。APIG会根据GZIP开关来判断是否进行压缩。在开关开启的状态下,APIG会将响应内容压缩,然后将压缩后的响应发送给客户端(如果客户端已经进行Gzip压缩,那么APIG将不会进行二次压缩)。客户端收到响应后,会根据响应头部的Content-Encoding字段判断是否经过了压缩。如果响应被压缩了,客户端会进行解压缩,以获取原始的内容。

可以参考以下步骤打开Gzip开关及设置压缩等级:

打开华为云APIG控制台,依次进入实例管理-->配置参数,在页面列表中找到参数gzip如下:

如上图,gzip功能为开启状态,且压缩等级为6。

此外,APIG还提供了Debug功能用以调试Gzip功能。首先依次打开API列表, 然后点击创建API。

在填写好API详细信息后,在后端配置选项页面选择Mock后端,并且增加header参数-content-length(参数值需要大于等于1028, 否则gzip功能将不生效。)

然后进入API的调试界面,在Headers中添加参数:Accept-Encoding,对应参数值为gzip。 在响应结果中,如果有Content-Encoding: gzip 出现,即代表Gzip功能生效。

总结

Gzip自首次发布以来,已经成为互联网上常用的压缩格式之一。各种高性能的开源代理如Nginx、Envoy等都原生支持Gzip的功能。在传输速度和降低带宽消耗方面,Gzip有着十分强大的优势,希望本文能帮助到想要了解Gzip背后原理及其应用的人。

阅读原文:了解华为云APIG

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

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

相关文章

你觉得工作开心重要还是赚钱重要?

对于大多数的普通人来说,开心和钱都重要,但是都得不到。我觉得最重要的不是做取舍,或者说不是做我认清楚了哪个重要就可劲地去争取哪样。 真正要做得,而是我们在自己现有的境况下找到自己的最优解,如何在这世人皆苦的环…

小程序和前台开发软件定制的相关信息|APP网站搭建

小程序和前台开发软件定制的相关信息 在如今数字化时代,软件、小程序和前台开发软件定制已经成为了企业必备的工具之一。那么,这些工具到底有什么作用呢?接下来,我将为大家详细介绍。 首先,让我们来了解一下软件。软件…

BP神经网络应用案例

背景介绍 冶金技术,钢铁开始锻炼的“开始温度”与13个指标有关,见表(1)。 出钢时间/h 钢水净重量/t 吹止温度/oC 高碳锰铁/t 低碳锰铁/t 硅锰铁/t 硅铁/t 铝块/t 增碳剂/t 中碳锰铁/t 包龄/炉/包 运输时间/min 等待时间/min 开始温度 3 …

Joe主题魔改:正文内容实现图片懒加载

引言 有个哥们问我Joe主题的正文部分,如何同样图片懒加载,于是便研究了一下。 探索过程 因为PHP语言我用的很少,并不擅长,于是我去网上搜了一下。 方案一:用一个叫Jquery Lazyload的JavaScript脚本,我尝…

44.ES

一、ES。 (1)es概念。 (1.1)什么是es。 (1.2)es的发展。 es是基于lucene写的。 (1.3)总结。 es是基于lucene写的。 (2)倒排索引。 (3&#xf…

利用无线模拟量装置完成热电厂蒸汽流量远程采集

某数码影像材料制造集团生产目前主要消耗蒸汽和电能源,蒸汽用能情况较为复杂,需要用5公里的蒸汽管线将较远区域某热电厂的蒸汽接入厂内,每周专人巡查一次管线,部分蒸汽管线位置特别偏僻,不易出入。 为了监控蒸汽流量&…

JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)

JAXB 使用记录 部分内容引自 https://blog.csdn.net/gengzhy/article/details/127564536 基础介绍 JAXBContext类:是应用的入口,用于管理XML/Java绑定信息 Marshaller接口:将Java对象序列化为XML数据 Unmarshaller接口:将XML数…

基于JAVA SpringBoot和Vue小说在线听书网站设计

摘要 移动互联网技术的不断发展,人们学习场景和支付习惯的不断变化,为知识支付的兴起提供了有利条件。知识支付逐渐成为人们弥补碎片化阅读习惯、获取知识的一种流行方式。知识付费市场日益扩大,在这波浪潮中,以喜马拉雅和知乎为首…

5Spring及Spring系列-进阶

8.1spring进阶 spring常用注解 1.Component 它是这些注解里面最普通的一个注解,一般用于把普通pojo实例化到spring容器中。 Controller和Service和Repository是它的特殊情况,当一个类不需要进行这几种特殊归类的时候,只是作为一个普通的类&am…

【算法|双指针系列No.8】leetcode18. 四数之和

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

VSCode 使用 Vetur Format格式化的配置项

"vetur.format.options.tabSize": 4,"vetur.format.defaultFormatterOptions": {// for html"prettyhtml": {"wrapAttributes":false,//强制包装属性// "sortAttributes": true,//对属性按首字母排序// "bracketSpacin…

Apache Tomcat下载安装配置使用超详细

下载安装 tomcat官网 在此我们以Tomcat 9.0.81为例,点击下载压缩包,解压到自己的文件夹。 tar.gz是linux操作系统下的安装版本。zip是windows系统下的压缩版本。Windows Service Installer是windows操作系统下的exe安装版本。 检查是否配置JDK 1.…

Ubuntu 22.04.3 LTS单机私有化部署sealos

推荐使用奇数台 Master 节点和若干 Node 节点操作系统 :Ubuntu 22.04 LTS内核版本 :5.4 及以上配置推荐 :CPU 4 核 , 内存 8GB, 存储空间 100GB 以上最小配置 :CPU 2 核 , 内存 4GB, 存储空间 60GB 这里采用的Ubuntu 22.04.3 LTS 版本,Ubuntu 20.04.4 LTS这个版本…

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务:普通的线程代码中,我们常使用Runnable接口 但Runnable没有返…

如何将jpg转化为png?

如何将jpg转化为png?可能有的小伙伴就会疑惑了,jpg和png都是图片常用的一种格式,为什么要进行格式的更改呢?那是因为PNG格式具有更好的图片质量和更少的失真。JPG(或JPEG)格式的图片通常是压缩过的&#xf…

C# OpenVINO 人脸识别

效果 耗时 Preprocess: 1.41ms Infer: 4.38ms Postprocess: 0.03ms Total: 5.82ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Text; using Syste…

ChatGPT再次成为焦点:学生放弃导师,改用ChatGPT自学

据外媒报道,近日,知名高等教育规划平台 Intelligent.com 的一项 调查显示,学生和家长越来越喜欢使用 ChatGPT 而不是真人导师来进行学习了。 调查结果显示,学生对教育援助的看法发生了重大的转变。在最近的学年中,85% …

解决yarn删除代理不成功的问题

之前yarn配了代理,但是速度不稳定,所以换成了淘宝源。 然后发现速度还是很慢,有一天忘了开代理,结果依赖完全不能下载了,报错:info There appears to be trouble with your network connection. Retrying.…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时,在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…

Android笔记(三)多Activity活动的切换中的简化处理

多Activity实现的跳转简单实现 Activity定义移动的界面。在本例中,介绍多个活动之间的切换的简化通用的实现。在本例中,定义三个活动MainActivity、FirstActivity和SecondActivity.要求能从MainActivity分别切换到FirstActivity和SecondActivity&#x…