超大规模的企业级微服务 HTTP 框架 — Hertz 正式开源!

本文介绍了字节跳动正式开源超大规模的企业级微服务 HTTP 框架 — Hertz。

今天,经过了字节跳动内部一年多的使用和迭代,高性能企业级 HTTP 框架—— Hertz,已在 CloudWeGo 正式开源啦!Hertz 已经成为了字节跳动内部最大的 HTTP 框架,线上接入的服务数量超过 1 万, 峰值 QPS 超过 4 千万,具有 高易用性易扩展低时延的特点。对于字节跳动服务框架团队和 CloudWeGo 而言,Hertz 将不仅仅是一个开源项目,它也是一个真实的超大规模企业级实践。

项目地址:https://github.com/cloudwego/hertz

未来,字节跳动基础架构团队将以 Hertz 开源库为主进行迭代,坚持内外维护一套代码,统一进行迭代演进,为用户提供更好的体验。

01 Hertz 概述

Hertz 是一个超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。最初,字节跳动内部的 HTTP 框架是对 Gin 框架的封装,具备不错的易用性、生态完善等优点。 随着内部业务的不断发展,对高性能、多场景的需求日渐强烈。而 Gin 是对 Golang 原生 net/http 进行的二次开发,在按需扩展和性能优化上受到很大局限。 因此,为了满足业务需求,更好的服务各大业务线,2020 年初,字节跳动服务框架团队经过内部对使用场景和外部主流开源 HTTP 框架 Fasthttp、Gin、Echo 的调研后, 开始基于自研网络库 Netpoll 开发内部框架 Hertz,让 Hertz 在面对企业级需求时,有更好的性能及稳定性表现,也能够满足业务发展和应对不断演进的技术需求。 2021 年 7 月,Hertz 正式上线 1.0 版本。

在经历了字节跳动内部一年多的使用后,Hertz 框架成为了字节跳动内部最大的 HTTP 框架,线上接入的服务数量超过 1 万,峰值 QPS 超过 4 千万Hertz 除了业务线的同学使用外,也服务于内部很多基础组件,如:函数计算平台 FaaS、压测平台、各类网关、Service Mesh 控制面等,均收到不错的使用反馈。 在如此大规模的场景下,Hertz 拥有极强的稳定性和性能,bug 和 kernel case 也几乎暴露无遗并进行修复。同时 Hertz 坚持的内外维护一套代码,也为开源出去的 Hertz 框架提供了强有力的保障。

下面是 Hertz 的一些特性:

  • 稳定性

    Hertz 在如此大规模的场景下,每一个 PR 的合入、每一次发版都要慎之又慎,稍有不慎便可能造成千万甚至更多的损失。我们制定了规范的 PR、发版流程,每次合入代码需要由有经验的同学审核。 即便如此,为了降低风险,我们也搭建了各种测试场景,包括兼容性、高并发、大小包等场景,每次的 PR、发版都需要测试一段时间,充分测试,将每次发版的风险减少到最低。

  • 高易用性

    在开发过程中,快速写出正确的代码往往是重要的。Hertz 在设计 API 时,考虑到用户的使用习惯,参考业界主流框架使用 API 的方式,并加以优化。在 Hertz 在迭代过程中,积极听取用户意见,持续打磨框架, 比如很多用户希望 Client 也有 Trace 的能力,为此,Hertz Client 支持了中间件能力;在代理场景中,Hertz Client 也支持了流式处理。 在做中间件和流式处理设计时,也考虑到用户实际使用习惯,帮助用户更快地写出正确的代码。Hertz 也提供了命令行工具,一键生成代码,提高框架的易用性。

  • 易扩展

    Hertz 采用了分层设计,提供了较多的接口以及默认的扩展实现,用户也可以自行扩展,详情可参考 CloudWeGo 官网的 Hertz 扩展部分。 同时得益于框架的分层设计,框架的扩展性也会大很多。目前仅将稳定的能力开源给社区,更多的规划参考 RoadMap。

  • 低延时

    Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景中,相较于 go net,Hertz 在 QPS、时延上均具有一定优势。关于性能数据,可参考下图 Echo 数据。 在内部实践中,某些典型服务,如框架占比较高的服务、网关等服务,迁移 Hertz 后相比 Gin 框架,资源使用显著减少,CPU 使用率随流量大小降低 30%—60%。 关于详细的性能数据,可参考:https://github.com/cloudwego/hertz-benchmark。

    image

    • 命令行工具

    Hertz 提供了一个简单易用的命令行工具 Hz,用户只需提供一个 IDL,根据定义好的接口信息,Hz 便可以一键生成项目脚手架,开箱即用使用 Hertz;Hz 也提供更新能力,用户的 IDL 如果发生改变,Hz 可以更新脚手架。 目前 Hz 支持了 Thrift 和 Protobuf 两种 IDL 定义。命令行工具内置丰富的选项,可以根据自己的需求使用。 同时它底层依赖 Protobuf 官方的编译器和自研的 Thriftgo 的编译器,两者都支持自定义的生成代码插件。如果觉得默认模板不能够满足的需求,可以自定义生成的模板。

Hertz 发布以来,内部反响优异。在内部,除最常见的前后端通信场景外,还涉及网关、上传、下载、代理等场景;所用到的交互模式除 ping-pong 外,还有 streaming、chunk 等; 使用的协议除 HTTP1 外,还有 HTTP2、Websocket 等。这些复杂的交互场景和交互模式都对 Hertz 的 Server 和 Client 的可用性和稳定性提出了不小的挑战。 为此,Hertz 快速响应用户需求;搭建稳定性测试服务尽可能模拟线上真实复杂场景;较高的单测覆盖率保证代码逻辑正常。

02 内外版本维护

字节跳动内部有着完善的微服务体系,团队非常重视开源建设和承诺,Hertz 和 CloudWeGo 中的开源项目 Kitex 相同,保持内外一致,项目的核心能力均迁移至开源库中, 在内部仅封装一层壳帮助企业内无感升级,以保证对开源长期维护的承诺,并且所有开源特性,都会在内部的稳定性验证后才会开源出来

后续,团队将持续以 Hertz 开源库为主进行迭代,及时响应社区需求与问题,为用户提供更好的体验和使用保障。

对于 Hertz 的开发者来说,Hertz 同样支持对框架进行灵活的扩展,以适应业务需求。我们也欢迎外部的开发者将自己的贡献提交到社区当中,在社区进行开源共建,共同打造一款有着完善生态、极致性能和高易用性的 HTTP 框架。

03 RoadMap

对于基础架构团队而言,Hertz 不仅仅是一个开源项目,它也是一个真实的超大规模企业级实践项目。通过开源,我们希望 Hertz 能丰富云原生社区的 Golang 中间件体系, 完善 CloudWeGo 生态矩阵,为更多开发者和企业搭建云原生化的大规模分布式系统,提供一种现代的、资源高效的的技术方案。

如前文所述,目前 Hertz 只开源了内部经过稳定性验证的部分,未来,我们会进一步推动其走向完善:

  • 云原生能力支持。支持 xDS API,从 Istio 动态获取服务配置。
  • 多协议的支持Hertz 目前只开源了 HTTP1 的部分,未来我们还会开源其他协议,如:HTTP2、Websocket、ALPN 等,为开发者提供更多场景的微服务需求支持。如果有需求也可以提交 issue 告诉我们,让我们知道您的需求以便快速支持。
  • 更好用的命令行工具。我们将继续迭代 Hz,持续集成各种常用的中间件,提供模块化构建能力,用户可以按需选择所需组件。
  • 更完善的生态支持。由于 Hertz 没有采用 go net 的数据结构,需要更多的生态支持。第一批开源我们只开源了 CORS、Trace、Metrics 等生态。未来我们还将支持包括反向代理、Session 等生态。
  • 结合内外部用户需求,持续迭代。项目开源后,我们也会根据开发者需求开展迭代。

欢迎大家向 Hertz 提交 issue 和 PR 一起来共建。

我们诚心期待更多的开发者加入,也期待 Hertz 助力越来越多的企业快速构建云原生架构。我们也真诚欢迎企业用户迁移使用,我们会提供专项技术支持和交流,欢迎入群咨询。

04 相关链接