手把手带你写一个Web框架

开篇词|为什么我们要从零开发框架?

叶剑峰

腾讯高级工程师,前滴滴技术专家

你好,我是叶剑峰,可能你更熟悉我的网名“轩脉刃”。

作为一线程序员,我已经工作十多年了,前后就职于奇虎、滴滴、腾讯,专注服务端研发,包括服务端的架构搭建、维护、优化等等。

因为一直在一线为技术团队搭建业务架构和解决实际问题,在这个过程中踩过太多坑,所以逐步形成了自己的一套方法论,之前在团队内部分享效果很好,朋友也总跟我说,该找时间整理输出。

所以当极客时间找到我开这门 Go Web 框架课的时候,我很高兴,希望尽可能帮新同学少走点弯路,尤其现在Web框架层出不穷,如果你还没有合适的入门方法,在学习或者使用框架的时候,就很容易迷失在追逐新框架、新特性的泥潭中。

那么如何选择或者打造一款称手的 Web 应用框架呢?这是我们在日常工作中经常遇到的问题。

因为不管什么语言,在 Web 领域,总有很多款开发框架,真的可以说是日新月异,GitHub 上的 Go Web 框架现在已经有41款了。

面对如此多的选择,有的同学喜欢追求最全的框架,觉得功能越多越好,但是往往并不是每一个功能都能在实际工作中用到;有的同学喜欢追求性能最高的框架,但是总觉得用起来非常别扭;也常有同学会认为框架无好坏,每个框架基本都差不多,最终的选择就是两个字:都行。

但是这些说法其实是进入了一个思维误区:没有把框架放到特定场景上讨论,这个特定场景,就是开发团队的业务环境

比如,如果你一个人负责一个小的外包项目,那可以说所有框架都差不多;如果是 2~3 个服务端人员的初创团队,你用的框架要承担的工作大概率是提升开发效率,那就要选择功能更强大、易用性更好的框架;等团队再大一些,框架所承担的职责就更多了,往往得更多考虑性能、扩展性,或者定制自己的框架。

聊聊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 框架,而在具体的学习上,我设置了四个关卡。

实战第一关:我会带你分析 Web 框架的本质,从最底层的 Go 的 HTTP 库开始讲起,如何基于 HTTP 库建立server、如何搭建路由、如何增加中间件等等,从而搭建出一个 Web 框架最核心的设计部分。

实战第二关:框架核心搭建好了,我们会基于具体业务场景重新思考:设计框架的目标到底是什么? 框架的设计感和要解决的问题在哪里? 框架的倾向性是什么? 如果要搭建出一个“一切皆服务”的框架应该如何设计。

思考清楚后,我们会用 Gin 框架集成实战第一关自研的 Web 框架的核心,要知道,站在巨人的肩膀上,我们才能有更广阔的视野,然后一步步实现框架核心的功能服务。

实战第三关:我将带你为这个框架增加不同的周边功能,在添加功能时,我们会先讨论目前社区中的标准做法是什么样的,有没有更好的设计,最终把这些标准做法融合到我们的框架中。

实战第四关:现在框架已经基本搭建完成了,我们会用这个框架应用开发一个类似知乎的问答管理后台,我们使用vue-element-admin来做前端封面,再结合我们的框架开发具体的统计展示和计算业务。

通关不易,所以每一讲我都会依次为你讲解实现过程和细节,阐述每个设计的思路和原理,同时也会将我个人在 Golang 领域的一些学习技巧和小方法分享给你。希望你在认真学习后,不仅仅是获得了框架代码这条鱼,更能懂得如何思考和动手捕鱼。

另外,每节课我都会给到代码demo,你能跟着课程一步步实现。课程的所有代码,包括这个框架我都已经放在 GitHub 上了,还有完整的说明文档。带着目标去学习也是一个很好的方法,所以如果你想了解一下最终的成型框架,提前看看成品也是可以的。

最后再多说一点,解说代码的时候,可能会有些枯燥,我会画图帮助你理解。关键代码也都增加了注释,如果你有疑问,欢迎给我留言,我会一一解答!

孤军奋战遇到劲敌很容易折戟沉沙,如果你身边有在使用 Web框架的同学,也欢迎你把这门课程分享给TA,共同学习,一起仗剑走天涯。

好了,现在就让我们一起开始这场充满挑战的 Go Web 框架研发之旅吧!

教程推荐

Python2在线教程

数据结构和算法在线教程

Seaborn在线教程

MATLAB在线教程

Scala在线教程

Go Web REST在线教程

随机推荐

SANWA SUPPLYMA-ERG9分享一下使用心得?最真实的使用感受分享!

狮王小狮王儿童氟防蛀牙膏 20g好不好,值得购买吗?图文评测,一...

狮王小狮王儿童氟防蛀牙膏 20g实用性高,购买推荐吗?产品使用感...

雀巢超启能恩奶粉3段760g*4罐选购哪种好?体验评测揭秘分析?

雀巢超启能恩奶粉3段760g*4罐评测值得买吗?功能评测结果揭秘?

佳沃云南蓝莓14mm 12盒原箱生鲜实用性高,购买推荐吗?看完这个...