Herz学习专场|青训营笔记

156 阅读3分钟

Herz学习专场|青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第 6 天

在后面会依次倒叙回顾之前的学习课程,便于复习~

一、课程重点内容

  • Hertz的设计及特点
  • Hertz的新功能以及展望
  • 答疑环节

下面是对课程重点内容的思考与总结,有问题或者错误,可以批评指正呐~

二、Hertz的设计与特点

Hertz:字节跳动内部被超大规模使用的高性能Golang HTTP框架

应用范围:内部支撑17k+业务服务、峰值QPS超过7000万、横向支持了各类组件(servicemesh、网关、faas等)

  • 分层设计

    • 设计理念:Hertz采用了4层分层设计,保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标。

image-20230204154252476.png

    从上图可以看出,hertz可以满足任意HTTP范畴内的可拓展性需求。
    适应场景:如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。
  • 框架特点

    • 高易用性

      • 在开发过程中,快速写出来正确的代码往往是更重要的。因此,在 Hertz 在迭代过程中,积极听取用户意见,持续打磨框架,希望为用户提供一个更好的使用体验,帮助用户更快的写出正确的代码。
    • 高性能

      • Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景相较于 go net,Hertz 在 QPS、时延上均具有一定优势。关于性能数据,可参考下图 Echo 数据。

image-20230204155133093.png

  • 高拓展性

    • Hertz 采用了分层设计,提供了较多的接口以及默认的扩展实现,用户也可以自行扩展。同时得益于框架的分层设计,框架的扩展性也会大很多。目前仅将稳定的能力开源给社区,更多的规划参考 RoadMap
  • 多协议支持

    • Hertz 框架原生提供 HTTP1.1、ALPN 协议支持。除此之外,由于分层设计,Hertz 甚至支持自定义构建协议解析逻辑,以满足协议层扩展的任意需求。
  • 网络层切换能力

    • Hertz 实现了 Netpoll 和 Golang 原生网络库 间按需切换能力,用户可以针对不同的场景选择合适的网络库,同时也支持以插件的方式为 Hertz 扩展网络库实现。

三、Herz的新功能与展望

四、QA环节

  • Q:hertz中间件c.Next,那如果最后一个中间件panic了,是不是打印报错的栈信息里很多行就都定位到c.Next所在的这一行了?
  • A:不是,堆栈信息打印还是会打印到执行函数的。
  • Q:我是用的是goland进行mock测试的,不知道为什么仅调试模式下能够成功mock,直接运行时原函数并未被替换。
  • A:函数被Golang内联了,推荐使用gomock。
  • Q:sock5的例子中,使用ReadByte读取客户端的数据时,请问这个调用是阻塞的还是非阻塞的?(关于GO语言io阻塞和非阻塞的处理,官方文档好像没怎么提到,老师能不能讲一下),如果是非阻塞的,那么存在网络延迟的话,输入流上没有数据是不是就直接返回err了?
  • A:这部分可以参考一下Go的GMP模型,使用上看起来是阻塞的,但是其实阻塞的Goroutine是被调度的这里可以设置读超时。

五、课程总结

对于Herz的学习还是很感兴趣,再接再厉呀!