以下内容摘自我写的一篇博客文章,大家看我的理解对不对:
http://www.chingli.com/coding/understanding-go-web-app/## 框架
我们在前面已经费劲口舌地说明了当用 Go 写 Web 服务器程序时,该如何实现路由功能,以及该如何用规范的方式编写 Handler (或中间件)。但一个 Web 程序的编写往往要涉及更多的方面,我们在前面介绍中间件时已经说过,各种各样的中间件能够帮助我们完成这些任务。但许多时候,我们总是希望他人帮我们完成更多的事情,从而使我们自己的工作更加省力。应运这种需求,就产生了许许多多的 Web 框架。根据架构的不同,这些框架大致可分为两大类:
第一类是微架构型框架。其核心框架只提供很少的功能,而更多的功能则需要组合各种中间件来提供,因此这种框架也可称为混搭型框架。它相当灵活,但相对来说需要使用者在组合使用各种中间件时花费更大的力气。像 Echo 、 Goji 、 Gin 等都属于微架构型框架。
第二类是全能型架构。它基本上提供了你编写 Web 应用时需要的所有功能,因此更加重型,多数使用 MVC 架构模式设计。在使用这类框架时你可能感觉更轻省,但其做事风格一般不同于 Go 语言惯用的风格,你也较难弄明白这些框架是如何工作的。像 Beego 、 Revel 等就属于全能型架构。
对于究竟该选择微架构还是全能型架构,仍有较多的争议。像 The Case for Go Web Frameworks 一文就力挺全能型架构,并且其副标题就是“ Idiomatic Go is not a religion ”,但该文也收到了较多的反对意见,见这里和这里。总体上来说, Go 语言社区已越来越偏向使用微架构型框架,当将来 context 包进入标准库后, http.Handler 本身就定义了较完善的中间件编写规范,这种使用微架构的趋势可能更加明显,并且各种微架构的实现方式有望进一步走向统一,这样其实 http 包就是一个具有庞大生态系统的微架构框架。