科普golang中http包server服务运行
分析流程
常见使用用例:
1 |
|
利用http包, 我们轻松的拉起一个http服务。
我们这里详细追踪一下http服务拉起过程中, http包会帮我门做什么
1 |
|
我们看到会生成server对象, 并且执行 ListenAndServe
方法, 进入该方法,再一探究竟
1 |
|
主要是在tcp层面监听端口, 获得监听端口具柄, 在srv.Serve
做具体的逻辑处理
1 |
|
上面代码,主要是server端监听端口, 然后获取新的连接, 开新协程, 完成业务逻辑处理。 下面我们看下c.serve(ctx)
方法里,都是具体如何操作.
1 |
|
业务逻辑较多, 我们只关注于主数据的逻辑处理, 一共两点
1 |
|
核心是获取server管理句柄, 下面再此进入到ServeHTTP
看其内部实现。
1 |
|
这一步主要是将请求数据dispatch分发给路由管理对象, 并且进行实际的路由分发
1 |
|
这里的serverHttp
方法相对陌生, 我们最开始定义程序时, 是没见到该 对象方法的。
我们定义的句柄函数是 redirectHandler
, 我们看下他的定义,发现同样实现了ServeHTTP
方法, 因此处理函数的底层生成都必须定义ServeHTTP
方法
1 |
|
我们看下mux.Handler
都做了哪些事情
1 |
|
从这里我们可以看到, 我们从请求中解析出host, path, 然后调用mux.handler
来获取映射的处理函数
1 |
|
这里不再详细追踪, 即是通过mux.match
方法获取到 handler函数和匹配模式
总结
到这里我们完成对http包 server的流程 昨晚分析, 做个总结
项目拉起时,主要做以下事情
- 注册多路路由器, 即建立 路径和hander处理函数的映射关系
- 拉起tcp服务, 监听端口
当一次请求到达时:
- 建立新连接, 起新的连接协程
- 通过多路路由选择器找到对应的 处理函数
- 进行业务处理
其他的函数方法,无非是一些闭包,一些语法糖, 万变不离其宗。
参考文章: