手把手带你写一个 Web 框架
叶剑峰
腾讯高级工程师,前滴滴技术专家
22731 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
特别放送 (1讲)
手把手带你写一个 Web 框架
15
15
1.0x
00:00/10:44
登录|注册

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

讲述:叶剑峰大小:9.80M时长:10:44
实战第四关
实战第三关
实战第二关
实战第一关
Go在Web领域的优势
追求开发效率的框架
追求性能的框架
学习路径
从零开发作为学习方法
了解Web服务的本质
Go Web框架
聊聊Web框架
特定场景下讨论框架
为什么要从零开发
如何选择或打造一款适合的Web应用框架
作者的经验和观点
作者介绍
开篇词:为什么我们要从零开发框架?

该思维导图由 AI 生成,仅供参考

你好,我是叶剑峰,可能你更熟悉我的网名“轩脉刃”。
作为一线程序员,我已经工作十多年了,前后就职于奇虎、滴滴、腾讯,专注服务端研发,包括服务端的架构搭建、维护、优化等等。
因为一直在一线为技术团队搭建业务架构和解决实际问题,在这个过程中踩过太多坑,所以逐步形成了自己的一套方法论,之前在团队内部分享效果很好,朋友也总跟我说,该找时间整理输出。
所以当极客时间找到我开这门 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 框架研发之旅吧!
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇文章由资深程序员叶剑峰撰写,分享了他在服务端研发领域多年的经验和对Web框架的看法。他强调了选择或打造适用的Web应用框架的重要性,特别是在中小型项目中,开发效率是首要需求。作者将框架分为追求性能和追求开发效率两类,并强调了在Go语言中这两者的结合。此外,叶剑峰还分享了对Go语言的看法,认为其在Web领域的优势逐渐显现。最后,他解释了为什么鼓励读者从零开始开发框架,认为通过实际搭建框架可以更好地理解Web服务的本质,并且能够更好地选择适用于自己业务需求的框架。文章内容涵盖了对Web框架的选择、Go语言的优势以及从零开发的意义,对于想要深入了解Web开发的读者具有一定的参考价值。 文章标题为《学习路径:Golang开发工业级Web框架》,作者提出了学习Golang开发Web框架的四个关卡,从搭建框架核心到集成具体业务场景,再到增加周边功能,最终应用开发一个类似知乎的问答管理后台。作者承诺在课程中分享个人在Golang领域的学习技巧和小方法,帮助读者深入学习。整体而言,这篇文章为想要学习Golang开发Web框架的读者提供了清晰的学习路径和实战案例,具有很高的实用价值。

2021-09-1366人觉得很赞给文章提建议

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 Web 框架》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(24)

  • 最新
  • 精选
  • ghostwritten
    打卡第一天: go web 框架: https://github.com/mingrammer/go-web-framework-stars 课程资料:https://github.com/gohade/hade hade说明文档:http://hade.funaio.cn/ 框架倾向性:一类是追求运行性能如Gin ,一类是追求开发效率如beego。 产品共性:开发、迭代速度快 思考好问题:什么应该是写业务的人负责的?什么应该是做架构的人负责的? 实战第一关:搭建出 Web 框架最核心的设计部分 实战第二关:如果要搭建出一个“一切皆服务”的框架应该如何设计,用gin实战 实战第三关:增加不同的周边功能 实战第四关:框架应用开发一个统计管理后台,使用 vue-element-admin 来做前端封面,开发具体的统计展示和计算业务。

    作者回复: 感谢认真打卡的同学,希望这门课能让你受益颇丰。

    2021-09-18
    20
  • lesserror
    请问一下老师课程中实现的框架有运用到公司的实际项目中吗?

    作者回复: 有的

    2021-09-13
    4
  • 破绽
    写一个自己的Web框架仗剑走天涯,跟着大佬学,Java开始卷Go

    作者回复: 嗯是我之前自己做框架的心路历程,感谢支持

    2021-09-13
    3
  • 我听着呢
    对我这种小萌新来说,这课是重点,画上,面试要考

    作者回复: 感谢支持

    2021-09-13
    3
  • keke
    以前只知道vue,希望可以多学一些好用的框架~~

    作者回复: 框架是很多的,前后端框架都很多,加速业务研发效能的就是好框架。感谢支持。

    2021-09-13
    2
    2
  • 江谢木
    初级前端工程师适合学习?

    作者回复: 你好,如果有兴趣学习golang可以学习的,后续还会有将vue融合进入框架的设计。

    2021-09-18
    1
  • 鸭补一生如梦
    作为产品负责人,已经多年不写代码,近期要整合产品线做平台的整合,需要从架构和框架上进行统一。 看了多套专栏和视频,总是不能很好理解现有的框架,总感觉和自己的想法有出入。 混迹golang群,一直看轩脉刃的公众号,这个主题正好可以解决我当下的迷思,果断捧场,希望老叶能帮我一把。感谢感谢!

    作者回复: 非常感谢支持,有什么框架外问题微信或者公众号也可以沟通。

    2021-09-17
    1
  • 王先森
    老师,我看了hade框架目录结构,为什么要把model放在自己的module文件下呢?这块文档虽然有提了一句,但是还是有点疑惑。

    作者回复: 你好,我是这么认为的,model本质是对数据库的抽象,放在某个模块module下还是放在公用的地方本质就是表示这个数据库抽象是不是模块特有的。如果一个能保持model只在一个module出现,那么就是能保证这个模块是“封闭的”。后续如果将这个模块作为一个服务独立出去,会非常方便。所以我还是愿意将model放在自己的module下面。不过这个其实并不强制的,放在哪里都是可以的。

    2021-09-15
    1
  • wanghaijie
    意外的惊喜,居然搜到了jianfeng大佬的课程,大佬以后多多指导。

    作者回复: 哈哈

    2023-02-12归属地:湖北
  • 阿泽
    有交流群吗

    编辑回复: 课程首页就有入群链接

    2021-12-15
    2
收起评论
大纲
固定大纲
聊聊 Web 框架
Go Web 框架
为什么要从零开发
学习路径
显示
设置
留言
24
收藏
89
沉浸
阅读
分享
手机端
快捷键
回顶部