首页 > 其他分享 >简单实现限流中间件

简单实现限流中间件

时间:2024-09-06 15:49:56浏览次数:1  
标签:令牌 capacity 中间件 rate 限流 简单 gin

本文由 ChatMoney团队出品

引言

在现代Web应用开发中,限流是一个重要的概念,它能够保护服务器免受流量攻击,确保服务的稳定性和可用性。Go语言以其高性能和并发处理能力在后端服务开发中广受欢迎。Gin是一个使用Go语言编写的Web框架,以其简洁和高效著称。在Gin框架中,通过中间件实现限流功能是一种常见的做法。

限流中间件的作用

限流中间件的主要作用是控制进入应用的请求数量,以防止服务器过载。限流策略可以基于多种因素,如请求频率、并发连接数、请求大小等。限流中间件可以:

  • 保护后端服务免受DDoS攻击。

  • 避免因资源耗尽而导致的服务拒绝(DoS)。

  • 确保应用在高负载下仍能提供稳定的服务。

限流算法

限流算法是限流中间件的核心,常见的限流算法有:

  1. 固定窗口算法:将时间分割成固定大小的窗口,每个窗口内只允许一定数量的请求通过。

  2. 滑动窗口算法:固定窗口算法的改进,允许窗口内的时间更加平滑地处理请求。

  3. 令牌桶****算法:使用一个令牌桶来存储令牌,请求需要从桶中取出令牌才能通过,令牌以固定速率填充。

  4. 漏桶算法:请求被放入桶中,以固定速率从桶中流出,超出桶容量的请求将被丢弃。

Gin框架限流中间件实现

在Gin框架中,可以通过自定义中间件来实现限流功能。以下是一个使用令牌桶算法实现限流的示例:

package internal

import ("github.com/gin-gonic/gin""net/http""time"
)

// RateLimitMiddleware 限流中间件func RateLimitMiddleware(r *gin.Engine, rate int, capacity int) {// 创建令牌桶
    limiter := NewLimiter(rate, capacity)
// 使用中间件
    r.Use(func(c *gin.Context) {// 从桶中取出一个令牌if !limiter.Allow() {// 如果桶中没有令牌,则返回错误
          c.JSON(http.StatusTooManyRequests, gin.H{"msg": "Too many requests", "type": "rate"})
          c.Abort()return
       }
// 正常处理请求
       c.Next()
    })
}

// Limiter 令牌桶限流器type Limiter struct {
    capacity int
    tokens   int
    rate     time.Duration
    next     int64
}

// NewLimiter 创建一个新的限流器func NewLimiter(rate int, capacity int) *Limiter {return &Limiter{
       capacity: capacity,
       tokens:   capacity,
       rate:     time.Duration(rate) * time.Second,
       next:     time.Now().Unix(),
    }
}

// Allow 检查是否可以从桶中取出一个令牌func (l *Limiter) Allow() bool {
    now := time.Now().Unix()if now > l.next {// 重置桶中的令牌数量
       l.tokens = l.capacity
       l.next = now + int64(l.rate.Seconds())
    }
if l.tokens == 0 {// 桶中没有令牌return false
    }
// 从桶中取出一个令牌
    l.tokens--return true
}

Gin框架中使用

package main

import ("github.com/gin-gonic/gin""go-suno/internal"
)

func main() {
    r := gin.Default()// 使用中间件
    internal.RateLimitMiddleware(r, 1, 100)// 创建一个路由组,可以为其添加中间件
    handler := new(internal.Handler)
    v1 := r.Group("/api")
    {
       v1.POST("/gen", handler.GenMusic)
       v1.GET("/feed", handler.GetFeed)
    }
    _ = r.Run()
}

结语

限流是确保Web应用稳定性和可用性的重要手段。在Gin框架中,通过自定义中间件实现限流功能,可以有效地控制请求流量,防止服务器过载。开发者可以根据实际需求选择合适的限流算法,并结合Gin框架的特点,实现高效、灵活的限流策略。

完整代码

https://gitee.com/mofung1/go-suno

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

标签:令牌,capacity,中间件,rate,限流,简单,gin
From: https://www.cnblogs.com/ChatMoney/p/18400361

相关文章

  • 实现中间件限流的简单方法
    本文由ChatMoney团队出品引言在现代Web应用开发中,限流是一个重要的概念,它能够保护服务器免受流量攻击,确保服务的稳定性和可用性。Go语言以其高性能和并发处理能力在后端服务开发中广受欢迎。Gin是一个使用Go语言编写的Web框架,以其简洁和高效著称。在Gin框架中,通过中间件实现......
  • 有关API接口的介绍及简单的API接口代码示例
    在当今数字化时代,应用程序不再孤立存在。它们通过API(应用程序编程接口)相互连接,共享数据和功能。API是现代软件开发中不可或缺的一部分,它允许不同的软件系统相互通信,实现数据的交换和业务逻辑的集成。一、API接口的基本概念API接口是一种预定义的函数或协议,它允许不同的软件应用......
  • 828华为云征文|华为云Flexus X实例下的场景体验——小企业的福星——最简单的php环境搭
    前言都是php是全世界最好的语言,我也是非常的喜欢,虽然我是搞大数据的,但是php在很逗情况下对于个人开发者来说是非常友好的,对于一般小企业来说使用【华为云FlexusX实例】来搭建一个php服务跑自己的【企业网站】是最方便不过的了,接下来我们就来搭建一下环境。目录前言PHP环境......
  • 立刻行动!这些AI赚钱方法简单易学,人人都能上手
    今天这篇文章会非常接地气,专门为大家介绍几个可以立即上手的AI赚钱方法。更多实操教程和AI绘画工具,可以扫描下方,免费获取1.用AI帮你写文章,轻松赚稿费如果你喜欢写作或者对某个话题有兴趣,比如旅游、美食、育儿,你可以利用AI写作工具快速生成文章内容。很多自媒体平台、......
  • 一次简单的 JVM 调优
    背景最近对负责的项目进行了一次性能优化,其中包括对JVM参数的调整,算是进行了一次简单的JVM调优,JVM参数调整之后,服务的整体性能有5%左右的提升,还算不错。先介绍一下项目的基本情况:项目是一个高 QPS 压力的web服务,单机 QPS 一直维持在1.5K以上,由于旧机器的”拖累”......
  • fastapi middleware中间件
    一、介绍FastAPI中的中间件(Middleware)是一个非常重要的概念,它允许开发者在请求被处理之前和响应被发送之前执行自定义逻辑。中间件在Web应用程序中扮演着桥梁的角色,连接着客户端的请求和服务器端的响应处理过程。以下是FastAPI中间件概念的详细解释:1.中间件的定义在FastAPI中,......
  • Go简单实现几种常用的限流
    固定窗口packagemainimport("fmt""sync""sync/atomic""time")//定义限流结构体typeRateLimiterstruct{intervaltime.Duration//时间窗口tokensint32//令牌总数lastTimeint64......
  • 中间件解析漏洞(附环境搭建教程)
    ⼀:IIS解析漏洞环境资源:https://download.csdn.net/download/Nai_zui_jiang/89717504环境安装windows2003+iis61.创建新的虚拟机2.在下⼀步中选择我们的iso⽂件镜像vm已主动识别到windows20033.产品密钥⽹上搜⼀个密码自己设置一个简单的,这里我用的......
  • 终于使用c++、结构体,函数实现简单数组元素的插入
    includeusingnamespacestd;//定义结构体structMyArray{intarr[100];//数组,假设最大长度为100intn;//数组当前元素数量};//输入函数voidscanf(MyArray&myArray,int&x,int&y){cin>>myArray.n;for(inti=0;i<myArray.n;i++){cin>>my......
  • 中间件解析漏洞
    ⼀:IIS解析漏洞1.1:IIS6.X在iis6.x中,.asp⽂件夹中的任意⽂件都会被当做asp⽂件去执⾏。1.在iis的⽹站根⽬录新建⼀个名为x.asp的⽂件,在x.asp中新建⼀个jpg⽂件。内容为<%=now()%>asp代码2.在外部浏览器中访问windows2003的iis⽹站中的2.jpg发现asp代码被执行......