https://blog.csdn.net/HideonHacker/article/details/138095563
Gin官网文档地址:https://gin-gonic.com/zh-cn/docs
Gin 是在 Golang HTTP 标准库 net/http 基础之上的再封装,即Gin的底层还是http的实现,但是新增了gin.Engine对象,作为Handler注入,从而实现路由的注册和匹配、请求处理的链路优化。
Gin框架特点
- 支持中间件操作( handlersChain 机制 )
- 更方便的使用( gin.Context )
- 更强大的路由解析能力( radix tree 路由树 )
简单的gin实例
1 | func main() { |
处理请求
在服务端接收到 http 请求时,会通过 Handler.ServeHTTP 方法进行处理. 而此处的 Handler 正是 gin.Engine,其处理请求的核心步骤如下:
对于每笔 http 请求,会为其分配一个 gin.Context,在 handlers 链路中持续向下传递
调用 Engine.handleHTTPRequest 方法,从路由树中获取 handlers 链,然后遍历调用
处理完 http 请求后,会将 gin.Context 进行回收. 整个回收复用的流程基于对象池管理
abbrlink: Gin框架
categories: []
date: ‘2024-12-02T15:53:49.555392+08:00’
references: null
tags:
- Go
- Gin
title: Gin框架
updated: ‘2024-12-02T15:50:58.696+08:00’
https://blog.csdn.net/HideonHacker/article/details/138095563
Gin官网文档地址:https://gin-gonic.com/zh-cn/docs
Gin 是在 Golang HTTP 标准库 net/http 基础之上的再封装,即Gin的底层还是http的实现,但是新增了gin.Engine对象,作为Handler注入,从而实现路由的注册和匹配、请求处理的链路优化。
Gin框架特点
- 支持中间件操作( handlersChain 机制 )
- 更方便的使用( gin.Context )
- 更强大的路由解析能力( radix tree 路由树 )
简单的gin实例
1 | func main() { |
处理请求
在服务端接收到 http 请求时,会通过 Handler.ServeHTTP 方法进行处理. 而此处的 Handler 正是 gin.Engine,其处理请求的核心步骤如下:
- 对于每笔 http 请求,会为其分配一个 gin.Context,在 handlers 链路中持续向下传递
- 调用 Engine.handleHTTPRequest 方法,从路由树中获取 handlers 链,然后遍历调用
- 处理完 http 请求后,会将 gin.Context 进行回收. 整个回收复用的流程基于对象池管理
自定义中间件
1 | func Logger() gin.HandlerFunc { |
常用自定义中间件 超时 加密校验 读取通用参数
Gin路由树
路由树的数据结构是压缩前缀树
压缩前缀树又称基数树或 radix 树,是对前缀树的改良版本,优化点主要在于空间的节省,核心策略体现在:
倘若某个子节点是其父节点的唯一孩子,则与父节点进行合并
总结
- gin 将 Engine 作为 http.Handler 的实现类进行注入,从而融入 Golang net/http 标准库的框架之内
- gin 中基于 handler 链的方式实现中间件和处理函数的协调使用
- gin 中基于压缩前缀树的方式作为路由树的数据结构,对应于 9 种 http 方法共有 9 棵树
- gin 中基于 gin.Context 作为一次 http 请求贯穿整条 handler chain 的核心数据结构
- gin.Context 是一种会被频繁创建销毁的资源对象,因此使用对象池 sync.Pool 进行缓存复用