Web 框架设计概览

目前在 Go Web 领域有很多较出名的开源框架,GinHertzEchoBeegoIris。它们都有各自的特点,并为开发者提供了很好的 API 支持,性能上都很好。

先来看看各个框架的抽象结构

Gin:

Engine: 是 Gin 的核心,它是对服务的抽象,承担了服务的控制、路由的封装及管理

Context: 语义是上下文,控制 HTTP 请求和响应的处理,同时还承担标准库中 context 超时控制和协程间信息传递的职责

HandlerFunc: 是 HTTP 处理函数

methodTree & node: 是 Gin 中路由树的具体实现,采用了 httprouter 所提供的基数树的功能,并进行优化得到的路由树,性能较高。

那其他的框架对应的结构在此就不一一介绍,只摆出图片。

Beego:

Iris:

分析

看完上面的抽象结构图,其实我们不难概括出,如果想要开发一个 Web 框架,其实只需要四个部分,Server/Engine(对服务进行抽象)、Context (对 HTTP 请求和响应的处理进行抽象)、HandlerFunc (对 HTTP 处理函数的抽象)、Route(对路由树的抽象)。

那同时 Gin 的实现已经证明了 httprouter 提供的思路是很好的,在此基础上 Gin 进行了优化得到了高性能的路由树和路由的抽象实现,那如果一个框架想做到高性能,可以直接沿用 Gin 的实现,比如下面要提到的 Hertz 框架,它在路由方面就沿用了 Gin 的设计来保持路由的高性能。

那既然说路由的抽象可以沿用,那重点就应该放在 Server 和 Context 的抽象了。

对 Gin 来说,它的 Engine 即 Server,承担了服务的控制(初始化服务、启动服务等)、对路由的抽象,它是路由创建的最终执行者;它的 Context,承担了对请求和响应的处理(读写请求与响应)、超时控制和信息传递(在 Context 结构体中包含了 标准库的 context,从而执行了超时控制和信息传递)。

它更像是一种集大成者的设计,它的优点在于更注重通用性和开发者体验,集成了更多功能以降低使用门槛,适合构建单体应用或者轻量级服务。它的 EngineContext 功能很丰富,开发者的减少了学习曲线,让开发者在一个入口点可以操作所有东西。

Hertz 这款框架是字节跳动为了满足内部业务的高性能需求,同时参考了多个开源框架的设计,而形成的一个框架,同时它与其他几种框架不同的是,它更是一款微服务框架,下面来看看它是如何做到的。

对 Hertz,它的主要结构包括:HertzEngineRequestContextRouterGroup。那有了对 Gin 的认识,这四个结构理解起来应该不复杂,上面也提到了由于 Gin 在路由方面给出了很好的实现,所以 Hertz 是沿用了它的设计,那么重点就在于其他的三个结构,通过看 Hertz 的源码,可以得出如下结论:

Hertz: 是 Hertz 框架中对服务的抽象,并且提供了更多对服务的操作,包括但不限于优雅启停、注册钩子函数、服务注 册、服务发现等。

Engine: 和 Gin 的类似,功能包括对路由的封装,是路由创建的真正执行者、同时执行 HTTP 处理函数,和 Gin 不同的地方在于它不对服务进行控制,而是交给了更上层的 Hertz。

RequestContext: 和 Gin 的 Context 类似,是对请求和响应的处理者,注意这里我仅仅说了是请求和响应,没有规定是 HTTP,这就是 Hertz 微服务框架的体现,它支持除 HTTP 协议以外的协议,所以它的字段没有采用 http.Request,而是它的封装结构 protocol.Request,根据不同的协议传入不同的结构体,同时它没有对标准库的 context 进行封装,而是交给 context 本身控制,它自己只专注于对请求和响应的处理。

那对于 Hertz 来说,它的设计更符合微服务的设计理念,职责单一,高内聚低耦合的设计方式,每个结构只做少量的工作,职责更清晰,适合微服务系统的使用,那给开发者带来的问题就是上手比较复杂,接口多而杂。而 Gin,刚刚也提到了,采用集大成者的设计,易用易上手,且适合单体应用。

讲到这里,对于一个 Web 框架的设计,我想大家应该是有点雏形了的,关键在于你的业务需求和你对 Web 框架的理解,需要你抽象的部分,基本就那几个,灵活根据需求进行抽象。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇