hertz框架 | 青训营

109 阅读3分钟

1.hertz框架的介绍和使用

Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。本文我们介绍hertz框架的基本使用,如何去搭建一个hertz的微服务项目。

特点

Hertz是一个超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。 Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景中,相较于 go net,Hertz 在 QPS、时延上均具有一定优势。 在内部实践中,某些典型服务,如框架占比较高的服务、网关等服务,迁移到 Hertz 后相比 Gin 框架,资源使用显著减少,CPU 使用率随流量大小降低 30%—60%  。

1.1首先安装hertz的命令行工具,用于生成hertz初始代码

go install github.com/cloudwego/hertz/cmd/hz@latest

1.2然后通过hz工具生成代码,如果创建的项目不在GOPATH/src路径下,则需要额外声明-module参数

hz new -module hertz-study 最后执行hz new初始化项目,项目初始化后,hertz会自动创建对应项目文件,文件结构如下

  .
  ├── biz
  │ ├── handler
  │ │ └── ping.go
  │ └── router
  │ └── register.go
  ├── go.mod
  ├── main.go
  ├── router.go
  └── router_gen.go

2.相关代码解析

2.1main.go函数

main.go函数,这是hertz服务的启动入口,代码的功能如下

  1. 初始化了一个默认的hz服务;
  2. 完成了一些注册工作;
  3. 启动hz服务(HTTP服务)。
func main() {  
h := server.Default() 
register(h)   
h.Spin() 
}

首先来看Default()方法,进一步看源码发现这个方法可以传入参数,然后我们进一步分析传入参数的含义,它接受了一个不定长度的Option数组为参。 通过观察config.NewOptions源码,它首先初始化了一个Options结构,这个结构存放了Hertz服务的各种初始化信息,此时的Options的各个属性都是默认固定的,直到调用了options.Apply(opts)方法,将自定义的配置应用上去。

并且应用上去的方式很特别,它将这个默认创建的Options结构的指针作为参数传递给每一个你声明的Option的F方法,通过F方法的调用去为Options结构赋值,因为是指针,自然能将所有的赋值应用到同一个Options上去。

而具体的Option的F方法如何定义,则可以灵活实现,这也是Hertz拥有良好扩展性的原因之一。

register(h)的工作是路由注册(也就是接口的声明),内部完成了两种类型的注册,GeneratedRegister()的注释指出这部分路由是由IDL生成的,关于IDL先卖个关子,你只要知道IDL描述了接口交互的结构。

完成了一系列的初始化和声明操作之后,Spin()负责触发Hertz的运行,并且处理运行过程中的各种异常。其核心是errCh <- h.Run()