Hertz介绍
Hertz是字节跳动研发的企业级微服务HTTP框架,具有高易用性、易扩展、低时延等特点。是基于自研网络库Netpoll开发的内部框架Hertz。Hertz框架整体上满足:
1.极致性能优化的问题性
2.面对未来不可控需求的扩展能力,Hertz采用了4层分层设计(应用层、路由层、协议层、传输层),保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标。整体框架如下图:
应用层
主要包括与用户直接交互的易用的API,主要包括Server、Client和一些其他通用抽象。Hertz框架最具特点的是处理函数(HandlerFunc)多了一个context上下文,这是在大量的实践过程中发现的,业务方通常需要一个标准的上下文在RPC Client或者日志、Tracing等组件间传递,但由于请求上下文(RequestContext)生命周期局限于一次HTTP请求之内而以上提到的场景往往存在异步的传递和处理, 导致如果直接传递请求上下文,会导致出现一些数据不一致的问题。因此最终增加了一个标准的上下文入参,从根本上解决各种因为上下文生命周期不一致的异常问题,处理函数的格式为:
type HandlerFunc func(c context.Context,ctx *app.RequestContext)
路由层
Hertz在设计路由时,给了用户极高的自由度去注册路由,支持的路由有:支持静态路由、参数路由的注册;支持按优先级匹配,支持路由回溯,支持尾斜线重定向。例如:
1.优先级匹配,如/a/b和/:c/b,同时满足时,优先匹配/a/b
2.路由回溯,如注册/a/b和/:c/d,当匹配/a/d时仍然能够匹配上/:c/d
3.支持尾斜线重定向,如注册/a/b,当匹配/a/b/时重定向到/a/b上
协议层
协议层负责不同协议的实现和扩展。Hertz支持协议的扩展,用户只需要实现下面的接口便可以按照自己的需求在引擎上扩展协议,同时也支持通过ALPN协议协商的方式注册。Hertz首批只开源了 HTTP1 实现,未来会陆续开源 HTTP2、QUIC 等实现。协议层扩展提供的灵活性甚至可以超越 HTTP 协议的范畴,用户完全可以按需注册任意符合自身需求的协议层实现,并且加入到Hertz的引擎中来,同时,也能够无缝享受到传输层带来的极致性能。