5

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

 2 years ago
source link: https://www.cloudwego.io/zh/blog/2022/06/21/%E8%B6%85%E5%A4%A7%E8%A7%84%E6%A8%A1%E7%9A%84%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%BE%AE%E6%9C%8D%E5%8A%A1-http-%E6%A1%86%E6%9E%B6-hertz-%E6%AD%A3%E5%BC%8F%E5%BC%80%E6%BA%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

By CloudWeGo | Tuesday, June 21, 2022

今天,经过了字节跳动内部一年多的使用和迭代,高性能企业级 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 数据。
image

在内部实践中,某些典型服务,如框架占比较高的服务、网关等服务,迁移 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 发布以来,内部反响优异。在内部,除最常见的前后端通信场景外,还涉及网关、上传、下载、代理等场景;所用到的交互模式除 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。

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

04 相关链接

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

项目官网:https://www.cloudwego.io


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK