字节跳动自研 HTTP 框架 Hertz
Hertz 是字节跳动自研的高性能 HTTP 框架,专为高并发、低延迟的场景设计。它基于 Go 语言开发,结合了字节跳动在微服务架构中的实践经验,旨在提供更高效的 HTTP 服务开发体验。
https://i-blog.csdnimg.cn/direct/eea8040792594e4d9ef029cb8e7d9794.png" alt="在这里插入图片描述" />
1. 背景介绍
随着字节跳动业务的快速发展,传统的 HTTP 框架(如 Gin、Echo 等)在高并发场景下逐渐暴露出性能瓶颈。为了满足业务需求,字节跳动团队决定自研一款高性能的 HTTP 框架,Hertz 应运而生。
Hertz 的设计目标是:
- 高性能:在高并发场景下提供更低的延迟和更高的吞吐量。
- 易用性:提供简洁的 API 和丰富的功能,降低开发成本。
- 可扩展性:支持插件化扩展,方便集成各种中间件和工具。
2. 核心特性
Hertz 具有以下核心特性:
高性能
- 基于 net/http 优化:Hertz 在 Go 标准库
net/http
的基础上进行了深度优化,减少了不必要的内存分配和系统调用。 - 零拷贝技术:通过零拷贝技术减少数据复制,提高数据传输效率。
- 高效路由:使用 Radix Tree 实现高效的路由匹配,支持动态路由和参数解析。
易用性
- 简洁的 API:Hertz 提供了类似 Gin 的 API 设计,开发者可以快速上手。
- 丰富的中间件:内置了日志、限流、熔断等常用中间件,支持自定义中间件。
- 自动生成代码:通过代码生成工具自动生成路由、模型和接口代码,减少手动编码工作量。
可扩展性
- 插件化架构:Hertz 支持插件化扩展,开发者可以轻松集成第三方工具和服务。
- 多协议支持:除了 HTTP/1.1,还支持 HTTP/2 和 gRPC,满足多种业务场景需求。
3. 架构设计
Hertz 的架构设计分为以下几个核心模块:
路由模块
- Radix Tree:使用 Radix Tree 实现高效的路由匹配,支持动态路由和参数解析。
- 路由分组:支持路由分组,方便管理和维护大型项目。
中间件模块
- 链式调用:中间件采用链式调用模式,支持按需加载和组合。
- 内置中间件:提供了日志、限流、熔断、鉴权等常用中间件。
上下文模块
插件模块
- 插件化设计:支持通过插件扩展框架功能,如集成 Prometheus 监控、Jaeger 分布式追踪等。
4. 性能优化
Hertz 在性能优化方面做了大量工作,主要包括:
减少内存分配
- 对象池技术:通过对象池复用内存对象,减少 GC 压力。
- 零拷贝技术:减少数据复制,提高数据传输效率。
高效路由匹配
- Radix Tree:使用 Radix Tree 实现高效的路由匹配,减少匹配时间。
并发控制
- 协程池:通过协程池限制并发 Goroutine 数量,避免资源耗尽。
- 限流和熔断:内置限流和熔断机制,防止服务过载。
5. 使用场景
Hertz 适用于以下场景:
高并发服务
- 推荐系统:为推荐系统提供低延迟的 HTTP 接口。
- 广告系统:支持高并发的广告请求处理。
微服务架构
- API 网关:作为微服务架构中的 API 网关,提供统一的入口和路由。
- 内部服务:用于构建高性能的内部微服务。
实时数据处理
- 消息推送:支持实时消息推送服务。
- 数据采集:用于高并发的数据采集和处理。
代码示例
基本使用
package mainimport ("github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server"
)func main() {h := server.Default()h.GET("/hello", func(c *app.Context) {c.String(200, "Hello, Hertz!")})h.Spin()
}
使用中间件
package mainimport ("github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server""github.com/cloudwego/hertz/pkg/common/middleware"
)func main() {h := server.Default()// 使用日志中间件h.Use(middleware.Logger())h.GET("/hello", func(c *app.Context) {c.String(200, "Hello, Hertz with Middleware!")})h.Spin()
}
数据绑定
package mainimport ("github.com/cloudwego/hertz/pkg/app""github.com/cloudwego/hertz/pkg/app/server"
)type User struct {Name string `json:"name"`Age int `json:"age"`
}func main() {h := server.Default()h.POST("/user", func(c *app.Context) {var user Userif err := c.Bind(&user); err != nil {c.String(400, "Bad Request")return}c.JSON(200, user)})h.Spin()
}