Gin源码剖析

shidawuhen · · 3430 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务。官方地址:https://github.com/gin-gonic/gin。 ## 使用 在项目中使用Gin也极其简单 1. 下载gin: go get -u -v github.com/gin-gonic/gin 2. import中引入"github.com/gin-gonic/gin" 3. 核心代码 r := gin.Default() r.GET("/ping", ping) r.Run(":8080") 4. go run 后,浏览器输入http://localhost:9090/ping即可使用 5. 可以使用热加载调试 工具:go get -v -u github.com/pilu/fresh - 执行fresh即可,代码有变动会自动编译程序 下面为整体演示代码: ```go package main import ( "net/http" ginSwagger "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles" _ "asap/docs" "github.com/gin-gonic/gin" ) // @Summary 接口探活 // @Produce json // @Param lang query string false "en" // @Success 200 {string} string "ok" // @Router /ping [get] func ping(c *gin.Context) { c.String(http.StatusOK, "ok") } func main() { r := gin.Default() r.GET("/ping", ping) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) v1 := r.Group("/v1") { v1.GET("/group", ping) } // Listen and Server in 0.0.0.0:8080 r.Run(":9090") } ``` ## 源码剖析 Gin代码量很少,使用 find . -name "*.go" | xargs cat | wc -l 查看后,在14K左右。我会从5个方面来进行解析 - 结构简介:Gin使用的结构进行简单说明 - 前期准备:Gin是如何将路由等信息组合起来的 - 监听请求:Gin是如何开启服务,监听请求的 - 请求处理:当请求到达时,Gin如何处理这些请求 - 返回数据:处理完请求后,如何将数据返回给请求方 本文只是做简单的剖析,方便大家能够快速的理解和学习这个框架。 相关结构和流程图可参考: https://www.processon.com/view/link/5e36f9efe4b0d27af1852f3b https://www.processon.com/view/link/5e3fc3d8e4b06b291a662a26 ### 结构简介 本节主要给大家介绍一下Gin使用的核心数据结构或者接口,其中有些图画的不太准确,不过不影响理解。 1. Engine:Engine里有三个非常重要的数据 - RouterGroup:使用Handlers存放中间件,另外提供设置路由的功能 - pool:主要用于从池中获取或者存放Context,减少GC - trees:主要用于存放路由信息和该路由对应的处理函数列表,每个HTTP方法(GET POST等)都有单独的tree <img src="https://shidawuhen.github.io/2020/02/09/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/image-20200209112545254.png" alt="image-20200209112545254" style="zoom:50%;" /> <img src="https://shidawuhen.github.io/2020/02/09/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/image-20200209114011625.png" alt="image-20200209112545254" style="zoom:50%;" /> <img src="https://shidawuhen.github.io/2020/02/09/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/image-20200209112841266.png" alt="image-20200209112545254" style="zoom:50%;" /> 2. Context:主要接收server传递过来的http.Request和http.Response,并对这两个数据进行处理 <img src="https://shidawuhen.github.io/2020/02/09/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/image-20200209113136193.png" alt="image-20200209112545254" style="zoom:30%;" /> ### 四个流程 红色为前期准备,绿色为监听请求,紫色为请求处理,粉色为返回数据。如果图片不清晰,可查看 https://www.processon.com/view/link/5e36f9efe4b0d27af1852f3b <img src="https://shidawuhen.github.io/2020/02/09/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/gin%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90%E6%B5%81%E7%A8%8B.png" alt="image-20200209112545254" style="zoom:7%;" /> ## 说明 1. 学习完Gin框架,我们自己也可以制作简单的go-web框架。go在语言层面帮我们解决了很多重复性的工作,实在是一门有理想有追求的语言。 2. 本文章只是简单的讲解,最好的剖析还是源码本身。 ## 最后 大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫) <img src="https://img-blog.csdnimg.cn/20200524173924388.jpg" /> ## 参考资料 ### 使用 1. https://geektutu.com/post/quick-go-gin.html Go Gin 简明教程 2. https://github.com/gin-gonic/gin 源码 3. https://gin-gonic.com/zh-cn/docs/ 中文文档 4. https://www.kancloud.cn/shuangdeyu/gin_book/949436 gin中文文档 ### 源码 1. https://www.jianshu.com/p/35addb4de300 2. https://www.cnblogs.com/yjf512/p/9670990.html 3. https://www.cnblogs.com/sunsky303/p/9706210.html sync.Pool详解

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3430 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传