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 responseWriter
    Request   *http.Request  // http请求
    Writer    ResponseWriter // http响应输出流

    Params   Params // URL路径参数
    handlers HandlersChain   // 处理器链
    index    int8 // 当前的处理进度,即处理链路处于函数链的索引位置
    fullPath string

    engine       *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框架就采用的是压缩前缀树实现。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业内部知识库:帮助你提高工作效率的好帮手

在现代企业中,知识和信息是一种无形资产,对企业的成长至关重要。员工之间有效地共享知识,可以大幅提高工作效率和团队的整体执行力。为了实现这一点,越来越多的企业开始构建自己的内部知识库,为员工提供一个集中的信息…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“落地项目管理标准,打赢班长的战争”。大会将于5月25-26日在北京举办&am…

液晶触摸屏中应用的电容式触摸芯片

随着多媒体信息查询的与日俱增,人们越来越多地谈到触摸屏,因为触摸屏不仅适用于中国多媒体信息查询的国情,而且触摸屏具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。利用这种技术,用户只要用手指轻轻地碰计算机显示屏…

PCL 高斯滤波(C++详细过程版)

目录 一、概述二、代码实现三、结果展示1、滤波前2、滤波后3、对比PCL 高斯滤波(C++详细过程版)由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 高斯滤波在PCL里有现成的调用函数,具体算法原理和实现代码见:

(八)C++自制植物大战僵尸游戏植物基类讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 在植物大战僵尸游戏中,最重要的两个类别就是植物与僵尸。植物可以对僵尸进行攻击,不同的植物攻击方式千差万别,但是不同植物又有许多相同的属性。在基类(父类&#xf…

temux安装debian自用记录

http://ip:9001/ user/123 http://ip:5705/index admin/drpy 一、安装Ubuntu1804 1.首先安装termux.app 2.启动该app,输入命令 curl -Lo l l.tmoe.me; sh l 3.运行过程中连续选“Y”&…

面向对象设计模式之概念

一、面向对象设计模式 按目的分为创建型(creational)、结构型(structural)和行为型(behavioural);按范围分为类模式和对象模式。 二、设计原则 两大基础设计原则 程序设计的原则:模…

electron项目打包慢、打包报错

项目使用了electron框架,在第一次打包或者网络条件不好的环境下进行打包时熟速度慢的出奇,甚至经常出现打包失败的情况(如上面图片的报错)。 这是因为,在electron打包的过程中,需要去官方源https://github.…

安卓手机怎么连接电脑?这三个方法即刻解决!

随着智能手机的普及,我们越来越依赖手机进行工作和娱乐。然而,有时候我们需要将手机上的数据或文件传输到电脑上,或者需要在电脑上进行某些操作。那么,安卓手机怎么连接电脑呢?这篇文章将为你介绍三种简单的方法&#…

车载摄像头画质增强解决方案,赋能智能驾驶新时代

在智能化浪潮席卷汽车产业的今天,车载摄像头作为智能驾驶的“眼睛”,其画质清晰度直接关系到车辆感知环境的准确性和驾驶的安全性。然而,面对复杂多变的行车环境,如何确保车载摄像头在不同场景下都能呈现出高质量的图像&#xff0…

OpenHarmony轻量系统开发【1】初始OpenHarmony

1.1系统类型 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互…

mac使用docker部署confluence

第一步拉镜像 选择7.13.6 点击pull 在镜像出 创建容器 并配置映射 需要等待一会 浏览器访问 confluence 服务 http://localhost:8090/ 语言选择中文 复制服务器ID 然后停止docker 容器 BBN3-O8RH-XJPI-GYAA 复制docker中confluence的系统文件 进入Files 考文件 文件目录…

基于springboot实现在线考试系统设计【项目源码+论文说明】

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…

vue给页面添加水印

vue给页面添加水印 <template><div class"home"><router-view /></div> </template><script>export default {components: {},data() {return {}},computed: {},mounted() {// 获取需要观察的节点const target document.queryS…

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…

sky08、09笔记常用组合逻辑电路

本节的目的是为了更好的预估delay。 1.1bit全加器 module fadd_1b( a, b, cin, s, cout ); input wire a,b,cin; output wire s,cout;wire p,g; assign p a|b;//propagate carry assign g a&b;//generate carry assign s a^b^cin; assign cout (p&cin)|g; endmodu…

c++的学习之路:19、模板

摘要 本章主要是说了一些模板&#xff0c;如非类型模板参数、类模板的特化等等&#xff0c;文章末附上测试代码与导图 目录 摘要 一、非类型模板参数 二、类模板的特化 1、概念 2、函数模板特化 3、类模板特化 三、模板的分离编译 1、什么是分离编译 2、模板的分离编…

一次网卡驱动BUG故障的排错历程

前言 在日常运维中&#xff0c;总会遇到一些棘手的故障或问题&#xff0c;尤其面临多系统融合的兼容性或一些融合节点可能存在未知bug等方面&#xff0c;排错难度都会增加。 本文将从一次小事件为入口进行延伸&#xff0c;将宿主机esxi基础系统的多融合节点故障的排错历程展开…

分布式监控平台---Zabbix

一、Zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个…

C/C++ C/C++ 入门(6)模板初阶

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 多多指教&#xff01; 一、泛型编程 在之前&#xff0c;我们进行编程的时候&#xff0c;总是针对于某一个具体的问题。就比如说&#xff0c;如何实现一个int类型的swap函数呢&#xff1f;大家肯定会写。…