当前位置: GO > go Gin框架原理

go Gin框架原理

2022-08-11 分类:GO 作者:admin 阅读(25)

一、简介
Gin 是 Go语言写的一个 web 框架,它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json。

Gin官网:Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to httprouter. If you need performance and good productivity, you will love Gin.

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点。

对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。

借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

二、安装与使用入门
安装:前提需要先安装好go1.15+,然后执行如下命令即完成安装。

使用:启动一个gin服务,只需要简单的几行代码。

Gin支持路由、路由分组、中间件、会话控制、数据解析与绑定、参数验证、渲染等等功能,几乎能满足日常开发的所有需要。下面以路由分组、中间件举例,更多可参考文章开头的相关链接。

路由分组

中间件

常用中间件推荐:

RestGate - REST API端点的安全身份验证
staticbin - 用于从二进制数据提供静态文件的中间件/处理程序
gin-cors - CORS杜松子酒的官方中间件
gin-csrf - CSRF保护
gin-health - 通过gocraft/health报告的中间件
gin-merry - 带有上下文的漂亮 打印 错误的中间件
gin-revision - 用于Gin框架的修订中间件
gin-jwt - 用于Gin框架的JWT中间件
gin-sessions - 基于mongodb和mysql的会话中间件
gin-location - 用于公开服务器的主机名和方案的中间件
gin-nice-recovery - 紧急恢复中间件,可让您构建更好的用户体验
gin-limit - 限制同时请求;可以帮助增加交通流量
gin-limit-by-key - 一种内存中的中间件,用于通过自定义键和速率限制访问速率。
ez-gin-template - gin简单模板包装
gin-hydra - gin中间件Hydra
gin-glog - 旨在替代Gin的默认日志
gin-gomonitor - 用于通过Go-Monitor公开指标
gin-oauth2 - 用于OAuth2
static gin框架的替代静态资产处理程序。
xss-mw - XssMw是一种中间件,旨在从用户提交的输入中“自动删除XSS”
gin-helmet - 简单的安全中间件集合。
gin-jwt-session - 提供JWT / Session / Flash的中间件,易于使用,同时还提供必要的调整选项。也提供样品。
gin-template - 用于gin框架的html / template易于使用。
gin-redis-ip-limiter - 基于IP地址的请求限制器。它可以与redis和滑动窗口机制一起使用。
gin-method-override - _method受Ruby的同名机架启发而被POST形式参数覆盖的方法
gin-access-limit - limit-通过指定允许的源CIDR表示法的访问控制中间件。
gin-session - 用于Gin的Session中间件
gin-stats - 轻量级和有用的请求指标中间件
gin-statsd - 向statsd守护进程报告的Gin中间件
gin-health-check - check-用于Gin的健康检查中间件
gin-session-middleware - 一个有效,安全且易于使用的Go Session库。
ginception - 漂亮的例外页面
gin-inspector - 用于调查http请求的Gin中间件。
gin-dump - Gin中间件/处理程序,用于转储请求和响应的标头/正文。对调试应用程序非常有帮助。
go-gin-prometheus - Gin Prometheus metrics exporter
ginprom - Gin的Prometheus指标导出器
gin-go-metrics - Gin middleware to gather and store metrics using rcrowley/go-metrics
ginrpc - Gin 中间件/处理器自动绑定工具。通过像beego这样的注释路线来支持对象注册
三、Gin与net/http
实际上,Go的net/http包基本上提供了从服务请求到服务响应的全套服务。

原生ntp/http代码如下:

从net/http源码学习,服务监听与响应的大致流程如下:

在这里插入图片描述

既然 net/http基本上提供了全套的服务,那为什么还需要类似于gin的web框架。

从net/http的路由匹配规则来看:net/http的路由匹配根本就不符合 RESTful 的规则,遇到复杂一点的需求时,这个简单的路由匹配规则简直就是噩梦。

所以基本所有的go web框架干的最主要的一件事情就是重写net/http的route。

甚至可以直接说 gin就是一个 httprouter 也不过分,当然gin也提供了其他比较主要的功能。

综上,net/http基本已经提供http服务的大部分功能,那些号称贼快的go框架,基本上都是提供一些功能,让我们能够更好的处理客户端发来的请求。

自定义路由示例【重写route简易版】

四、Gin路由原理
前面说过,Gin框架实际上就是一个route路由重写框架,那么Gin是如果引入路由、生成路由树、进行路由查找的?

1、路由引入
gin启动server服务【router.run()】的底层依然是 http.ListenAndServe(),所以 gin 建立 socket 的过程,accept 客户端请求的过程与 net/http 没有差别,会同样重复上面的过程。唯一有差别的位置就是在于获取 ServeHTTP 的位置。

在这里插入图片描述

http请求路由引入源码流程

2、路由注册
gin 框架中采用的路由库是基于httprouter做的,httprouter会将所有路由规则构造一颗前缀树。

路由注册流程【生成路由树的源码流程】

路由树

当然最简单最粗暴的就是每个字符串占用一个树的叶子节点,不过这种设计会带来的问题:占用内存会升高,实际上Gin采用了共用前缀方式构建树。如: abc, abd, af 都是用共同的前缀的,如果能共用前缀的话,可以省内存空间。

3、路由查找
当 gin 收到客户端的请求时,第一件事就是去路由树里面去匹配对应的 URL,找到相关的路由,拿到相关的处理函数。其实这个过程就是 handleHTTPRequest 要干的事情。

路由查找源码流程

————————————————
版权声明:本文为CSDN博主「进击的程序猿~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41822345/article/details/125819016

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

支付宝
微信
0

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 - go Gin框架原理

博客简介

精彩评论

  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    新增一个框架图! http://biji.jinli.vip/wp-content/upl...

    评:新文章!
  • 一位WordPress评论者(6年前 (2020-02-13))

    嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

    评:世界,您好!