首页 > 其他分享 >Go+Gin 接口防止用户频繁访问

Go+Gin 接口防止用户频繁访问

时间:2024-03-21 16:34:43浏览次数:28  
标签:令牌 IP gin 接口 rate limiter Go Gin

在Go+Gin框架中,可以利用中间件实现API防洪(防止用户频繁访问)功能。一种常见的防洪技术是利用Go的漏桶算法或令牌桶算法进行流量控制。
以下面的Go代码为例,演示了一个简单的令牌桶方式的中间件:

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    "golang.org/x/time/rate"
)

// 创建一个 map 来存储每个 IP 的访问限制
var visitors = make(map[string]*rate.Limiter)

// 获取用户 IP 为 key 的令牌桶,若不存在则创建一个
func getVisitor(ip string) *rate.Limiter {
    limiter, exists := visitors[ip]
    if !exists {
        limiter = rate.NewLimiter(1, 5)  // 每秒生成1个令牌,且桶中最多存储5个令牌
        visitors[ip] = limiter
    }

    return limiter
}

// 控制访问频率的中间件
func limitMiddleware(c *gin.Context) {
    limiter := getVisitor(c.ClientIP())
    // Allow方法返回是否可以接收请求,此处是否可以拿取令牌
    if !limiter.Allow() {
        c.String(http.StatusTooManyRequests, "Too many requests.")
        c.Abort()
        return
    }

    c.Next()
}

func main() {
    router := gin.Default()
    router.Use(limitMiddleware)

    router.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Welcome!")
    })

    router.Run(":8080")
}

因为此方式是在内存中存储IP与限制器映射的,重启服务后计数器将被重置,且长时间大量请求可能会耗费更多内存。如果想要更加稳健的处理方式,可以考虑使用Redis等数据库存储限制器。同时真实环境中,用户的IP可能会被隐藏或者动态更换,所以光靠IP可能无法完全限制某一用户的访问频率,具体情况需要具体分析。
注意,运行此代码需要额外安装 "golang.org/x/time/rate" 包。你可以通过 "go get golang.org/x/time/rate" 获取这个包。

标签:令牌,IP,gin,接口,rate,limiter,Go,Gin
From: https://www.cnblogs.com/0x1cc4/p/18087675

相关文章

  • 软件测试---接口测试基础理论
    目录软件开发中常见的模块化单位接口测试的接口是什么为什么需要做接口测试常见的HTTP状态码介绍一下HTTP网络协议常用的接口请求方法进行GET和POST接口测试GET请求示例POST请求示例常见的HTTP请求库或框架cookie、session、tokencookietokensession如何判断测试覆盖率......
  • 重新记录一下ArcGisEngine安装的过程
    前言好久不用Arcgis,突然发现想用时,有点不会安装了,所以这里记录一下安装过程。下载Arcgis首先,下载一个arcgis版本,我这里下的是10.1。推荐【gis思维(公众号)】,【麻辣GIS(网站)】。当然了,这都是很旧很旧的版本了,基本上没有三维功能。一定要下载带注册机的。arcgis的压缩包包含3......
  • Step by Step Data Replication Using Oracle GoldenGate
    1、Quickstarts2、ConfigureDeployments3、ManageDeploymentsfromtheServiceManager 4、ConfigureDataReplicationProcessesfromtheAdministrationService 5、ConfigurePathstoTransportTraiData 6、MonitorPathsandTrailsfromtheReceiver......
  • 身份证ocr,python身份证识别ocr接口代码,实名认证接口
    基于文字识别技术产物的身份证识别接口现已成熟,通过手机、电脑或者摄像头终端设备拍照或者上传身份证图片即可实现身份证照片上文字的识别,从而提取到身份证信息。翔云除了提供身份证识别接口外,还完善了实名认证接口方案,搭配翔云身份证实名认证接口可谓是效率翻倍。身份证......
  • Nginx 反向代理
    nginx反向代理的好处提高访问速度因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。进行负载均衡所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。保......
  • 小于电商开放平台接口说明
    接口说明说明Host配置测试环境正式环境请求基础参数响应基础参数#联系我们小于电商开放平台是指每家企业可以拥有一套独立的密钥信息(AppId与AppSecret),通过这套密钥信息来调用电商平台公布出来的企业相关的开放接口,比如店铺、商品、订单等数据接口。说明基于企......
  • 使用元类实现Django的ORM
    一、ORM基本介绍ORM是python编程语言后端web框架Django的核心思想,“ObjectRelationalMapping”,即对象-关系映射,简称ORM。二、实现目标创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句如图:三、......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow(abc345A)题目大意给定一个字符串,问是不是形如<======...====>的字符串。解题思路根据长度构造出期望的字符串,再判断是否相等即可。神奇的代码s=input()print("Yes"ifs=="<"+"="*(len(s)-2)+">"else"No")B-Inte......
  • nginx localtion 匹配规则
    1、语法规则 语法规则:location[=|~|^~*|^~]/uri/{…}表示精确匹配,这个优先级也是最高的^~表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/image/20%/aa,可以被规则^~/image//aa匹配到(注意是空格)。~表示区分......
  • 拼多多商品详情数据接口(Pinduoduo.item_get)
    拼多多提供了详细的API接口文档,商家可以通过调用这些API接口实时获取商品的详细信息。为了实现实时数据获取,商家可以使用编程语言(如Python、Java)来编写程序,通过API接口与拼多多的服务器进行交互,从而获取所需数据。以下是关于拼多多商品详情数据接口的一些建议:阅读官方文档:在......