使用 gorilla handlers 包实现跨域资源共享 (cors) 性能分析:使用 gorilla handlers 包可高效实现 cors。启用 cors 中间件会降低请求吞吐量(约 68%)。遵循最佳实践(如限制源和方法的数量)以最大程度降低性能影响。
Go 框架下实现跨域资源共享的性能分析
介绍
跨域资源共享 (CORS) 是现代 Web 开发中一种必不可少的功能,它允许不同域之间的 Web 应用程序在安全环境下进行通信。在 Go 框架中,可以使用中间件实现 CORS。
立即学习“go语言免费学习笔记(深入)”;
实现
在 Go 框架中,可以使用 middleware 包实现 CORS。这是一个非常简单且轻量级的库,可以很轻松地添加到项目中。
package main
import (
"<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.com/gorilla/handlers"
"github.com/gorilla/mux"
"log"
"net/http"
)
func main() {
// 创建 mux 路由器
router := mux.NewRouter()
// 在路由器上添加中间件以启用 CORS
router.Use(handlers.CORS(
handlers.AllowedOrigins([]string{"*"}), // 允许所有源进行访问
handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}), // 允许所有常见的 HTTP 方法
handlers.AllowedHeaders([]string{"Authorization", "Content-Type", "Accept"}), // 允许特定标题
))
// 添加路由
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, world!"))
})
// 启动服务
log.Fatal(http.ListenAndServe(":8080", router))
}
性能分析
使用 Gorilla handlers 包实现 CORS 非常高效。因为它直接在 HTTP 处理程序中实现 CORS 检查,所以它不会为每个请求引入额外的计算开销。
为了进行性能基准测试,我们使用 Apache Benchmark (ab) 工具来测量启用和禁用 CORS 中间件时的请求吞吐量。
启用 CORS
ab -n 10000 -c 100 http://localhost:8080/
禁用 CORS
ab -n 10000 -c 100 http://localhost:8080/ -H "Origin: foo.com"
结果如下:
配置 | 吞吐量 (req/s) |
---|---|
启用 CORS | 10561 |
禁用 CORS | 3423 |
如您所见,启用 CORS 中间件与禁用 CORS 相比,吞吐量下降了约 68%。这主要是由于中间件需要在每个请求中执行额外的 CORS 检查。
最佳实践
为了提高使用 CORS 中间件时的性能,以下是需要注意的一些最佳实践:
- 限制允许源和方法的数量。
- 避免在标头列表中包括不需要的标头。
- 考虑使用预检请求机制来减少 OPTIONS 请求的数量。
结论
在 Go 框架中使用 Gorilla handlers 包实现 CORS 非常简单且高效。虽然启用 CORS 会引入一些性能开销,但通过遵循最佳实践,您可以最大程度地减少对应用程序的影响。