这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
Hertz
Hertz简介
Hertz是企业级的微服务HTTP框架,分层的框架具有高易用性、高性能、高拓展性、多协议支持、网络层切换的特点。
架构设计
如上图所示,Hertz采用四层设计,保证各层级功能内聚、层级间接口灵活拓展。从上至下,分别是:应用层、路由层、协议层和传输层,各层分职责运行的同时,将公共能力抽象到公共层,做到了跨层复用。
1. 应用层 - 负责和用户的直接交互 包括Server、Client和抽象的HTTP请求需要涉及到的请求、响应、上下文、中间件。
2. 路由层 - 负责根据URI匹配对应的处理函数 ① 起初Hertz的路由是基于httprouter开发的,但随着使用的用户越来越多,httprouter 渐渐不能够满足需求,主要体现在 httprouter 不能够同时注册静态路由和参数路由; ② 为了满足这些需求,Hertz重新构建了路由树,用户在注册路由时拥有很高的自由度:支持静态路由、参数路由的注册;支持按优先级匹配。
3. 协议层 - 负责不同协议的实现和拓展 从HTTP1到HTTP2、QUIC的实现,用户可以按需注册符合自身需求的协议,并加入到Hertz引擎中。
4. 传输层 - 负责底层网络库的抽象和实现 原生完美适配Netpoll,非常适合时延敏感的业务接入。用户可以根据自己的需求选择合适的网络库进行替换或者自行拓展。
5. 公共层 - 存放一些公共能力 提供了一些错误处理、单位测试等能力,用户可以按需装配,同时如果还有特殊需求,还可以通过提供接口的注入。
6. 中间件 - 将通用逻辑和业务逻辑分离 Hertz提供了Server、Client中间件,在注册中间件之后,执行顺序与注册顺序相同,同时也支持预处理和后处理。
基本使用
- Hertz基本使用、路由及参数绑定 服务监听8080端口并注册GET方法的路由函数
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"ping": "pong"})
})
h.Spin()
同时 Hertz还提供了POST、PUT、DELETE、ANY等方法用于注册路由,还支持路由组用于路由分组的功能。
Hertz还支持Bind、Balidate、BindAndValidate函数用于参数绑定和校验。
h.POST("v:path.bind", func(c context.Context, ctx *app.RequestContext) {
var arg Args
err := c.BindAndValidate(&arg)
if err != nil {
}
fnt.Println(arg)
})
-
Hertz中间件 首先需要通过Use()方法注册中间件,可以通过Abort()、AbortWithMsg()、AbortWithStats()终止中间件调用链的执行。(中间件调用链通过Next()方法)
-
Hertz Client 提供了HTTP Client用于帮助用户发送HTTP请求,下面实例发送http get请求
c, err := client.NewClient()
if err != nil {
}
_, body, _ := c.Get(context.Background(), nil, "")
- Hertz代码生成工具 Hertz提供代码生成工具Hz,通过定义IDL文件即可生成对应的基本服务代码。