高性能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相关文档:
- Hertz框架:github.com/cloudwego/h…
- 中文使用文档:www.cloudwego.io/zh/docs/her…