进阶 www.iris-go.com 2026-10-20 02:39:14 · 17 阅读

第7章 HTTP/2 Push + 内嵌数据 + 内存缓存

HTTP/2 Push + 内嵌数据 + 内存缓存 欢迎来到 File Server 部分,本节能把你的 Web 应用性能提升到新层次。开启 HTTP/2 Push 后,可以直接提供内嵌文件,且压缩内容已预先缓存。截至 2023 年,这是其他后端 Web 框架都没有的独特功能。请先阅读前面的 File Server 章节,并阅读 Google 撰写的《HTTP/2 简介》,了解使用 HTTP/2 的好处。 简介 DirOptions 中有 PushTargets 和 PushTargetsRegexp 两个字段,用于开启并自定义 Index 页面资源(css、javascript、图片)的自动推送。 PushTargets 是一个文件名映射表,当某个相对路径命中 Index 时,这些文件会通过 HTTP/2 Push 直接推送,无需客户端额外发起请求。 例如,当客户端访问根路径(及 /index.html)时,自动推送指定的 favicon、javascript 和 css 资源: ```go var opts = iris.DirOptions{ IndexName: "index.html", PushTargets: map[string][]string{ "/": { "favicon.ico", "js/main.js", "css/main.css", }, }, } app.HandleDir("/", iris.Dir("./assets"), opts) ``` 也可以改用 PushTargetsRegexp 字段(推荐),基于正则表达式自动推送常见资源: ```go var opts = iris.DirOptions{ IndexName: "index.html", PushTargetsRegexp: map[string]*regexp.Regexp{ "/": iris.MatchCommonAssets, }, } app.HandleDir("/", iris.Dir("./assets"), opts) ```

iris.MatchCommonAssets 只是一个匹配 javascript、css、ico、png、ttf、svg、webp 和 gif 文件类型的正则表达式。示例 ​我们已经学习了嵌入式文件、内存缓存(含预压缩内容)和推送目标。现在,是时候将本文件服务器章节中的所有先验知识结合起来,创建并运行一个简单的 Web 服务器,用于提供 index 文件及其通过 HTTP/2 推送的资源。index 文件和资源都将由内存缓存提供服务,并基于客户端接受的 content-encoding 请求头,将预压缩内容写入客户端。我们将使用 go-bindata 和 Iris 内存缓存,从可执行程序的嵌入式文件中提供预压缩数据。本练习的资源目录可以在这里找到。最终,我们只需部署可执行文件(以及生成的 TLS 密钥,尽管您也可以传入公共和私钥的 Go 生成值),在第四步之后就不再需要资源物理文件夹。

  1. 创建一个目录来托管 Iris Web 服务器。
  2. 为了让 HTTP/2 推送生效,此 Web 服务器应使用 TLS 提供服务。为本地 Web 服务器生成密钥。为简化起见,本示例将使用 mycert.crt 和 mykey.key 文件。将它们放入项目文件夹内。
  3. 下载示例资源文件夹并将其放入项目文件夹中。
  4. 安装 go bindata,打开终端并执行以下命令: sh $ go get -u github.com/go-bindata/go-bindata/...
  5. 使用 go-bindata 生成一个与 http.FileServer 兼容的文件,并将其传入 Party.HandleDir: sh $ go-bindata -nomemcopy -fs -prefix "assets" ./assets/...
  6. 创建一个 main.go 文件并复制粘贴以下代码: go
    package main
    
    import (
    	"regexp"
    
    	"github.com/kataras/iris/v12"
    )
    
    var opts = iris.DirOptions{
    	IndexName: "index.html",
    	PushTargetsRegexp: map[string]*regexp.Regexp{
    		"/":              iris.MatchCommonAssets,
    		"/app2/app2app3": iris.MatchCommonAssets,
    	},
    	ShowList: true,
    	Cache: iris.DirCacheOptions{
    		Enable:         true,
    		CompressIgnore: iris.MatchImagesAssets,
    		Encodings:       []string{"gzip", "deflate", "br", "snappy"},
            // 压缩等于或大于 50 字节的文件。
            CompressMinSize: 50,
    		Verbose:         1,
    	},
    }
    
    func main() {
    	app := iris.New()
    	app.HandleDir("/public", AssetFile(), opts)
    	app.Run(iris.TLS(":443", "mycert.crt", "mykey.key"))
    }
    

20
21
22
23
24
25
26
27
28
29
30
6. 打开终端并运行 `go build` 或 `go run .` 7. 打开浏览器或任意 HTTP 客户端,依次访问以下地址: https://127.0.0.1/public https://127.0.0.1/public/app2 https://127.0.0.1/public/app2/app2app3 https://127.0.0.1/public/app2/app2app3/dirs 至此完成。

评论 (0)