iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Gin框架限流实现示例
  • 720
分享到

Gin框架限流实现示例

Gin框架限流 2023-03-19 18:03:01 720人浏览 安东尼
摘要

目录什么是限流为什么要进行限流Gin框架的限流实现测试总结完整代码什么是限流 限流是指通过一定的算法,对接口的请求进行限制,防止并发量过大,导致系统瘫痪或响应变慢的情况出现。 为什么

什么是限流

限流是指通过一定的算法,对接口的请求进行限制,防止并发量过大,导致系统瘫痪或响应变慢的情况出现。

为什么要进行限流

高并发的场景下,如果不进行限流,系统可能会因为过多的请求而崩溃。限流可以保护系统免于被流量打崩,从而保证系统的可用性和稳定性。

Gin框架的限流实现

Gin 是一个基于 Go 语言的 WEB 框架,它提供了很多方便的中间件,可以方便地实现限流。

以下是一个基于 Gin 实现的令牌桶限流的例子:

  • 定义令牌桶结构体

    type TokenBucket struct {
        capacity  int64   // 桶的容量
        rate      float64 // 令牌放入速率
        tokens    float64 // 当前令牌数量
        lastToken time.Time // 上一次放令牌的时间
        mtx       sync.Mutex // 互斥
    }
  • 实现令牌桶算法

    func (tb *TokenBucket) Allow() bool {
        tb.mtx.Lock()
        defer tb.mtx.Unlock()
        now := time.Now()
        // 计算需要放的令牌数量
        tb.tokens = tb.tokens + tb.rate*now.Sub(tb.lastToken).Seconds()
        if tb.tokens > float64(tb.capacity) {
            tb.tokens = float64(tb.capacity)
        }
        // 判断是否允许请求
        if tb.tokens >= 1 {
            tb.tokens--
            tb.lastToken = now
            return true
        } else {
            return false
        }
    }
  • 使用中间件进行限流

    func LimitHandler(maxConn int) gin.HandlerFunc {
        tb := &TokenBucket{
            capacity:  maxConn,
            rate:      1.0,
            tokens:    0,
            lastToken: time.Now(),
        }
        return func(c *gin.Context) {
            if !tb.Allow() {
                c.String(503, "Too many request")
                c.Abort()
                return
            }
            c.Next()
        }
    }
  • 在路由中使用中间件

    r := gin.Default()
    // 在路由中使用中间件
    r.Use(LimitHandler(100))
    r.GET("/", func(c *gin.Context) {
        c.String(200, "Hello, World!")
    })
    r.Run(":8080")

以上代码实现了一个简单的令牌桶限流中间件,可以限制最大并发连接数为 100。如果超过了这个连接数,将会返回 503 状态码。

测试

浏览器地址栏输入Http://localhost:8080/, 然后疯狂刷新即可.

  • 测试截图

总结

总的来说,使用 Gin 框架进行限流是一个方便有效的方法,可以提高系统的可用性和稳定性,避免因为过多的请求导致系统崩溃的问题。利用令牌桶算法实现限流可以很好地控制请求的并发量,可以通过控制桶容量和放入速率等参数进行调节和优化。在使用中间件进行限流时,应该根据实际应用场景和需求调节限流参数,祝您的应用愉快运行!

完整代码

package main

import (
   "GitHub.com/gin-gonic/gin"
   "sync"
   "time"
)

type TokenBucket struct {
   capacity  int64      // 桶的容量
   rate      float64    // 令牌放入速率
   tokens    float64    // 当前令牌数量
   lastToken time.Time  // 上一次放令牌的时间
   mtx       sync.Mutex // 互斥锁
}

func (tb *TokenBucket) Allow() bool {
   tb.mtx.Lock()
   defer tb.mtx.Unlock()
   now := time.Now()
   // 计算需要放的令牌数量
   tb.tokens = tb.tokens + tb.rate*now.Sub(tb.lastToken).Seconds()
   if tb.tokens > float64(tb.capacity) {
      tb.tokens = float64(tb.capacity)
   }
   // 判断是否允许请求
   if tb.tokens >= 1 {
      tb.tokens--
      tb.lastToken = now
      return true
   } else {
      return false
   }
}

func LimitHandler(maxConn int64) gin.HandlerFunc {
   tb := &TokenBucket{
      capacity:  maxConn,
      rate:      1.0,
      tokens:    0,
      lastToken: time.Now(),
   }
   return func(c *gin.Context) {
      if !tb.Allow() {
         c.String(503, "Too many request")
         c.Abort()
         return
      }
      c.Next()
   }
}

func main() {
   r := gin.Default()
   // 在路由中使用中间件
   r.Use(LimitHandler(100))
   r.GET("/", func(c *gin.Context) {
      c.String(200, "Hello, World!")
   })
   r.Run(":8080")
}

到此这篇关于Gin框架限流实现示例的文章就介绍到这了,更多相关Gin框架限流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Gin框架限流实现示例

本文链接: https://www.lsjlt.com/news/200418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Gin框架限流实现示例
    目录什么是限流为什么要进行限流Gin框架的限流实现测试总结完整代码什么是限流 限流是指通过一定的算法,对接口的请求进行限制,防止并发量过大,导致系统瘫痪或响应变慢的情况出现。 为什么...
    99+
    2023-03-19
    Gin框架限流
  • Gin框架限流如何实现
    本文小编为大家详细介绍“Gin框架限流如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Gin框架限流如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是限流限流是指通过一定的算法,对接口的请求进行...
    99+
    2023-07-05
  • golang gin框架实现大文件的流式上传功能
    目录upload.htmlgin_stream_upload_file.go一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存。如果是个巨...
    99+
    2024-04-02
  • Golang Gin框架实现文件下载功能的示例代码怎么写
    这期内容当中小编将会给大家带来有关Golang Gin框架实现文件下载功能的示例代码怎么写,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Layui框架实现文件上传基本的思路就是随便创建一个元素,...
    99+
    2023-06-22
  • .Net Core限流的实现示例
    目录一、环境二、基础使用1.设置2.规则设置3.特殊规则的启用 三、请求返回头四、使用Redis存储1、访问计数 2、ip特殊规则3、客户端特殊规则 五...
    99+
    2024-04-02
  • 基于GO语言框架Gin开发MVC轮子框架GinLaravel的示例
    小编给大家分享一下基于GO语言框架Gin开发MVC轮子框架GinLaravel的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是golanggolang ...
    99+
    2023-06-14
  • go实现限流功能示例
    目录引言需求背景web demo搭建限制访问次数编写功能测试总结引言 在我们日常维护中,经常有爬虫进行爬取网页,少则1秒钟请求数十次,多则达百次,严重消耗了服务器带宽,且影响正常使用...
    99+
    2024-04-02
  • Gin框架之参数绑定的实现
    为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、...
    99+
    2024-04-02
  • Golang官方限流器库实现限流示例详解
    目录前言例子实现小结前言 在翻Golang官方库的过程中,发现一个有趣的库golang.org/x/time ,里面只有一个类rate,研究了一下发现它是一个限流器,实现了很多的功能...
    99+
    2024-04-02
  • redis lua限流算法实现示例
    目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指...
    99+
    2024-04-02
  • spring 项目实现限流方法示例
    目录01、为什么AUSTIN项目需要限流02、如何实现限流?03、代码设计04、总结01、为什么AUSTIN项目需要限流 众所周知,服务器能处理的请求数是有限的,如果请求量特别大,我...
    99+
    2022-11-13
    spring 项目限流 项目限流
  • Redis Lua脚本实现ip限流示例
    目录引言相比Redis事务来说,Lua脚本有以下优点Lua脚本java代码IP限流Lua脚本引言 分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或...
    99+
    2024-04-02
  • Pytorch+PyG实现GIN过程示例详解
    目录GIN简介实现步骤数据准备实现模型模型训练GIN简介 GIN(Graph Isomorphism Network)是一类基于图同构的神经网络。在传统的神经网络中,每个节点的特征只...
    99+
    2023-05-17
    Pytorch PyG实现GIN Pytorch PyG
  • ​thinkphp框架执行流程的示例分析
    这篇文章给大家分享的是有关thinkphp框架执行流程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。thinkphp框架执行流程 首先总结一下,框架执行的大致流程: index.php->载入框架...
    99+
    2023-06-06
  • Golang怎么使用Gin框架实现HTTP上传文件
    本文小编为大家详细介绍“Golang怎么使用Gin框架实现HTTP上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用Gin框架实现HTTP上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-05
  • axios gin的GET和POST请求实现示例
    目录axios-GET请求Gin-GET响应Vue-POST请求Gin-POST响应axios-GET请求 created() { console.log('...
    99+
    2024-04-02
  • Gin框架中参数绑定的实现是怎样的
    Gin框架中参数绑定的实现是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content...
    99+
    2023-06-22
  • 基于Redis的限流器的实现(示例讲解)
    1 概述 系统中的接口通常都有限流,比如 70次/秒 ,如何保证我们的接口的调用次数在超过第三方接口限流的时候快速失败呢?这时候就需要限流器了。下面是笔者用redis实现限流器的流程图。 2 代码 ...
    99+
    2024-04-02
  • Springboot+Redis实现API接口限流的示例代码
    添加Redis的jar包. <dependency> <groupId>org.springframework.boot</groupId&...
    99+
    2024-04-02
  • 详解Go中gin框架如何实现带颜色日志
    目录一、gin中控制日志颜色二、终端输出文字颜色是如何实现的当我们在终端上(比如Goland)运行gin框架搭建的服务时,会发现输出的日志是可以带颜色的。比如下图中的最后一行,就是请...
    99+
    2023-05-16
    Go gin框架实现带颜色日志 Go gin框架 颜色日志 Go gin框架 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作