前言

最近准备把之前发在博客的文章慢慢转到知乎上,这是大一写的一篇关于 Hertz 框架的文章。

作为一个接触开源社区快要一年的准大二生,正巧 CSG 正在举行解析 Hertz 源码的活动,就趁着这个机会学习一下企业级的框架内部的实现并给我自己的框架提供一点思路。

Hertz

Hertz 是一个超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。

Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景中,相较于 go net,Hertz 在 QPS、时延上均具有一定优势。

在内部实践中,某些典型服务,如框架占比较高的服务、网关等服务,迁移 Hertz 后相比 Gin 框架,资源使用显著减少,CPU 使用率随流量大小降低 30%—60%

关于 Hertz 更多的信息可移步至 cloudwego/hertz

Hertz 核心结构与入口的实现

Hertz

hertz.go

核心结构在文件的开头,并有一行醒目的注释

routeEngine

New

Engine

Defalt

DefaltNewDefaltRecovery
DefaultEngineRecoveryRecoverydefer
Defalt

Spin

Gin

在代码实现中我们会先 make 一个通道,并跑一个携程来等待接收信息,当接受到关闭的信号后就会优雅的关掉程序。关于其中的 waitSignal 我们在下面继续解读。

waitSignal

在这个函数中我们会等待信号,并有一个 select 来对应接下来的操作,其中有强制退出以及优雅退出,如果有错误也会将 err 返回回去。

小结

hertz.go

简单实战

hertz-examples/hello/main.go
DefaltNew

结语

分析了这一个 go 文件就花费了不少时间,对于源码解读还需要继续努力。

如果有没弄清楚的地方欢迎大家向我提问,我都会尽力解答。

这是我的 GitHub 主页 github.com/L2ncE

欢迎大家 Follow/Star/Fork 三连