高性能Golang HTTP框架 —— Hertz | 青训营笔记

522 阅读2分钟

高性能Golang HTTP框架 —— Hertz | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 11天 ✌

1. Hertz设计

Hertz是一个超大规模使用的高性能Golang HTTP框架,其采用了包括Transport、Protocol、Route、Application的四层分层设计,各个层级之间的接口灵活扩展,层级功能内聚,同时,Hertz提供了Hz脚手架工具,可根据接口定义文件(IDL)自动化生成项目框架,聚焦核心业务逻辑。

框架特点:

  • 高性能:默认使用高性能网络库Netpoll,在一些特殊场景相较于 go net,Hertz 在 QPS、时延上均具有一定优势。
  • 采用分层设计,提供较多接口且默认扩展实现
  • 原生提供HTTP及ALPN协议支持,支持自定义构建协议解析逻辑,以满足协议层扩展的任意需求。

2. Hertz扩展性

(1)协议层扩展支持:

  • HTTP/1.1 ,HTTP/2 ,HTTP/3 ,Websocket以及自定义式协议。

其中,比较不同的是Websocket协议。与常用的HTTP协议不同,其最大的特点是服务器可以主动向客户端推送消息。虽然Http和Websocket都是基于TCP的应用协议,所以其实二者本质上都能实现全双工通信,而常用的Http1.1出于服务性能和使用需求考虑,实际并不常主动发送消息给客户端,所以好像用成了“半双工”通信。Websocket更适用于不顾双方死活频繁互发消息的客户端和服务端之间。Hertz 基于hijack的方式实现了对 WebSocket 的支持。

(2)网络层扩展原生支持两大类:

  • 基于连接的网络库:CloudWeGo的Netpoll,Golang原生网络库Net. 对于Server默认使用Netpoll库(如果有启动 TLS Server 的需求,请使用 go net 网络库),可通过配置进行更改:
server.New(server.WithTransport(standard.NewTransporter))
server.New(server.WithTransport(netpoll.NewTransporter))

客户端配置更改:

client.NewClient(client.WithDialer(standard.NewDialer()))
client.NewClient(client.WithDialer(netpoll.NewDialer()))

更详细的网络库选择问题请参考:www.cloudwego.io/zh/docs/her…

  • 基于流的网络库:Quic-go.

(3)应用层扩展支持:

  • pprof:GoLang程序性能分析工具,常用于CPU、内存、阻塞以及互斥锁的分析。(在前面的课程中有介绍)
  • gzip:最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术
  • i18n:国际化与本地化,将软件与特定语言及地区脱钩
  • csrf:防御跨站请求伪造攻击
  • 反向代理等常见中间件扩展

Herzt相关文档: