Gin框架小结

Gin 简介

Gin是一个轻量级的Web框架,用于构建高性能的Go语言Web应用程序。提供了路由管理、中间件支持、参数绑定和验证、错误处理、静态文件服务等功能。

Gin框架解决了什么问题和痛点

1.golang http 标准库本身提供了比较简单的路由注册能力,只支持精确匹配,而实际开发时难免会遇到需要使用通配、路径参数的场景。(gin可以使用路由组,来实现通配
2 标准库需要我们手动从请求中读取数据、反序列化,响应时手动序列化、设置Content-Type、写响应内容,比较麻烦 (gin 使用 bind shouldBind
3. 实际开发中, 我们对请求或响应进行一些前置或后置处理,接基于标准库开发,业务和非业务代码难免会耦合在一起 ,(gin可以使用中间件等 做一些统一的前置处理

Gin快速和高性能的原因

轻量级设计:Gi只提供了一些基本的功能和组件,避免了不必要的复杂性。相比于其他框架,Gin的代码量更少,运行时的资源消耗也较低。

高效的路由引擎:Gin使用了高效的路由引擎,基于压缩前缀树(radix tree)和参数树(trie tree)实现了快速的路由匹配。这种路由匹配算法具有较低的时间复杂度。O(k),其中k是键的长度。

优化的上下文处理:Gin在处理请求时使用了上下文(Context)对象,它封装了请求和响应的相关信息。Gin对上下文对象进行了优化,采用了对象池(pool)技术,避免了频繁的对象创建和销毁操作,减少了内存分配的开销。

支持并发处理:Gin框架天生支持并发处理请求。每个请求都会在独立的goroutine中进行处理,这使得多个请求可以同时被处理,提高了并发处理能力。此外,Gin还提供了对goroutine的调度和管理,确保了请求的同步和顺序处理。

中间件机制: Gin的中间件机制允许开发者在请求到达处理函数之前或之后执行一些通用的逻辑。中间件可以用于身份验证、日志记录、错误处理等操作。由于中间件是按照顺序执行的,它们可以在请求处理链中灵活地插入和组合,而不会对性能造成明显的影响。

优化的JSON解析:Gin使用了快速的JSON解析库,如jsoniter,来提高JSON数据的解析速度。这对于处理大量的JSON请求和响应非常有利,可以减少CPU时间的消耗。

Gin使用流程

基于gin开发的一般流程可总结为:
1 创建并初始化Engine对象 gin.default()
2 注册middleware gin.use() (默认会注册Logger()和Recovery()这两个中间件函数)
3 注册路由 (路由组RouterGroup ,可以实现对路由分组,复用前缀 )
4 处理函数 (使用bind shouldbind解析传参->业务逻辑处理->返回结果)
5 服务端口监听
6 在mian函数中加入:gin.run()

Gin中间件

Gin框架中的中间件(Middleware)是一种用于在请求处理过程中执行通用逻辑的机制。中间件可以在请求处理之前或之后执行一些操作

使用中间件:

注册中间件:使用r.Use()方法将中间件注册到Gin的路由器实例上。
中间件顺序:注册的中间件函数会
按照注册的顺序依次执行。

中间件的工作原理:

请求流程:当收到一个HTTP请求时,Gin框架会根据请求的URL和HTTP方法查找匹配的路由。如果有注册的中间件,Gin会将请求传递给中间件链。中间件链中的每个中间件函数都会在请求处理前执行
上下文传递:每个中间件函数都接收一个gin.Context参数,它包含了请求的上下文信息。中间件可以通过Context对象访问和操作请求和响应的数据、路由信息等。中间件可以使用c.Next()方法将请求传递给下一个中间件或路由处理函数,继续处理请求。

中间件分类

其中(Logger,Recovery中间件会默认注册)

Logger(日志记录中间件):Logger中间件用于记录请求和响应的详细信息,例如请求方法、路径、响应状态码等。
Recovery(恢复中间件):Recovery中间件用于在发生panic时恢复应用程序的正常运行。它会捕获并处理应用程序中的异常,防止应用程序崩溃,并返回一个恢复后的响应。
CORS(跨域资源共享中间件):CORS中间件用于处理跨域资源共享的问题。它可以设置响应头,允许跨域请求,并控制响应头中的CORS相关字段,例如Access-Control-Allow-Origin、Access-Control-Allow-Methods
Auth(身份验证中间件):Auth中间件用于验证请求的身份和权限。它可以检查请求中的身份凭证,例如JWT令牌或会话ID,并验证其有效性。
Rate Limiting(限流中间件):Rate Limiting中间件用于限制请求的频率和数量。它可以根据IP地址、用户ID或其他标识符来计算请求的速率,并拒绝超过限制的请求。
Cache(缓存中间件):Cache中间件用于缓存响应数据,以减少对后端服务的请求。它可以根据请求的URL或其他标识符来检查缓存,并返回缓存的响应,而不必重新计算或查询数据。

Gin.Context

Gin框架中,上下文(Context)对象(通常表示为c)是一个关键的组件,它在请求处理过程中承担了多个角色和提供了多种功能
gin.contex 是一个context.Context实现,因此可以将该结构传递到所有接收context.Context的方法或函数中

gin.context中封装了 http.Request和ResponseWriter对象,因此可以通过context对http请求响应进行操作。
context中还封装了HandlersChain处理器链和当前处理位置索引,因此可以很方便地访问处理器。

type Context struct {writermem responseWriterRequest   *http.Request  // http请求Writer    ResponseWriter // http响应输出流Params   Params // URL路径参数handlers HandlersChain   // 处理器链index    int8 // 当前的处理进度,即处理链路处于函数链的索引位置fullPath stringengine       *Engine...mu sync.RWMutex // 用于保护 map 的读写互斥锁// 提供对外暴露的 Get 和 Set 接口向用户提供了共享数据的存取服务,相关操作都在读写锁的保护之下,能够保证并发安全Keys map[string]any // 缓存 handlers 链上共享数据的 map,由于使用的map,避免了设置多个值时context形成链表...queryCache url.Values // 查询参数缓存,使用时调用`Request.URL.Query()`,该方法每次都会对原始的查询字符串进行解析,所以这里设置缓存避免冗余的解析操作formCache url.Values // 表单参数缓存,作用同上...
}

前缀树和压缩前缀树

前缀树(Trie tre)
前缀树也称Trie树或字典树,是一种基于字符串公共前缀构建树形结构,来降低查询时间和提高效率的目的。前缀树一般用于统计和排序大量的字符串,其核心思想是空间换时间。

1根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2从根节点到某一节点路径上所有字符连接起来,就是该节点对应的字符串。
3每个节点任意子节点包含的字符都不相同。

在这里插入图片描述
压缩前缀树(Radix Tree)
压缩前缀树是一种更节省空间的前缀树。对于压缩前缀树的每个节点,
如果某一个节点是其父节点的唯一子节点,则会与父节点合并

gin框架就采用的是压缩前缀树实现。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次内存溢出

1、查看catalina相关日志,确定关键字相关行号 文件:catalina.out命令1:cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上,每一个行号其实都对应到具体时间点。可以发现,这个范围相符合&#xff1…

清明三天,用Python赚了4万?

每年4月,是Python圈子里接私活的旺季,特别是在节假日这种数据暴增的时间段,爬虫采集、逆向破解类的私活订单会集中爆发,量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好,我昨天就做了一单爬虫逆向私活&#xff…

引领软件供应链安全 比瓴科技位居安全牛全景图第一

近日,安全牛第十一版《中国网络安全行业全景图》正式发布,比瓴科技入选全景图软件供应链安全赛道中开发流程安全管理、DevSecOps和软件成分分析三个重要细分领域,并位居开发流程安全管控领域第一。 安全牛本次全景图研究工作于23年正式启动&a…

什么是云安全?云安全包含哪些方面?

云计算彻底改变了数据存储的世界,它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单,也使得云上数据极易造成泄露或者被篡改,所以云安全就显得非常重要了。那么什么是云安全?云安全的工作原理是什么&#xf…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上,有数以百万计的人对软件开发充满热情,他们有很多名字,如软件工程师、程序员、编码员、开发人员。一段时间后,这些人可能会成为一名优秀的编码员,并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具,它旨在帮助用户从各种存储设备中恢复由于各种原因(如误删除、格式化、病毒攻击、系统崩溃等)导致丢失的数据。这款软件支持多种存储介质,包括但不限于硬盘驱动器、U盘…

0.5W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPR-W5 系列

TPR-W5系列是一款需要隔离和电压转换的产品,工业级环境温度,温度范围从–40℃到105℃,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波及提供3000V以上的直流电压隔离,用于需要隔离的场合&am…

【Spring系列】- Spring事务底层原理

实验准备 配置文件 首先在配置文件中配置jdbcTemplate和事务管理器,并且需要开启事务的注解EnableTransactionManagement以及Configuration注解 ComponentScan("com.lyd") EnableTransactionManagement Configuration public class ApplicationConfig …

ES6常用语法

1.声明变量: let 和 const let 声明的变量可以被修改;const 声明的变量是常量,不可被修改。 let x 10; const PI 3.14; 2. 箭头函数 更简洁,绑定了词法作用域的 this 值。不会创建自己的 this,而是继承了上下文中的 this 值…

【ITK滤波】第2期 边缘检测

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的边缘检测,及相关实例和算法解析,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO …

StringUtils.join()

源码 public static String join(Iterable<?> iterable, String separator) {return iterable null ? null : join(iterable.iterator(), separator);} 简介 这个函数是一个静态函数&#xff0c;它接受一个可迭代对象和一个分隔符作为参数&#xff0c;并返回一个将可…

[入门]测试原则-ApiHug准备-测试篇-002

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 写在前面…

低敏猫粮怎么选?看这一篇就够了!

亲爱的朋友们&#xff0c;你们是否曾经为了家中敏感肠胃的小猫咪而犯愁&#xff0c;不知道如何选择适合的猫粮呢&#xff1f;今天&#xff0c;就让我们一起聊聊低敏猫粮与普通猫粮的那些不同之处吧&#xff01;&#x1f431; 1️⃣ **成分差异**&#xff1a;首先&#xff0c;从…

Go 自定义14位时间类型 yyyyMMddHHmmss

目录 功能 代码 功能 数据库或者接口时间类型&#xff0c;经常会使用14位的时间格式。每次都转换有点麻烦。可以自定义一个时间类型。 自定义类型需要实现json接口中的MarshalJSON与UnmarshalJSON两个函数&#xff0c;这样在做json编码解码时就会自动转为14位的时间格式了。…

第四届大数据工程与教育国际会议(BDEE 2024)即将召开!

第四届大数据工程与教育国际会议&#xff08;BDEE 2024&#xff09;将于2024年8月9-11日在泰国清迈举行。数据驱动教育变革&#xff0c;智慧点亮未来课堂&#xff01;BDEE 2024是专注于大数据工程与教育领域的重要学术会议&#xff0c;全球大数据与教育精英齐聚&#xff0c;在数…

使用 Docker 部署 SurveyKing 调查问卷系统

1&#xff09;SurveyKing 介绍 SurveyKing 是一款功能强大、操作简便的开源问卷系统。它不仅满足了用户对问卷调查的基本需求&#xff0c;还提供了丰富的逻辑设置和灵活的问题设置&#xff0c;使得问卷制作更加智能化和个性化。此外&#xff0c;SurveyKing 还具有快速部署和安全…

构建鸿蒙ACE静态库

搭建开发环境 根据说明文档下载鸿蒙全部代码&#xff0c;一般采取第四种方式获取最新代码(请保证代码为最新) 源码获取Windows下载编译环境 MinGW GCC 7.3.0版本 请添加环境变量IDE 可以使用两种 CLion和Qt,CLion不带有环境需要安装MinGW才可以开发,Qt自带MinGW环境&#xff0…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

Unity URP Release-Notes

&#x1f308;Unity URP Release-Notes 收集的最近几年 Unity各个版本中 URP的更新内容 本文信息收集来自自动搜集工具&#x1f448; &#x1f4a1;URP Release-Notes 2023 &#x1f4a1;URP Release-Notes 2022 &#x1f4a1;URP Release-Notes 2021

Unity URP 2023 Release-Notes

&#x1f308;Unity URP 2023 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2023.2.13URP: Ensure motion vector depth buffer is valid for cameras with motion vectors enabled.(UUM-61466)2023.2.2Universal RP: URP: Fixed an issue where scr…