一、内部运行图
二、各部分源码简要分析
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)(errerror){deferfunc(){debugPrintError(err)}()address:=resolveAddress(addr)debugPrint("ListeningandservingHTTPon%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恢复
funcDefault()*Engine{debugPrintWARNINGDefault()engine:=New()engine.Use(Logger(),Recovery())returnengine}
Use源码如下:
func(engine*Engine)Use(middleware...HandlerFunc)IRoutes{engine.RouterGroup.Use(middleware...)engine.rebuild404Handlers()engine.rebuild405Handlers()returnengine}
3.2. MIddleWare对应中间件处理是指指定的个别路由请求或者是请求组会经过处理,这一块我就贴一个以后会用到的代码(请求组的中间件类似,后续章节会详细介绍中间件)
打印耗时中间件TimeCostMiddleware
funcTimeCostMiddleware(c*gin.Context){t:=time.Now()//请求之前c.Next()//处理请求//请求之后//计算整个请求过程耗时t2:=time.Since(t)log.Println(t2)}
使用中间件
packagemainimport("github.com/gin-gonic/gin")funcmain(){//创建一个默认的路由引擎r:=gin.Default()//GET:请求方式;/hello:请求的路径//当客户端以GET方法请求/hello路径时,会执行后面的匿名函数r.GET("/hello",TimeCostMiddleware,func(c*gin.Context){//c.JSON:返回JSON格式的数据c.JSON(200,gin.H{"message":"Helloworld!",})})//启动HTTP服务,默认在0.0.0.0:8080启动服务r.Run()}
发送请求http://localhost:8080/hello
,终端会打印信息,0s
就是中间件打印的请求耗时
2021/08/3014:12:410s[GIN]2021/08/30-14:12:41|?[97;42m200?[0m|0s|::1|?[97;44mGET?[0m"/hello"
4.Handler具体业务
func(c*gin.Context){//c.JSON:返回JSON格式的数据c.JSON(200,gin.H{"message":"Helloworld!",})}
这部分就是一个简单打印字符串的业务,以后实际的应用业务中会添加更复杂功能,比如数据库的操作,缓存的操作,算法的运用等等。
5.服务器响应回复
c.JSON()
就是给用户的响应,也就是在浏览器上展示的字符串,前端会获得这些数据进行前端的展示。
作者:小小小丶叶子著作权归作者所有。