这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
之前介绍了Go开发三件套中的ORM框架-Gorm和RPC框架Kitex,今天总结剩下的HTTP框架Hertz。 首先了解有了RPC框架了为什么还需要使用http框架?RPC框架主要用于系统内部服务之间,它效率高且没有多余的信息。而Http框架主要用于前端和后端之间,用于向外部暴露出来的接口,是更加通用的传输协议。
简介
Hertz也是字节开源的框架,具有高易用性、易扩展、低时延等特点。是基于自研网络库Netpoll开发的内部框架Hertz。Hertz框架整体上满足:
- 极致性能优化的问题性
- 面对未来不可控需求的扩展能力,Hertz采用了4层分层设计(应用层、路由层、协议层、传输层),保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标
应用层
主要包括与用户直接交互的易用的API,主要包括Server、Client和一些其他通用抽象。
路由层
Hertz在设计路由时,给了用户极高的自由度去注册路由。Hertz提供了路由组(Group)的能力,用于支持路由分组的功能。使用分组路由可以让代码便于管理和扩展,过修改路由分组可以非常轻松扩展出另外一套API接口。
v1 := h.Group("/v1")
{
v1.GET("/login", func(c context.Context, ctx *app.RequestContext) {
})
}
v2 := h.Group("/v2")
{
v2.GET("/login", func(c context.Context, ctx *app.RequestContext) {
})
}
协议层
协议层负责不同协议的实现和扩展。Hertz支持协议的扩展,用户只需要实现下面的接口便可以按照自己的需求在引擎上扩展协议,同时也支持通过ALPN协议协商的方式注册。Hertz首批只开源了 HTTP1 实现,未来会陆续开源 HTTP2、QUIC 等实现。协议层扩展提供的灵活性甚至可以超越 HTTP 协议的范畴,用户完全可以按需注册任意符合自身需求的协议层实现,并且加入到Hertz的引擎中来,同时,也能够无缝享受到传输层带来的极致性能。
传输层
传输层负责底层的网络库的抽象和实现Hertz支持底层网络库的扩展。Hertz原生完美匹配Netpoll,在时延方面有很多深度的优化,Netpoll对TLS能力的支持有待完善,为此Hertz底层同时支持基于Golang标准网络库的实现适配,同时支持网络库的一键切换,用户可根据自己的需求选择合适的网络库进行替换。如果用户有更加高效的网络库或其他网络库需求,也完全可以根据需求自行扩展。
Hertz代码生成工具
Hertz提供了代码生成工具Hz,通过定义IDL文件即可生成相应基础服务的代码。
Hertz Client
帮助用户发送http请求。