为什么要Gzip信息,是因为数据传输(data transfer)。
传输一个压缩的数据占用更少的带宽,它将让用户更快。
这个的缺点是什么,压缩或者是解压一个文件,或者是一块信息消耗CPU,并不是免费的。
关键的事情是,实际上CPU和消耗的时间来压缩内容,省下的时间比消耗的成本要高得多。
有趣的事情是,可以考虑的是移动网络。
我想,当你设计一个系统时候,如果你构建一个消费级的产品,需要考虑受众。
如果用户在使用浏览器在一个快速的电脑上,有宽带网络,事情非常的不同与他们使用移动网络。
即使他们有一个好的移动网络,4G连接,甚至是5G连接,连接依然不好。
ping比较高,花费更多的时间传输数据,连接花费更长时间,丢包更多。
你想要创建一个好的用户体验,要考虑移动端的用户。
使用curl可以从服务器下载图片。
被发送的数据按照字面,是直接从硬盘上的流,发送到电脑端完全没有压缩的状态。
现在,我们想要做的事情是,想要实现让这个可配置为gzip。
如果用户端可以接受压缩的内容,我们应该在按流发送到浏览器之前压缩文件。
看看如何实现,实现一个新的中间件。
我们希望能够服务信息作为gzip。
我们需要做的第一件事情是响应。
当一个http客户端请求,它可以用gzip来处理内容。
除了加密之外,它将发送Header。
如果我们打开浏览器,Accept-Encoding请求会将客户端能够理解的内容编码方式,通常是客户端可以理解的某种压缩算法。当我们没有这个Accept-Encoding,或者有一些不能理解的东西,直接送会纯文本。
我们可以从ResponseWriter中获取头信息。
Header事实上可以接收一个逗号分隔的列表。
为什么使用一个middleware。
使用http.HandlerFunc把一个函数转化为http.Handler
--compressed告诉curl我们可以接受gzip压缩,并且自动为我们解压内容。
流化文件用gzip数据,Go有能力包裹流在一个gzip流中。
创建一个gzip的响应,如果不能接受gzip格式。调用next.ServeHttp。
ResponseWriter是一个接口,它自己有特定的方法。
只要我们实现这个ResponseWriter接口,就可以创建自己的ResponseWriter。
现在,为了获得这里的ResponseWriter。
gzip.Writer在compress/gzip包中,是Go的标准库特性。
实现了Go标准的Reader和Writer interface。
无论何时你有一个Reader或者是Writer,你可以使用,它将自动的编码或者解码流的内容,Reader或者Writer到一个zip的格式,
惯用的方法,创建一个新的ResponseWriter。
Flush,冲刷没有被发送出去的任何事情。
是一个显著的减少,大量的不同当处理不好的连接,移动连接。
服务端的开销,将使用一些CPU因为我们在压缩内容,可以寻找到一种平衡。
通常,使用gzip为你的对外的文件是一个有用的事情。
仅仅限于gzip文件,不是能够gzip任何可以被写入到body。
相关与客户端是否能够解码。