首页>>后端>>Golang->Gin框架运行过程简要探究

Gin框架运行过程简要探究

时间:2023-11-29 本站 点击:0

一、内部运行图

二、各部分源码简要分析

1. 用户发送请求

上一节中用户在浏览器上输入的http://127.0.0.1:8080/hello,会请求和本机的8080端口建立TCP连接进行通信;实际使用中是用户使用的是域名,会经过url解析,再到dns查询找到ip和端口,具体可见 输入网址后发生了什么

2.服务器监听并接收信息

Gin框架中使用net/httphttp.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()就是给用户的响应,也就是在浏览器上展示的字符串,前端会获得这些数据进行前端的展示。

作者:小小小丶叶子著作权归作者所有。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/231.html