一、内部运行图
二、各部分源码简要分析
1. 用户发送请求
上一节中用户在浏览器上输入的http://127.0.0.1:8080/hello
,会请求和本机的8080端口建立TCP连接进行通信;实际使用中是用户使用的是域名,会经过url解析,再到dns查询找到ip和端口,具体可见 输入网址后发生了什么
2.服务器监听并接收信息
Gin框架中使用net/http
中http.ListenAndServe(address, engine)
进行监听并接收请求
func (engine *Engine) Run(addr ...string) (err error) {
defer func() { debugPrintError(err) }()
address := resolveAddress(addr)
debugPrint("Listening and serving HTTP on %s\n", address)
err = http.ListenAndServe(address, engine)
return
}
可以看到会监听address
,然后把请求传入engine
中找到对应的路由进行处理,engine
中有什么呢?————中间件MiddleWare和具体业务处理代码Handler
3.MIddleWare全局中间件处理和MIddleWare对应中间件处理
3.1. MIddleWare全局中间件处理是指每个请求都会经过处理,比如在进入代码r := gin.Default()
中就使用了全局中间件Logger()
打印日志和Recovery()
处理panic恢复
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
Use源码如下
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
engine.RouterGroup.Use(middleware...)
engine.rebuild404Handlers()
engine.rebuild405Handlers()
return engine
}
3.2. MIddleWare对应中间件处理是指指定的个别路由请求或者是请求组会经过处理,这一块我就贴一个以后会用到的代码(请求组的中间件类似,后续章节会详细介绍中间件)
func TimeCostMiddleware(c *gin.Context) {
t := time.Now()
//请求之前
c.Next() //处理请求
//请求之后
//计算整个请求过程耗时
t2 := time.Since(t)
log.Println(t2)
}
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
r.GET("/hello", TimeCostMiddleware, func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
2021/08/30 14:12:41 0s
[GIN] 2021/08/30 - 14:12:41 |?[97;42m 200 ?[0m| 0s | ::1 |?[97;44m GET ?[0m "/hello"
4.Handler具体业务
func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
}