Brotli 是一种全新的数据格式, 可以提供比 Zopfli 高 20-26% 的压缩比. 据谷歌研究, Brotli 压缩速度同 zlib 的 Deflate 实现大致相同, 而在 Canterbury 语料库上的压缩密度比 LZMA 和 bzip2 略大. 链接: http://www.infoq.com/cn/news/2015/10/Google-Brotli-Zotfli Google 开源 Brotli 压缩算法 http://www.infoq.com/cn/news/2015/10/Google-Brotli-Zotfli 微软使用了一种基于谷歌提供的 C 代码的实现, 向. NET Core 2.1 添加了 Brotli 压缩支持. 由于 Brotli 得到了许多 web 浏览器和 Web 服务器的广泛支持, 所以. NET Core 提供对这项技术的支持是非常有用的.
什么是 Brotli 压缩算法
Brotli 最初发布于 2015 年, 用于网络字体 https://zh.wikipedia.org/wiki/Web開放字型格式 的离线压缩. Google 软件工程师在 2015 年 9 月发布了包含通用无损数据压缩 https://zh.wikipedia.org/wiki/无损数据压缩 的 Brotli 增强版本, 特别侧重于 HTTP 压缩 https://zh.wikipedia.org/wiki/HTTP压缩 . 其中的编码器被部分改写以提高压缩比, 编码器和解码器都提高了速度, 流式 API 已被改进, 增加更多压缩质量级别. 新版本还展现了跨平台的性能改进, 以及减少解码所需的内存.
与常见的通用压缩算法不同, Brotli 使用一个预定义的 120 千字节 https://zh.wikipedia.org/wiki/千字节 字典. 该字典包含超过 13000 个常用单词, 短语和其他子字符串, 这些来自一个文本和 html 文档的大型语料库 https://zh.wikipedia.org/wiki/语料库 . 预定义的算法可以提升较小文件的压缩密度.
使用 brotli 替换 deflate https://zh.wikipedia.org/wiki/DEFLATE 来对文本文件 https://zh.wikipedia.org/wiki/文本文件 压缩通常可以增加 20% 的压缩密度, 而压缩与解压缩速度则大致不变. 使用 Brotli 进行流压缩的内容编码类型 https://zh.wikipedia.org/wiki/HTTP压缩 已被提议使用 "br".
摘自: https://zh.wikipedia.org/wiki/Brotli
另附 Brotli 算法和其他算法的性能比较:
- https://cran.r-project.org/web/packages/brotli/vignettes/benchmarks.html
- https://hacks.mozilla.org/2015/11/better-than-gzip-compression-with-brotli/
大部分浏览器都已经支持 Brotli 压缩
所以, 除了 gzip 之外, 该是支持 Brotli 的时候了! 有关 ASP.NET 核心响应压缩中间件: https://docs.microsoft.com/zh-cn/aspnet/core/performance/response-compression?view=aspnetcore-2.1&tabs=aspnetcore2x , 这篇文章中已经介绍了在 asp.net core 中使用 GzipCompressionProvider, 同时也介绍了自定义提供程序来支持 Brotli 压缩, 微软. net 团队博客有篇文章详细的介绍了 Brotli https://blogs.msdn.microsoft.com/dotnet/2017/07/27/introducing-support-for-brotli-compression/ .
在 netcoreapp2.1 包里面包含了 System.IO.Compression.Brotli
响应压缩中间件查看请求的头部并检查压缩提供者是否可以处理其中一种可接受的编码. 默认情况下, 只支持 gzip 算法. 通过实施自定义压缩提供程序来支持自定义编码. 自定义提供程序必须实现该
ICompressionProvider
接口. 该接口包含一个具有编码名称的属性以及一个创建压缩流的方法. System.IO.Compression.Brotli.dll 提供了一个 BrotliStream 类, 所以实现非常简单:
- public class BrotliCompressionProvider : ICompressionProvider
- {
- public string EncodingName => "br";
- public bool SupportsFlush => true;
- public Stream CreateStream(Stream outputStream)
- {
- return new BrotliStream(outputStream,CompressionLevel.Fastest);
- }
- }
客户端提交的请求 Accept-Encoding: br 标头. 该中间件使用自定义压缩的实现, 并返回响应, 其中
Content-Encoding: br
标头. 客户端必须能够解压缩顺序用于工作的自定义压缩实现的自定义编码 brotli .
Vary 和 Content-Encoding 标头会显示在响应. 当压缩响应基于 Accept-Encoding 标头, 有可能的多个压缩的版本响应和未压缩的版本. 若要指示客户端和代理服务器缓存, 多个版本存在, 并且应存储 Vary 标头添加与 Accept-Encoding 值.
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddResponseCompression(options =>
- {
- options.Providers.Add<BrotliCompressionProvider>();
- options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
- });
- }
- public void Configure(IApplicationBuilder app)
- {
- app.UseResponseCompression();
- app.UseStaticFiles();
- app.UseMvcWithDefaultRoute();
- }
来源: https://www.cnblogs.com/shanyou/p/9154816.html