• zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架


    zdpgo_gin_limit

    为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架

    安装

    go get github.com/zhangdapeng520/zdpgo_gin_limit
    

    使用教程

    基于内存的限流

    package main
    
    import (
    	gin "github.com/zhangdapeng520/zdpgo_gin"
    	limit "github.com/zhangdapeng520/zdpgo_gin_limit"
    	"time"
    )
    
    func keyFunc(c *gin.Context) string {
    	return c.ClientIP()
    }
    
    func errorHandler(c *gin.Context, info limit.Info) {
    	c.String(429, "Too many requests. Try again in "+time.Until(info.ResetTime).String())
    }
    
    func main() {
    	server := gin.Default()
    	// This makes it so each ip can only make 5 requests per second
    	store := limit.InMemoryStore(&limit.InMemoryOptions{
    		Rate:  time.Second,
    		Limit: 5,
    	})
    	mw := limit.RateLimiter(store, &limit.Options{
    		ErrorHandler: errorHandler,
    		KeyFunc:      keyFunc,
    	})
    	server.GET("/", mw, func(c *gin.Context) {
    		c.String(200, "Hello World")
    	})
    	server.Run(":8080")
    }
    

    基于Redis的限流

    package main
    
    import (
    	gin "github.com/zhangdapeng520/zdpgo_gin"
    	limit "github.com/zhangdapeng520/zdpgo_gin_limit"
    	redis "github.com/zhangdapeng520/zdpgo_redis_v2"
    	"time"
    )
    
    // 基于什么限流?
    // 此函数返回用于限流的key
    func keyFunc(c *gin.Context) string {
    	return c.ClientIP()
    }
    
    // 错误处理
    // 当被限流的时候返回此内容
    func errorHandler(c *gin.Context, info limit.Info) {
    	c.String(429, "Too many requests. Try again in "+time.Until(info.ResetTime).String())
    }
    
    func main() {
    	server := gin.Default()
    	// 这使得每个ip每秒只能发出5个请求
    	store := limit.RedisStore(&limit.RedisOptions{
    		RedisClient: redis.NewClient(&redis.Options{
    			Addr: "localhost:6379",
    		}),
    		Rate:  time.Second, // 按秒限流
    		Limit: 5,           // 每秒可以请求5次
    	})
    	mw := limit.RateLimiter(store, &limit.Options{
    		ErrorHandler: errorHandler,
    		KeyFunc:      keyFunc,
    	})
    	server.GET("/", mw, func(c *gin.Context) {
    		c.String(200, "Hello World")
    	})
    	server.Run(":8080")
    }
    

    版本

    v0.1.0

    • 基础代码
  • 相关阅读:
    【论文阅读】CTAB-GAN: Effective Table Data Synthesizing
    C语言基础练习题11-20
    论文推荐:基于GE-MRI的多任务学习
    SpringBoot-黑马程序员-学习笔记(三)
    二叉树最大宽度(java 算法 bfs)
    JavaSE从基础到入门:抽象类和接口
    基于JavaSwing开发个人简历程序 课程设计 大作业
    ROS 2知识:通信协议 DDS/RTPS
    Spring中自动注入的两种方式
    JDBC SQL Server Source Connector: 一览与实践
  • 原文地址:https://blog.csdn.net/qq_37703224/article/details/141090407