这是我参与「第五届青训营 」笔记创作活动的第 7 天
|| 🎶今日笔记🎶 ||
笔记内容:Hertz
====> Hertz <====
前言 —>
Go开发三件套中的ORM框架-Gorm和RPC框架Kitex都已经介绍过,今天介绍HTTP框架Hertz。首先了解有了RPC框架了为什么还需要使用http框架?RPC框架主要用于系统内部服务之间,它效率高且没有多余的信息。而Http框架主要用于前端和后端之间,用于向外部暴露出来的接口,是更加通用的传输协议。
阅读 www.cloudwego.io/zh/docs/her… 尝试运行 Hertz 的示例代码
- Hertz 框架地址: github.com/cloudwego/h…
什么是 Hertz ?
Hertz[həːts]是一个用于 Go的高性能、高可用性、可扩展的HTTP 框架。它旨在为开发人员简化构建微服务。
为什么选择Hertz
Hertz 是字节跳动服务框架团队研发的超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。在经过了字节跳动内部一年多的使用和迭代后,如今已在 CloudWeGo 正式开源。目前,Hertz 已经成为了字节跳动内部最大的 HTTP 框架,线上接入的服务数量超过 1 万,峰值 QPS 超过 4 千万。
除了各个业务线的同学使用外,也服务于内部很多基础组件,如:函数计算平台 FaaS、压测平台、各类网关、Service Mesh 控制面等,均收到不错的使用反馈。在如此大规模的场景下,Hertz 拥有极强的稳定性和性能,在内部实践中某些典型服务,如框架占比较高的服务、网关等服务,迁移 Hertz 后相比 Gin 框架,资源使用显著减少,CPU 使用率随流量大小降低 30%—60%,时延也有明显降低。
Hertz也是字节开源的框架,具有高易用性、易扩展、低时延等特点。是基于自研网络库Netpoll开发的内部框架Hertz。Hertz框架整体上满足:
- 极致性能优化的问题性
- 面对未来不可控需求的扩展能力,Hertz采用了4层分层设计(应用层、路由层、协议层、传输层),保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标
03架构设计 Hertz 设计之初调研了大量业界优秀的 HTTP 框架,同时参考了近年来内部实践中积累的经验。为了保证框架整体上满足:1. 极致性能优化的可能性;2. 面对未来不可控需求的扩展能力, Hertz 采用了 4 层分层设计,保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标。整体架构图如图所示。
Hertz 从上到下分为:应用层、路由层、协议层和传输层,每一层各司其职,同时公共能力被统一抽象到公共层(Common),做到跨层级复用。另外,同主库一同发布的还有作为子模块的 Hz 脚手架,它能够协助使用者快速搭建出项目核心骨架以及提供实用的构建工具链。
应用层
主要包括与用户直接交互的易用的API,主要包括Server、Client和一些其他通用抽象。
路由层
Hertz在设计路由时,给了用户极高的自由度去注册路由。Hertz提供了路由组(Group)的能力,用于支持路由分组的功能。使用分组路由可以让代码便于管理和扩展,过修改路由分组可以非常轻松扩展出另外一套API接口。
v1 := h.Group("/v1")
{
v1.GET("/login", func(c context.Context, ctx *app.RequestContext) {
})
}
v2 := h.Group("/v2")
{
v2.GET("/login", func(c context.Context, ctx *app.RequestContext) {
})
}
协议层
协议层负责不同协议的实现和扩展。Hertz支持协议的扩展,用户只需要实现下面的接口便可以按照自己的需求在引擎上扩展协议,同时也支持通过ALPN协议协商的方式注册。Hertz首批只开源了 HTTP1 实现,未来会陆续开源 HTTP2、QUIC 等实现。协议层扩展提供的灵活性甚至可以超越 HTTP 协议的范畴,用户完全可以按需注册任意符合自身需求的协议层实现,并且加入到Hertz的引擎中来,同时,也能够无缝享受到传输层带来的极致性能。
传输层
传输层负责底层的网络库的抽象和实现Hertz支持底层网络库的扩展。Hertz原生完美匹配Netpoll,在时延方面有很多深度的优化,Netpoll对TLS能力的支持有待完善,为此Hertz底层同时支持基于Golang标准网络库的实现适配,同时支持网络库的一键切换,用户可根据自己的需求选择合适的网络库进行替换。如果用户有更加高效的网络库或其他网络库需求,也完全可以根据需求自行扩展。
Tool: Hz 脚手架
与 Hertz 一并开源的还有一个易用的命令行工具 Hz,用户只需提供一个 IDL,根据定义好的接口信息,Hz 便可以一键生成项目脚手架,让 Hertz 达到开箱即用的状态;Hz 也支持基于 IDL 的更新能力,能够基于 IDL 变动智能地更新项目代码。目前 Hz 支持了 Thrift 和 Protobuf 两种 IDL 定义。命令行工具内置丰富的选项,可以根据自己的需求使用。同时它底层依赖 Protobuf 官方的编译器和自研的 Thriftgo 的编译器,两者都支持自定义的生成代码插件。如果默认模板不能够满足需求,完全能够按需定义。
未来,我们将继续迭代 Hz,持续集成各种常用的中间件,提供更高层面的模块化构建能力。给 Hertz 的用户提供按需调整的能力,通过灵活的自定义配置打造一套满足自身开发需求的脚手架。
~ End ~