Go-HTTP框架Hertz | 青训营

90 阅读5分钟

1. HTTP框架Hertz

1.1 简介

Hertz是一个Golang微服务HTTP框架,再设计时参考了其他开源框架fasthttp、gin、echo的优势,并且结合字节跳动的内部需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已经广泛使用了。如今越来越多的微服务选择使用Golang,如果对于微服务的性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz就是一个不错的选择。

1.2 架构设计

Hertz采用了四层分层设计:应用层、路由层、协议层、传输层。保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标。

  • 应用层:主要用户包括与用户直接交互的易用的API,主要包括Server、Client和一些其他通用抽象。Hertz框架最具特点的是处理函数(HandleFunc)多了一个context上下文,这是在大量的实践过程中发现的,业务方通常需要一个标准的上下文在RPC Client或者日志、Tracing等组件间传递,但由于请求上下文(RequestContext)生命周期局限于一次HTTP请求之内而以上提到的场景往往存在异步的传递和处理,导致如果直接传递请求上下文,会导致出现一些数据不一致的问题。因此最终增加了一个标准的上下文入参,从根本上解决各种因为上下文周期不一致的异常问题。
  • 路由层:Hertz在设计路由时,给了用户极高的自由度去注册路由,支持的路由有:支持静态路由、参数路由的注册;支持按优先级匹配,支持路由回溯,支持尾斜线重定向。
  • 协议层:协议层负责不同协议的实现和扩展。Hertz支持协议的扩展,用户只需要实现下面的接口便可以按照自己的需求在引擎上扩展协议,同时也支持通过ALPN协议协商的方式注册。Hertz首批只开源了 HTTP1 实现,未来会陆续开源 HTTP2、QUIC 等实现。协议层扩展提供的灵活性甚至可以超越 HTTP 协议的范畴,用户完全可以按需注册任意符合自身需求的协议层实现,并且加入到Hertz的引擎中来,同时,也能够无缝享受到传输层带来的极致性能。
  • 传输层:传输层负责底层的网络库的抽象和实现Hertz支持底层网络库的扩展。Hertz原生完美匹配Netpoll,在时延方面有很多深度的优化,Netpoll对TLS能力的支持有待完善,为此Hertz底层同时支持基于Golang标准网络库的实现适配,同时支持网络库的一键切换,用户可根据自己的需求选择合适的网络库进行替换。如果用户有更加高效的网络库或其他网络库需求,也完全可以根据需求自行扩展。

1.3 框架特点

  • 高易用性:在开发过程中,快速写出来正确的代码往往是非常重要的。因此,Hertz在迭代的过程中,积极听取用户意见,持续打磨框架,为用户提供一个更好的使用体验,帮助用户更快速的写出正确的代码。
  • 高性能:Hertz默认使用自研的高性能网络库Netpoll,在一些特殊的场景相较于go net,Hertz在QPS、时延上均具有一定优势。
  • 高扩展性:Hertz采用了分层设计,提供了较多的接口以及默认的扩展实现,用户也可以自行扩展。同时得益于框架的分层设计,框架的扩展性也会大很多。
  • 多协议支持:Hertz框架原生提供HTTP1.1、ALPN协议支持。除此之外,由于分层设计,Hertz甚至支持自定义构建协议解析逻辑,满足协议层扩展的任意需求。
  • 网络层切换能力:Hertz实现了Netpoll和Golang原生网络库间按需切换能力,用户可以针对不同的场景选择合适的网络库,同时也支持以插件的方式为Hertz扩展网络库实现。

2. 路由

2.1 路由注册

Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。

  • Hertz.Handle:支持用户手动传入HTTP Method用来注册方法,当用于注册普通的HTTP Method方法时,和上述的方法作用是一致的,并且这个方法同时也支持用于注册自定义HTTP Method方法。
  • Hertz.Any:用于注册所有HTTP Method方法。
  • Hertz.StaticFile/Static/StaticFS:用于注册静态文件。

2.2 路由组

Hertz提供了路由组(Group)的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。

2.3 路由类型

Hertz支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。
路由的优先级:静态路由>命名路由>通配路由

心得体会(总结)

  • 简洁易用:Hertz提供了简洁的接口和易于理解的文档,使得使用者能够快速上手。它的设计思路注重简洁性,同时也尽量减少不必要的复杂性。
  • 轻量高效:Hertz是一个轻量级的框架,它只包含了最基本的功能,没有过多的冗余代码。这使得它在性能方面表现出色,能够处理大量并发请求而不会过载。
  • 灵活可扩展:Hertz采用模块化的设计,可以方便地扩展和定制。它提供了丰富的中间件和插件机制,使得开发者能够根据自己的需求灵活地添加或修改功能。