字节跳动自研HTTP开源框架Hertz简介附使用示例
字节跳动自研 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 网关,提供统一的入口和路由。
- 内部服务:用于构建高性能的内部微服务。
实时数据处理
- 消息推送:支持实时消息推送服务。
- 数据采集:用于高并发的数据采集和处理。
代码示例
基本使用
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()
}
相关文章:
字节跳动自研HTTP开源框架Hertz简介附使用示例
字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架,专为高并发、低延迟的场景设计。它基于 Go 语言开发,结合了字节跳动在微服务架构中的实践经验,旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…...
skynet 源码阅读 -- 核心概念服务 skynet_context
本文从 Skynet 源码层面深入解读 服务(Service) 的创建流程。从最基础的概念出发,逐步深入 skynet_context_new 函数、相关数据结构(skynet_context, skynet_module, message_queue 等),并通过流程图、结构…...
每日十题八股-2025年1月23日
1.快排为什么时间复杂度最差是O(n^2) 2.快排这么强,那冒泡排序还有必要吗? 3.如果要对一个很大的数据集,进行排序,而没办法一次性在内存排序,这时候怎么办? 4.面试官:你的…...
MongoDB部署模式
目录 单节点模式(Standalone) 副本集模式(Replica Set) 分片集群模式(Sharded Cluster) MongoDB有多种部署模式,可以根据业务需求选择适合的架构和部署方式。 单节点模式(Standa…...
opencv笔记2
图像灰度 彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有256*256*256变化。而灰度图像是R,G,B三个分量…...
springboot使用ssl连接elasticsearch
使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...
Linux内核中的InfiniBand核心驱动:verbs.c分析
InfiniBand(IB)是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux内核中的InfiniBand子系统通过提供一组核心API(称为Verbs API)来支持InfiniBand设备的操作。drivers/infiniband/core/verbs.c是InfiniBand核心驱动的重要组…...
把网站程序数据上传到服务器的方法和注意事项
将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法: 使用FTP: 1. 选择FTP客户端软件: - 常见的FTP客户端包括FileZilla(开源)、…...
完全平方数——唯一分解定理
文章目录 一、唯一分解定理是什么?1.定义2.示例3.代码模板 二、例题1>问题描述(2021蓝桥杯省赛)输入格式输出格式样例输入 1样例输出 1样例输入 2样例输出 2评测用例规模与约定 2>解题思路3>假娃3>C嘎嘎 一、唯一分解定理是什么&…...
(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源
文章目录 Springboot 整合多动态数据源 这里有mysql(分为master 和 slave) 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码,不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql(分为maste…...
mock可视化生成前端代码
介绍:mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件,来解决我们的问题。目前支持vite和webpack。(配置超级简单!) 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…...
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中,我们常常会遇到各种有趣且具有挑战性的问题。今天,我们就来深入探讨一个在实际开发中较为常见的问题:当连续快速发送 Post 请求时,前端会弹出 “数据正在处理,请…...
鸿蒙Harmony json转对象(1)
案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …...
常见的RocketMQ面试题及其简要答案
以下是一些常见的RocketMQ面试题及其简要答案: 一、基础概念与架构 简述RocketMQ是什么,并说明其主要作用。 答案: RocketMQ:是阿里巴巴在2012年开源的一款分布式消息中间件,目前已经捐赠给Apache软件基金会ÿ…...
C#Object类型的索引,序列化和反序列化
前言 最近在编写一篇关于标准Mes接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性,所以我一开始选取了Object类型作为数据类型,Object作为数据Value字段,String作为数据Key字段,…...
Unity3D项目开发中的资源加密详解
前言 在Unity3D游戏开发中,保护游戏资源不被非法获取和篡改是至关重要的一环。资源加密作为一种有效的技术手段,可以帮助开发者维护游戏的知识产权和安全性。本文将详细介绍Unity3D项目中如何进行资源加密,并提供相应的技术详解和代码实现。…...
微调Qwen2:7B模型,加入未知信息语料
对于QWen2这样的模型,在微调的时候,语料的投喂格式满足ChatML这样的格式!!! OpenAI - ChatML: 下面是ChatML格式的介绍: https://github.com/openai/openai-python/blob/release-v0.28.0/chatml.mdhttps://github.com/openai/openai-python/blob/release-v0.28.0/chat…...
【Ubuntu】安装SSH启用远程连接
【Ubuntu】安装OpenSSH启用远程连接 零、安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server壹、启动服务 使用如下代码启动OpenSSH服务端: sudo systemctl start ssh贰、配置SSH(可跳过) 配置文件 …...
【理论】测试开发工程师进阶路线
一、腾讯与阿里的质量保证服务参考 阿里云效测试能力与架构 腾讯 WeTest 测试能力全景图 二、测试开发技术体系 1.用户端测试: Web/App 测试 Web/App 自动化测试 用户端专项测试 用户端安全测试 2.服务端测试: 接口协议与 Mock 接口自动化测试 服务端…...
【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证
引言 前面已经对BQ3568HM开发板进行了初步测试,后面我要实现MQTT的工作,但是遇到一个问题,就是开发板无法通过校园网的认证操作。未认证的话会,学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...
javase的第一次博客
1,计算机简介:用于数据计算和处理2,计算机的硬件和软件:计算机硬件:运算器,控制器,存储器,输入设备,输出设备(冯 诺依曼模型)CPU:运算…...
【05-log-+-diff:看懂你改了什么、历史是什么】
第五篇:log diff:看懂你改了什么、历史是什么会提交只是第一步,会"读"历史才是真的用上了 Git。这篇教你把 log 和 diff 玩出花来。git log:查看提交历史 git log默认输出太详细,通常用这些参数来精简&…...
告别混乱!用Power BI工作区高效管理跨部门报表:数据集/仪表板/报告编排技巧
告别混乱!用Power BI工作区高效管理跨部门报表:数据集/仪表板/报告编排技巧 在数据驱动的商业环境中,跨部门协作常陷入"数据孤岛"困境——财务部的销售分析需要市场部的活动数据,运营部的库存报表又依赖采购部的供应商信…...
DeepCAD实战指南:AI驱动CAD模型生成的终极解决方案
DeepCAD实战指南:AI驱动CAD模型生成的终极解决方案 【免费下载链接】DeepCAD code for our ICCV 2021 paper "DeepCAD: A Deep Generative Network for Computer-Aided Design Models" 项目地址: https://gitcode.com/gh_mirrors/de/DeepCAD DeepC…...
RePKG全解析:从资源提取到壁纸开发的终极解决方案
RePKG全解析:从资源提取到壁纸开发的终极解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字内容创作领域,尤其是动态壁纸开发和游戏资源处理中&…...
3个高效步骤解决猫抓扩展资源嗅探故障
3个高效步骤解决猫抓扩展资源嗅探故障 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(Cat Catch)作为一款浏览器资源嗅…...
阿里云RDSClaw:给OpenClaw装上超级记忆和超级大脑,会怎样?
RDSClaw 喊你领取免费试用了!点击下方训练营,可领取免费试用,跟随训练营中的课程可轻松部署你的专属小龙虾! 训练营报名链接:养虾训练营- RDSClaw_阿里云培训中心-阿里云 参营福利:完成RDSClaw实操部署&a…...
小型工作室利器:OpenClaw+Qwen3.5-9B实现设计稿自动标注
小型工作室利器:OpenClawQwen3.5-9B实现设计稿自动标注 1. 为什么我们需要设计稿自动标注 作为一个小型设计工作室的技术负责人,我最近一直在寻找解决团队协作痛点的方案。设计师们每天都要花费大量时间手动标注PSD文件中的图层尺寸、间距和颜色值&…...
从洛伦兹吸引子到三体问题:用Python RK45方法探索混沌与天体物理的奇妙世界
从洛伦兹吸引子到三体问题:用Python RK45方法探索混沌与天体物理的奇妙世界 混沌系统与天体运动看似毫不相关,却共享着对初始条件极度敏感的数学本质。1963年,气象学家爱德华洛伦兹在简化大气对流模型时,意外发现了"蝴蝶效应…...
保姆级教学:用星图AI云平台快速搭建Clawdbot,让Qwen3-VL:30B接入飞书
保姆级教学:用星图AI云平台快速搭建Clawdbot,让Qwen3-VL:30B接入飞书 1. 为什么选择本地部署多模态办公助手? 在日常办公中,我们经常遇到需要处理图片和文字的场景: 同事发来的产品截图需要快速分析内容会议白板照片…...
