You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词|为什么我们要从零开发框架?
你好,我是叶剑峰,可能你更熟悉我的网名“轩脉刃”。
作为一线程序员,我已经工作十多年了,前后就职于奇虎、滴滴、腾讯,专注服务端研发,包括服务端的架构搭建、维护、优化等等。
因为一直在一线为技术团队搭建业务架构和解决实际问题,在这个过程中踩过太多坑,所以逐步形成了自己的一套方法论,之前在团队内部分享效果很好,朋友也总跟我说,该找时间整理输出。
所以当极客时间找到我开这门 Go Web 框架课的时候我很高兴希望尽可能帮新同学少走点弯路尤其现在Web框架层出不穷如果你还没有合适的入门方法在学习或者使用框架的时候就很容易迷失在追逐新框架、新特性的泥潭中。
那么如何选择或者打造一款称手的 Web 应用框架呢?这是我们在日常工作中经常遇到的问题。
因为不管什么语言,在 Web 领域,总有很多款开发框架,真的可以说是日新月异,[GitHub 上的 Go Web 框架](https://github.com/mingrammer/go-web-framework-stars)现在已经有41款了。
![](https://static001.geekbang.org/resource/image/17/00/17e06aeac40547a148cdbed09bfecf00.png?wh=1782x1342)
面对如此多的选择,有的同学喜欢追求最全的框架,觉得功能越多越好,但是往往并不是每一个功能都能在实际工作中用到;有的同学喜欢追求性能最高的框架,但是总觉得用起来非常别扭;也常有同学会认为框架无好坏,每个框架基本都差不多,最终的选择就是两个字:都行。
但是这些说法其实是进入了一个思维误区:**没有把框架放到特定场景上讨论,这个特定场景,就是开发团队的业务环境**。
比如,如果你一个人负责一个小的外包项目,那可以说所有框架都差不多;如果是 23 个服务端人员的初创团队,你用的框架要承担的工作大概率是提升开发效率,那就要选择功能更强大、易用性更好的框架;等团队再大一些,框架所承担的职责就更多了,往往得更多考虑性能、扩展性,或者定制自己的框架。
## 聊聊Web 框架
所有框架都有倾向性,我觉得基本可以分为两个大类:一类是追求运行性能,一类是追求开发效率。
追求性能的框架往往很简洁,包含的东西也很少,一个路由一个 MVC 就完事了,比如 Gin 框架;另外一类框架追求开发效率,封装得非常好,很多功能会让你惊叹,能帮你省很多事,最典型的就是 Beego 框架。
但从我个人经验看,在 Web 领域,特别是中小型项目,开发效率往往才是业务的第一需求。一个产品拥有的市场机会总是转瞬即逝的,抢占市场都是靠更快的开发速度和迭代速度。所以,**在任何领域做到第一名的产品基本上都有一个共性:开发、迭代速度快。**这就和古龙小说中评价天下侠士的武功一样,唯快不破。
所以作为开发必备的框架,在提效上尤为重要。这就要求好的框架要能区分清楚业务团队和架构团队的边界,什么应该是写业务的人负责的?什么应该是做架构的人负责的?
写架构的同学,做好框架的底层封装。而写业务的同学可以从底层实现中释放出来,专注于业务逻辑,遇到任何底层问题,在框架中都有简单易用的封装可用,框架中的每一个类、每一个服务接口都在告诉你,要完成这个功能,只需要这样使用,无需更多的操作。
总而言之,框架是为加速业务发展而生的,它需要兼顾业务的开发效率和底层的性能效率,而这两者在 Go 这门语言出现后得到了很好地结合。
## Go Web框架
在 Go 出现之前我们都知道PHP 和 Java 基本上是 Web 领域的主流,特别是 PHP是当时各种公司建站的首选。其实 PHP 和 HTML 的契合性是好于 Go 的,尤其在快速编写动态网页的时候,因为它可嵌入 HTML 的特性,于是建立 Web 站就变成了一件非常容易的事。
但是这几年Web 领域越来越流行前后端分离Web 后端开发慢慢从繁杂的 HTML 渲染中解放出来了开始把研发注意力放在如何建立数据模型接口设计、如何搭建更稳定可扩展的服务分布式上。在这个大趋势下Go 在 Web 领域可以说是大放异彩。
我接触 Go 算是比较早的2012 年第一次接触的时候 Go 还在 0.9 版本,当时看它的并发编程,我都震惊了,居然这么简易。之后,我就开始推动 Go 的落地实践,在大大小小的工作项目中,发现 **Go 真的很好地平衡了开发和性能**
比方说Go 语言中的 Goroutine 设计,提供了“一个请求一个协程”的请求模型,对比 PHP 的“一个请求一个进程”的模型能有效提升后端的资源占用和调度负载另外Go 的 Runtime 机制让运行程序不再依赖各种的环境和库,将 Web 服务的部署和搭建变得简单高效;而 Go 提供的交叉编译、数据结构、channel 等语言级别特性,都让“处理 Web 请求”这个事情变得非常简单。
所以这几年Go 在各个领域,比如云原生、游戏、微服务、区块链等等,优势也越发明显。
这也是我为什么选择 Golang 来搭建 Web 框架的原因,一方面看好 Golang 的市场前景,另一方面 Golang 确实让 Web 开发变得越来越有效率。
## 为什么要从零开发
决定好用什么语言了,我们就得关注怎么学了。好框架能提升开发效率,那要了解 Web 框架,为什么我又鼓励你从零开发呢?这不是自相矛盾了,自己造轮子能比用现成的快吗?
或许你可以听听我的经验之谈!
首先对我们程序员来说了解一个东西最好的办法就是去实现它。只有自己搭建一个新的框架才能掌握Web服务的本质。
可选框架这么多,新框架也层出不穷,我们不可能也没有必要完全掌握所有框架。**如果你只学怎么用框架,按照文档“按部就班”,是永远不可能真正做到掌握框架的**。
但是只要你开始动手做一个框架,你就能站在框架作者的角度,遇到作者开发时遇到的问题,思考作者开发时选择的方案,从本质上理解清楚这些框架都在做些什么、为什么这么设计,之后在工作中遇到类似问题的时候,也会清楚这个问题为什么会出现,解决也就不在话下了。
其次,**从零开发作为一种学习方法,并不意味着在工作中我们要从零搭建框架**。
从作者的角度了解清楚框架本质后,再思考工作中我们实际要用的框架,你就会发现,它有自己的倾向性,有自己的设计感,并不是每个设计都能满足你的需求。那么框架用久了,我们就要思考,如果我需要一个能满足我想法的框架,它应该是什么样子的?有怎样的设计?
举个例子,框架就像大楼的地基,而业务就像是房子。房子的形态可以是各异的,随业务不同任你发挥,但建房子之前你必须打造好自己的地基,这期间你当然可以参考前人的方案、经验、实施策略,让自己的框架地基更牢靠。
这样,新的业务需求来了,你就能快速搭出房子解决问题,而我们这门课要讲的就是我在 Web 领域所打造的地基,也是你可以深度参与的一个实战项目。
## 学习路径
最终目标是使用 Golang 开发出一个属于自己的工业级 Web 框架,而在具体的学习上,我设置了四个关卡。
![](https://static001.geekbang.org/resource/image/f6/23/f65904c0ef6f3d729d974c43f2019823.jpg?wh=1920x1080)
**实战第一关**:我会带你分析 Web 框架的本质,从最底层的 Go 的 HTTP 库开始讲起,如何基于 HTTP 库建立server、如何搭建路由、如何增加中间件等等从而搭建出一个 Web 框架最核心的设计部分。
**实战第二关**:框架核心搭建好了,我们会基于具体业务场景重新思考:设计框架的目标到底是什么? 框架的设计感和要解决的问题在哪里? 框架的倾向性是什么? 如果要搭建出一个“一切皆服务”的框架应该如何设计。
思考清楚后,我们会用 Gin 框架集成实战第一关自研的 Web 框架的核心,要知道,站在巨人的肩膀上,我们才能有更广阔的视野,然后一步步实现框架核心的功能服务。
**实战第三关**:我将带你为这个框架增加不同的周边功能,在添加功能时,我们会先讨论目前社区中的标准做法是什么样的,有没有更好的设计,最终把这些标准做法融合到我们的框架中。
**实战第四关**现在框架已经基本搭建完成了我们会用这个框架应用开发一个类似知乎的问答管理后台我们使用vue-element-admin来做前端封面再结合我们的框架开发具体的统计展示和计算业务。
通关不易,所以每一讲我都会依次为你讲解实现过程和细节,阐述每个设计的思路和原理,同时也会将我个人在 Golang 领域的一些学习技巧和小方法分享给你。希望你在认真学习后,不仅仅是获得了框架代码这条鱼,更能懂得如何思考和动手捕鱼。
另外每节课我都会给到代码demo你能跟着课程一步步实现。课程的所有代码包括这个框架我都已经放在 [GitHub](https://github.com/gohade/hade) 上了,还有完整的[说明文档](http://hade.funaio.cn/)。带着目标去学习也是一个很好的方法,所以如果你想了解一下最终的成型框架,提前看看成品也是可以的。
![](https://static001.geekbang.org/resource/image/d8/5b/d871bd96cb0bd3d7c184d8c8da6e795b.png?wh=2540x1414)
最后再多说一点,解说代码的时候,可能会有些枯燥,我会画图帮助你理解。关键代码也都增加了注释,如果你有疑问,欢迎给我留言,我会一一解答!
孤军奋战遇到劲敌很容易折戟沉沙,如果你身边有在使用 Web框架的同学也欢迎你把这门课程分享给TA共同学习一起仗剑走天涯。
好了,现在就让我们一起开始这场充满挑战的 Go Web 框架研发之旅吧!