进阶 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)
```
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 至此完成。
iris.MatchCommonAssets 只是一个匹配 javascript、css、ico、png、ttf、svg、webp 和 gif 文件类型的正则表达式。示例 我们已经学习了嵌入式文件、内存缓存(含预压缩内容)和推送目标。现在,是时候将本文件服务器章节中的所有先验知识结合起来,创建并运行一个简单的 Web 服务器,用于提供 index 文件及其通过 HTTP/2 推送的资源。index 文件和资源都将由内存缓存提供服务,并基于客户端接受的 content-encoding 请求头,将预压缩内容写入客户端。我们将使用 go-bindata 和 Iris 内存缓存,从可执行程序的嵌入式文件中提供预压缩数据。本练习的资源目录可以在这里找到。最终,我们只需部署可执行文件(以及生成的 TLS 密钥,尽管您也可以传入公共和私钥的 Go 生成值),在第四步之后就不再需要资源物理文件夹。
- 创建一个目录来托管 Iris Web 服务器。
- 为了让 HTTP/2 推送生效,此 Web 服务器应使用 TLS 提供服务。为本地 Web 服务器生成密钥。为简化起见,本示例将使用 mycert.crt 和 mykey.key 文件。将它们放入项目文件夹内。
- 下载示例资源文件夹并将其放入项目文件夹中。
- 安装 go bindata,打开终端并执行以下命令:
sh$ go get -u github.com/go-bindata/go-bindata/... - 使用 go-bindata 生成一个与 http.FileServer 兼容的文件,并将其传入 Party.HandleDir:
sh$ go-bindata -nomemcopy -fs -prefix "assets" ./assets/... - 创建一个 main.go 文件并复制粘贴以下代码:
gopackage 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 至此完成。