7天用Go动手写/从零实现Web框架Gee

目录
- 第一天:前置知识(http.Handler接口),Code - Github
 - 第二天:上下文设计(Context),Code - Github
 - 第三天:Tire树路由(Router),Code - Github
 - 第四天:分组控制(Group),Code - Github
 - 第五天:中间件(Middleware),Code - Github
 - 第六天:HTML模板(Template),Code - Github
 - 第七天:错误恢复(Panic Recover),Code - Github
 
设计一个框架
大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架。不同的框架设计理念和提供的功能有很大的差别。比如 Python 语言的 django和flask,前者大而全,后者小而美。Go语言/golang 也是如此,新框架层出不穷,比如Beego,Gin,Iris等。那为什么不直接使用标准库,而必须使用框架呢?在设计一个框架之前,我们需要回答框架核心为我们解决了什么问题。只有理解了这一点,才能想明白我们需要在框架中实现什么功能。
我们先看看标准库net/http如何处理一个请求。
func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/count", counter)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}
net/http提供了基础的Web功能,即监听端口,映射静态路由,解析HTTP报文。一些Web开发中简单的需求并不支持,需要手工实现。
- 动态路由:例如
hello/:name,hello/*这类的规则。 - 鉴权:没有分组/统一鉴权的能力,需要在每个路由映射的handler中实现。
 - 模板:没有统一简化的HTML机制。
 - ...
 
当我们离开框架,使用基础库时,需要频繁手工处理的地方,就是框架的价值所在。但并不是每一个频繁处理的地方都适合在框架中完成。Python有一个很著名的Web框架,名叫bottle,整个框架由bottle.py一个文件构成,共4400行,可以说是一个微框架。那么理解这个微框架提供的特性,可以帮助我们理解框架的核心能力。
- 路由(Routing):将请求映射到函数,支持动态路由。例如
'/hello/:name。 - 模板(Templates):使用内置模板引擎提供模板渲染机制。
 - 工具集(Utilites):提供对 cookies,headers 等处理机制。
 - 插件(Plugin):Bottle本身功能有限,但提供了插件机制。可以选择安装到全局,也可以只针对某几个路由生效。
 - ...
 
Gee 框架
这个教程将使用 Go 语言实现一个简单的 Web 框架,起名叫做Gee,geektutu.com的前三个字母。我第一次接触的 Go 语言的 Web 框架是Gin,Gin的代码总共是14K,其中测试代码9K,也就是说实际代码量只有5K。Gin也是我非常喜欢的一个框架,与Python中的Flask很像,小而美。
7天实现Gee框架这个教程的很多设计,包括源码,参考了Gin,大家可以看到很多Gin的影子。
时间关系,同时为了尽可能地简洁明了,这个框架中的很多部分实现的功能都很简单,但是尽可能地体现一个框架核心的设计原则。例如Router的设计,虽然支持的动态路由规则有限,但为了性能考虑匹配算法是用Trie树实现的,Router最重要的指标之一便是性能。
希望这个教程能够对你有所启发,如果对 Gee 有任何好的建议,欢迎提issues - Github 和 PR。教程中的任何问题,可以直接在文章末尾评论。
推荐阅读
原文地址:7天用Go从零实现Web框架Gee - 极客兔兔
知乎专栏: Go语言 - 极客兔兔
关注微博: @极客兔兔
7天用Go动手写/从零实现Web框架Gee的更多相关文章
- 动手写一个简单的Web框架(模板渲染)
		
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
 - 动手写一个简单的Web框架(Werkzeug路由问题)
		
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
 - 动手写一个简单的Web框架(HelloWorld的实现)
		
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
 - 用Python写一个简单的Web框架
		
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
 - 写一个简单的Web框架
		
在.Net中有两种常用的Web开发方式,一种是Asp.Net WebForm,另一种是Asp.Net MVC.我先简单的给大家介绍下这两种开发方式的特点,然后再应用自定义脚本映射,反射,json2te ...
 - 01 . Go之从零实现Web框架(类似Gin)
		
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
 - 01 . Go之从零实现Web框架(框架雏形, 上下文Context,路由)
		
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
 - 7天用Go动手写/从零实现分布式缓存GeeCache
		
1 谈谈分布式缓存 第一次请求时将一些耗时操作的结果暂存,以后遇到相同的请求,直接返回暂存的数据.我想这是大部分童鞋对于缓存的理解.在计算机系统中,缓存无处不在,比如我们访问一个网页,网页和引用的 J ...
 - 自己动手写一个简单的MVC框架(第一版)
		
一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...
 
随机推荐
- $CF888G\ Xor-MST$ 最小生成树
			
正解:最小生成树 解题报告: 传送门$QwQ$ 发现$Kruskal$和$Prime$都不太可做,于是考虑$B$算法. 先大概港下$B$算法的流程趴$QwQ$.大概就,每次对每个联通块找到最近的联通块 ...
 - 洛谷$P2050\ [NOI2012]$美食节 网络流
			
正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...
 - DecoratorPattern(装饰器模式)-----Java/.Net
			
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装
 - 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门
			
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
 - JS中常见的几种继承方法
			
1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...
 - Magicodes.IE之Excel模板导出教材订购表
			
说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...
 - Android Studio build不显示Generate signed apk问题
			
如果是刚装的AS,那么新建一个项目,进入项目后,会发现build选项卡缺了一些选项,同时底部sync在转圈圈,其实是AS在自动下载gradle,也许还在下载build-tools,我等了11分钟才结束 ...
 - 一些常用查询SQL语句以及显示格式
			
1.查询当前年.月.周相关时间 1.1.查询当前年份 SELECT TO_CHAR(SYSDATE,'YYYY') AS YEAR FROM DUAL--查询当前年份 SELECT TO_CHAR(S ...
 - 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式
			
前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...
 - 一道简单到爆 Java面试题,居然挂了一票人
			
很多时候bug往往都是出在,我们觉得非常简单,不起眼的基础知识上 年前公司最后一波招人,为年后项目做技术储备,主要招聘对象初中级Java开发,要求也并没有多苛刻,唯一一点基础稍好,快速上手做项目就行. ...