gin源码剖析
介绍
Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务。官方地址:https://github.com/gin-gonic/gin。
使用
在项目中使用Gin也极其简单
下载gin: go get -u -v github.com/gin-gonic/gin
import中引入”github.com/gin-gonic/gin”
核心代码
r := gin.Default()
r.GET(“/ping”, ping)
r.Run(“:8080”)
go run 后,浏览器输入http://localhost:9090/ping即可使用
可以使用热加载调试 工具:go get -v -u github.com/pilu/fresh - 执行fresh即可,代码有变动会自动编译程序
下面为整体演示代码:
1  | 
package main  | 
2  | 
|
3  | 
import (  | 
4  | 
"net/http"  | 
5  | 
|
6  | 
ginSwagger "github.com/swaggo/gin-swagger"  | 
7  | 
"github.com/swaggo/gin-swagger/swaggerFiles"  | 
8  | 
|
9  | 
_ "asap/docs"  | 
10  | 
|
11  | 
"github.com/gin-gonic/gin"  | 
12  | 
)  | 
13  | 
|
14  | 
|
15  | 
// @Produce json  | 
16  | 
// @Param lang query string false "en"  | 
17  | 
// @Success 200 {string} string "ok"
 | 
18  | 
// @Router /ping [get]  | 
19  | 
func (c *gin.Context) {
 | 
20  | 
c.String(http.StatusOK, "ok")  | 
21  | 
}  | 
22  | 
|
23  | 
func main() {
 | 
24  | 
r := gin.Default()  | 
25  | 
	r.GET("/ping", ping)
 | 
26  | 
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 | 
大专栏  gin源码剖析="gutter">
27  | 
	v1 := r.Group("/v1")
 | 
28  | 
	{
 | 
29  | 
		v1.GET("/group", ping)
 | 
30  | 
}  | 
31  | 
// Listen and Server in 0.0.0.0:8080  | 
32  | 
	r.Run(":9090")
 | 
33  | 
}  | 
源码剖析
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使用的核心数据结构或者接口,其中有些图画的不太准确,不过不影响理解。
- Engine:Engine里有三个非常重要的数据
- RouterGroup:使用Handlers存放中间件,另外提供设置路由的功能
 - pool:主要用于从池中获取或者存放Context,减少GC
 - trees:主要用于存放路由信息和该路由对应的处理函数列表,每个HTTP方法(GET POST等)都有单独的tree
 
 



- Context:主要接收server传递过来的http.Request和http.Response,并对这两个数据进行处理
 

四个流程
红色为前期准备,绿色为监听请求,紫色为请求处理,粉色为返回数据。如果图片不清晰,可查看 https://www.processon.com/view/link/5e36f9efe4b0d27af1852f3b

说明
- 学习完Gin框架,我们自己也可以制作简单的go-web框架。go在语言层面帮我们解决了很多重复性的工作,实在是一门有理想有追求的语言。
 - 本文章只是简单的讲解,最好的剖析还是源码本身。
 
参考资料
使用
https://geektutu.com/post/quick-go-gin.html Go Gin 简明教程
源码
https://www.cnblogs.com/sunsky303/p/9706210.html sync.Pool详解
gin源码剖析的更多相关文章
- gin 源码阅读(5) - 灵活的返回值处理
		
gin 源码阅读系列文章列表: gin 源码阅读(1) - gin 与 net/http 的关系 gin 源码阅读(2) - http请求是如何流入gin的? gin 源码阅读(3) - gin 路由 ...
 - jQuery之Deferred源码剖析
		
一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...
 - Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现
		
声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...
 - Apache Spark源码剖析
		
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
 - 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
		
项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...
 - STL"源码"剖析-重点知识总结
		
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
 - SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
		
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
 - 自己实现多线程的socket,socketserver源码剖析
		
1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...
 - Java多线程9:ThreadLocal源码剖析
		
ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...
 
随机推荐
- 利用Matlab神经网络计算包预测近四天除湖北外新增确诊人数:拐点已现
			
数据来源: 国家卫健委 已经7连降咯! 1.20-2.10图示(更新中): 神经网络训练并预测数据: clear %除湖北以外全国新增确诊病例数 2020.1.20-2.9 num=[5,44,62, ...
 - 《Docekr入门学习篇》——Docker网络及数据卷
			
Docker网络设置 默认情况下docker会创建一个桥接网卡[docker 0],docker有两种映射方式,一种是随机映射,一种是指定映射. 提示:生产场景一般不使用随机映射,但是随机映射的好处是 ...
 - 用数组来实现Stack
			
1:Stack特点 stack:栈,是一种特殊的数据结构,有着先入后出的特点(first in last out).stack中栈底始终不变,只有一端能变化.栈顶在有数据push的时候增大,有数据po ...
 - 吴裕雄--天生自然 JAVA开发学习:正则表达式
			
import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...
 - android studio 修改新建EmptyActivity默认布局
			
https://www.jianshu.com/p/d4f201135097 打开你的Android Sudio安装目录,我的为D:\Program Files\Android\Android Stu ...
 - ZJNU 2208 - 你渴望力量吗
			
在图的最外面套一层0(防止到头) 然后搜索图有多少块在 '0'有两块0,一块1 '1'有一块0,一块1 其余情况不存在 #include<stdio.h> ],dx[]={,,,-},dy ...
 - Maven--优化依赖
			
Maven 会自动解析所有项目的直接依赖和传递依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在.在这些工作之后,最后得到的那些依赖 ...
 - 富文本编辑器Tinymce的示例和配置
			
Demo链接: https://download.csdn.net/download/silverbutter/10557703 有时候需要验证tinyMCE编辑器中的内容是否符合规范(不为空),就需 ...
 - Windows10配置Jmeter环境
			
注:在安装Jmeter之前,请先检查下电脑有没有装JDK:[Win+R]然后输入cmd->进入命令行界面,输入java -version 出现以下信息就是此电脑已安装了JDK.由于jmeter要 ...
 - logstash kafka的版本兼容问题
			
项目细节也就不说了 kafka + spark streaming >> kafka版本1.0,spark streaming也是依照kafka1.0开发的 这个kfk集群叫kfk_1.0 ...