字节跳动自研HTTP开源框架Hertz简介附使用示例

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

字节跳动自研 HTTP 框架 Hertz

Hertz 是字节跳动自研的高性能 HTTP 框架,专为高并发、低耽误的场景筹划。它基于 Go 语言开辟,结合了字节跳动在微服务架构中的实践经验,旨在提供更高效的 HTTP 服务开辟体验。


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 实现高效的路由匹配,支持动态路由和参数剖析。
  • 路由分组:支持路由分组,方便管理和维护大型项目。
中间件模块



  • 链式调用:中间件采用链式调用模式,支持按需加载和组合。
  • 内置中间件:提供了日志、限流、熔断、鉴权等常用中间件。
上下文模块



  • Context 封装:对 http.Request 和 http.ResponseWriter 进行了封装,提供了更简洁的 API。
  • 数据绑定:支持 JSON、XML、表单等数据格式的自动绑定和验证。
插件模块



  • 插件化筹划:支持通过插件扩展框架功能,如集成 Prometheus 监控、Jaeger 分布式追踪等。

4. 性能优化

Hertz 在性能优化方面做了大量工作,主要包括:
减少内存分配



  • 对象池技术:通过对象池复用内存对象,减少 GC 压力。
  • 零拷贝技术:减少数据复制,提高数据传输服从。
高效路由匹配



  • Radix Tree:使用 Radix Tree 实现高效的路由匹配,减少匹配时间。
并发控制



  • 协程池:通过协程池限定并发 Goroutine 数量,避免资源耗尽。
  • 限流和熔断:内置限流和熔断机制,防止服务过载。

5. 使用场景

Hertz 适用于以下场景:
高并发服务



  • 推荐系统:为推荐系统提供低耽误的 HTTP 接口。
  • 广告系统:支持高并发的广告哀求处置惩罚。
微服务架构



  • API 网关:作为微服务架构中的 API 网关,提供统一的入口和路由。
  • 内部服务:用于构建高性能的内部微服务。
实时数据处置惩罚



  • 消息推送:支持实时消息推送服务。
  • 数据收罗:用于高并发的数据收罗和处置惩罚。

     代码示例

根本使用
  1. package main
  2. import (
  3.     "github.com/cloudwego/hertz/pkg/app"
  4.     "github.com/cloudwego/hertz/pkg/app/server"
  5. )
  6. func main() {
  7.     h := server.Default()
  8.     h.GET("/hello", func(c *app.Context) {
  9.         c.String(200, "Hello, Hertz!")
  10.     })
  11.     h.Spin()
  12. }
复制代码
使用中间件
  1. package main
  2. import (
  3.     "github.com/cloudwego/hertz/pkg/app"
  4.     "github.com/cloudwego/hertz/pkg/app/server"
  5.     "github.com/cloudwego/hertz/pkg/common/middleware"
  6. )
  7. func main() {
  8.     h := server.Default()
  9.     // 使用日志中间件
  10.     h.Use(middleware.Logger())
  11.     h.GET("/hello", func(c *app.Context) {
  12.         c.String(200, "Hello, Hertz with Middleware!")
  13.     })
  14.     h.Spin()
  15. }
复制代码
数据绑定
  1. package main
  2. import (
  3.     "github.com/cloudwego/hertz/pkg/app"
  4.     "github.com/cloudwego/hertz/pkg/app/server"
  5. )
  6. type User struct {
  7.     Name string `json:"name"`
  8.     Age  int    `json:"age"`
  9. }
  10. func main() {
  11.     h := server.Default()
  12.     h.POST("/user", func(c *app.Context) {
  13.         var user User
  14.         if err := c.Bind(&user); err != nil {
  15.             c.String(400, "Bad Request")
  16.             return
  17.         }
  18.         c.JSON(200, user)
  19.     })
  20.     h.Spin()
  21. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表