近日,基础架构高性能 HTTP 框架 Hertz 在 CloudWeGo 正式开源。Hertz 是字节跳动内部最大的 HTTP 框架,线上接入的服务数量超过 1 万,峰值 QPS 超过 4 千万,具有高易用性、易扩展、低时延的特点。
项目地址:https://github.com/cloudwego/hertz
Hertz 概述
Hertz 是一个超大规模的企业级微服务 HTTP 框架,具有简单易用、易扩展、低时延等特点。最初,字节跳动内部的 HTTP 框架是对 Gin 框架的封装,它具备不错的易用性,生态也较为完善。随着内部业务的不断发展,业务对高性能、多场景的需求日渐强烈,而 Gin 是对 Golang 原生 net/http 进行的二次开发,在按需扩展和性能优化上受到很大局限。
为了满足业务需求,更好地服务各大业务线,2020 年初,基础架构服务框架团队基于对内部使用场景的认知,结合对外部主流开源 HTTP 框架 Fasthttp、Gin、Echo 的调研,开始开发内部框架 Hertz,使之有更好的性能及稳定性表现,既能满足字节业务发展,又能应对不断演进的技术需求。
2021 年 7 月,Hertz 正式上线 1.0 版本。
在经历了一年多的使用后,Hertz 框架成为了字节跳动内部最大的 HTTP 框架,资源中台线上接入的服务数量超过 1 万,峰值 QPS 超过 4 千万。除了被业务线的同学使用外,Hertz 也服务于内部很多基础组件,如函数计算平台 FaaS、压测平台、各类网关、Service Mesh 控制面等,均收到不错的使用反馈。
下面是 Hertz 的一些特性:
-
稳定性
Hertz 自诞生起就面对字节跳动超大规模业务场景,每个 PR 的合入、每次发版都要慎之又慎,否则就可能造成千万甚至更多的损失。
服务框架团队制定了规范的 PR、发版流程,每次合入代码需要由有经验的同学审核。同时,他们也搭建了包括兼容性、高并发、大小包等各种测试场景,每次的 PR、发版都需要经过充分测试,将发版风险降至最低。
-
高易用性
在开发过程中,快速正确写出代码十分重要。在设计 API 时,Hertz 考虑到用户的使用习惯,参考了业界主流框架使用 API 的方式,并加以优化。
在迭代过程中,Hertz 积极听取用户意见并持续打磨框架。比如很多用户希望 Client 拥有 Trace 能力,因此 Hertz Client 支持了中间件能力;在代理场景中,Hertz Client 支持了流式处理能力。在设计中间件和流式处理时,Hertz 也考虑到用户实际使用习惯,帮助用户更快地写出正确的代码。同时,Hertz 还提供了命令行工具,一键生成代码,提高框架的易用性。
-
易扩展
Hertz 采用分层设计,提供较多的接口以及默认的扩展实现,用户可以自行扩展,详情可参考 CloudWeGo 官网的 Hertz 扩展部分。同时得益于框架的分层设计,框架具备较好的扩展性。目前 Hertz 仅将稳定的能力开源给社区,更多的规划参考 RoadMap。
-
低延时
Hertz 默认使用自研的高性能网络库 Netpoll。在一些特殊场景中,相较于 go net,Hertz 在 QPS、时延上均具有一定优势。关于性能数据,可参考下图 Echo 数据。
在内部实践中,某些典型服务如框架占比较高的服务、网关等服务,迁移 Hertz 后相比 Gin 框架,它们的资源使用显著减少, CPU 使用率随流量大小降低 30%-60%。
关于详细的性能数据,可参考:https://github.com/cloudwego/hertz-benchmark。
-
命令行工具
Hertz 提供简单易用的命令行工具 Hz。用户只需提供一个 IDL,根据定义好的接口信息,Hz 便可以一键生成项目脚手架,开箱即用使用 Hertz;Hz 也提供更新能力,用户的 IDL 如果发生改变,Hz 可以更新脚手架。
目前 Hz 支持 Thrift 和 Protobuf 两种 IDL 定义,命令行 工具 内置丰富的选项,用户可以根据自己的需求使用。同时它底层依赖 Protobuf 官方的编译器和自研的 Thriftgo 的编译器,两者都支持自定义的生成代码插件。如果用户认为默认模板不能够满足需求,可以自定义生成的模板。
Hertz 自发布以来,内部反响优异。在内部,除最常见的前后端通信场景外,Hertz 还涉及网关、上传、下载、代理等场景;所用到的交互模式除 ping-pong 外,还有 streaming、chunk 等;使用的协议除 HTTP1 外,还有 HTTP2、Websocket 等。
复杂的交互场景和交互模式对 Hertz 的 Server 和 Client 的可用性和稳定性提出了不小的挑战。为此,Hertz 快速响应用户需求;搭建稳定性测试服务尽可能模拟线上真实复杂场景;较高的单测覆盖率保证代码逻辑正常。
内外版本维护
字节跳动内部拥有完善的微服务体系,基础架构团队非常重视开源建设和承诺。Hertz 同 CloudWeGo 中的开源项目 Kitex 一样,保持内外一致。项目的核心能力均迁移至开源库中,在内部仅封装一层壳帮助企业内无感升级,以保证对开源长期维护的承诺。所有开源特性都会经过内部的稳定性验证后,才会开源出来。
后续,基础架构团队将持续以 Hertz 开源库为主进行迭代,及时响应社区需求与问题,为用户提供更好的体验和使用保障。
对于 Hertz 的开发者来说,Hertz 支持对框架进行灵活扩展,以适应业务需求。欢迎外部开发者将自己的贡献提交到社区,在社区进行开源共建,共同打造一款拥有完善生态、极致性能和高易用性的 HTTP 框架。
RoadMap
Hertz 不仅仅是一个开源项目,也是一个真实的超大规模企业级实践项目。通过开源,基础架构团队希望 Hertz 能丰富云原生社区的 Golang 中间件体系,完善 CloudWeGo 生态矩阵,为更多开发者和企业搭建云原生化的大规模分布式系统,并提供现代的、资源高效的技术解决方案。
如前文所述,目前 Hertz 只开源了经过内部稳定性验证的部分,未来基础架构团队会进一步推动其走向完善:
-
云原生能力支持:支持 xDS API,从 Istio 动态获取服务配置。
-
多协议的支持:Hertz 目前只开源了 HTTP1 的部分,未来还会开源其他协议,如:HTTP2、Websocket、ALPN 等,为开发者提供更多场景的微服务需求支持。
-
更好用的命令行工具:基础架构团队将继续迭代 Hz,持续集成各种常用的中间件,提供模块化构建能力,用户可以按需选择所需组件。
-
更完善的生态支持:由于没有采用 go net 的数据结构,Hertz 需要更多的生态支持。目前基础架构团队只开源了 CORS、Trace、Metrics 等生态,未来还将支持反向代理、Session 等生态。
-
结合内外部用户需求,持续迭代:项目开源后,基础架构团队也会根据开发者需求开展迭代。
欢迎大家向 Hertz 提交 Issue 和 PR 共建 Hertz,基础架构团队诚心期待更多的开发者加入,也期待 Hertz 助力越来越多的企业快速构建云原生架构。
参考资料
-
Hertz: https://github.com/cloudwego/hertz
-
Hertz Doc: Hertz | CloudWeGo
-
字节跳动在 Go 网络库上的实践: 字节跳动在 Go 网络库上的实践 | CloudWeGo
-
CloudWeGo:CloudWeGo (github.com)
-
CloudWeGo 官网:CloudWeGo
为您推荐与 go 相关的帖子: