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

简单实现限流中间件

时间:2024-06-05 17:14:50浏览次数:17  
标签:令牌 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/18233365

相关文章

  • 研学活动注意事项十项,简单易懂!
    随着信息化教学的发展,学校在组织研学活动时越来越倾向于采用数字化工具来简化流程,提高效率。一些表单类工具过于繁琐,直到我发现易查分小程序这款工具,它不仅能够轻松制作研学活动的报名系统,还可以让家长在线签名,提交报名信息后自动获得报名号,整个报名过程变得简单而高效。研学......
  • 05 Hadoop简单使用
    目录一、hadoop安装配置二、运行hadoop三、hadoop2.x和hadoop3.x变化四、HDFS常用命令五、Java操作HDFS六、MapReduce七、压缩八、yarn常用命令一、hadoop安装配置​1、下载解压hadoop-x.x.x.tar.gztar-xzvfhadoop-x.x.x.tar.gz​2、下载解压jdktar-xzvfj......
  • nuxt简单入门安装
    参考:https://www.jianshu.com/p/fd99718a63e9@目录概要具体流程小结概要听说直接使用vue写前端对百度的seo不够友好,于是便考虑使用nuxt生成静态化来处理具体流程首先你的本机环境要有npm,如下图然后可以使用npx安装nuxt,npx是npm5点几就支持的了,但是我这一开始还不行,还需要手......
  • 有什么方法可以批量把图片转BMP格式?几个操作起来简单且效果好的方法
    图片转BMP怎么弄?在数字图像处理中,不同的文件格式具有不同的特点和适用场景。BMP是一种常用的图像文件格式,以其高质量的图像表现和简单的结构而广受欢迎。有时,我们可能需要将其他格式的图片转换为BMP格式以满足特定需求。本文将为大家详细介绍几个方法轻松实现图片转BMP的操作,感......
  • 操作简单中医电子处方中药划价系统软件视频教程,佳易王诊所电子处方管理系统软件
    操作简单中医电子处方中药划价系统软件视频教程,佳易王诊所电子处方管理系统软件一、前言以下软件操作教程以,佳易王中西医诊所电子处方软件为例说明软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件支持中医和西医处方开单2、系统自动计算费用......
  • perfers-color-scheme 使用简单介绍
    perfers-color-scheme简介prefers-color-scheme媒体查询属性用于检测用户操作系统是否使用深色模式。属性值dark表示用户操作系统使用深色模式light表示用户操作系统使用浅色模式no-preference表示用户操作系统没有偏好,或者操作系统不支持该属性示例@media(prefers......
  • 百万级表格实测,excel是时侯使用XLOOKUP了,比VLOOKUP简单、不出错、快
    使用场景:用“证件号码”查找“Sheet4表”(272181行)的“姓名”列,填充到“Sheet1”表的空白列中。为了演示传说中的二进制查找,我们预先对“Sheet4”进行了按“证件号码”排序。1、VLOOKUP:我们第一次使用公式为:=VLOOKUP(B2,Sheet4!$A$2:$B$272181,1,FALSE),这个公式并没有找到数据......
  • 简单4步,带你用华为云MetaStudio制作数字人短片
    本文分享自华为云社区《使用MetaStudio生产线四步制作数字人视频》,作者:yd_298097624。随着AIGC新技术尤其是大模型技术的发展,音视频行业、数字内容生产行业正在经历这从生产方式和生产效率上的一个巨大变化。预测到2030年有AI大模型生成的数字内容比例将高达90%,包括通过AIGC来生......
  • mqtt-emqx:保留消息的简单例子
    【pom.xml】<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version></dependency><dependency><grou......
  • c# Socket简单介绍
    1、socket简介在C#中,Socket是一个表示网络套接字的类。套接字是一种在应用程序之间进行通信的接口,可以用来实现基于TCP/IP协议的网络应用程序。Socket类提供了创建、管理和维护网络连接的功能,是.NETFramework中的一个基本网络通信类。Socket类的主要作用是提供了......