畅远数码|万字手撕Go http源码server.go
前言本文目标:
从路由注册到监听本地端口后请求路由的一系列动作的分析 , 基本上仅限于net/http server.go这个包文件的路由相关部分解读
写作目的:
在使用原生库进行web开发的时候 , 很多初学者很容易被mux.Handle()/mux.HandleFunc()/mux.Handler()/Handlerfunc/Handler/Handle()/Handlefunc()/handler给唬住 , 本身几个名称就相近 , 首字母有时候大写有时候小写 , 有时候是handle , 有时候是handler , 看起来相似但是类型和作用却完全不同 。 因为命名相似容易混淆 , 因此其真实含义也不容易搞清楚 , 对于开发者来说也不容易记忆。 有些命名甚至看不出来这个函数到底是干什么用的 , 有些属于设计库的时候的历史遗留问题 , 使得理解http库变得更加困难 。
很多网上的教程只是讲了某些东西是什么 , 用来干什么的 , 而没有讲为什么是这样的 , 为什么要这样设计 , 这样设计有什么好处 。 更重要的是有些教程已经老了 , 2018年到现在已经两年了 , 很多函数都经过优化重写了 , 至少server.go中的很多函数变化都很大 , 2018年的教程很多已经过时了 , 可能2022年又需要重新写一篇http库的解读 。 不过有些东西是不变的 , 很多设计思想都是共通的 , 而这些思想才是初学者应该掌握的 。 事实上死记硬背掌握handle的四种写法对开发没有任何帮助 , 如果不深入理解以后还会经常性的把文档翻来翻去而一头雾水 。
Go的有些设计哲学很有趣 , 不是简简单单几万字的篇幅就可以讲明白的 。
官网示例在官网示例中 , 使用go搭建一个稳定的高并发web服务器仅需要短短几行:
http.Handle("/foo", fooHandler)http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))})log.Fatal(http.ListenAndServe(":8080", nil))复制代码当然对于大部分开发来说 , 这几行代码已经足够在生产环境中使用了 , 但是如果对比较底层的一些原理不解 , 那么还需要继续深究 。
一个go服务器正常运行起来的步骤大致有:注册函数、监听端口 , 接受请求 , 处理请求 , 提供服务 , 关闭链接
0.注册函数:首先往路由表中注册对应的路由规则
1.监听端口:创建listen socket , 循环监听
2.接受请求:接受请求 , 创建网络链接conn对象 , 开启一个协程处理该链接(估计多路复用复用在这里了)每服务一个新的链接 , 在conn.connect()中就会调用serveHTTP来处理请求
3.处理请求:读取请求参数构造Request对象 , 根据请求路径在map路由表中查找对应的Handler 。 然后把请求分配给处理函数
4.提供服务:处理函数根据请求的参数等信息做处理 , 返回不同的信息
5.关闭链接:应用层处理完请求后关闭链接
前置知识Go基础语法、web基础、*压缩字典树
源码分析范围/大纲主要分析net/http库中的server.go文件 , 但是篇幅有限重点分析(使用mux.XX()简化代替ServeMux.XX()):
1.ServeMux结构体及其方法:mux.NewServeMux() , mux.Handle() , mux.HandleFunc() , mux.Handler()/mux.handler() , mux.ServeHTTP()
2.HandlerFunc结构体及其实现方法:HandlerFunc.ServeHTTP()
3.Handler接口类型
【畅远数码|万字手撕Go http源码server.go】4.函数Handle()和函数HandleFunc()
路由部分就这么点东西
ServeMuxServeMux是一个结构体
ServeMux定义ServeMux是一个HTTP请求多路复用器 。 它根据注册模式列表(路由表)将每个传入请求的URL匹配 , 并为与URL最匹配的模式调用处理程序(handler) 。
type ServeMux struct {// contains filtered or unexported fields}复制代码
推荐阅读
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 数码鲜蜂|三星大秀肌肉!这个透明手机如何?
- 数码科技大爆炸|台积电断供华为芯片开启倒计时!已不足10天:华为多位高管表态
- 海外网|菅义伟计划对厚生劳动省进行改革 创设"数码厅"
- 数码实验室|《飞速骑行4》2021年推出PS5和XboxSeriesX版
- 老实人数码|取代苹果XR系列,不支持5G网络,iPhone12s真机疑似被曝光
- 畅远数码|马云曾提出的4大预言,已经实现3个,网友:最后一个才是关键
- 神说要唱歌|数码宝贝大冒号14话解读 虫王对决 偷学战斗龙卷风的超比多兽
- 畅远数码|欧洲大量5G基站被烧毁!原因让人啼笑皆非
