• 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

    • 基础代码
  • 相关阅读:
    网络爬虫是什么?怎么学python爬虫
    GitHub 最新发布的这份 Java 面试导图 + 面试手册,真不是吹的
    操作系统四大特征
    ES8 打印DSL
    C-模型压缩部署概述
    linux下命令行静默安装oracle11G简要步骤
    php static延迟静态绑定
    【JVM】运行时数据区之 堆——自问自答
    Spring 从入门到精通 (十八) AOP注解式开发
    字符串替换StringUtils.replace()
  • 原文地址:https://blog.csdn.net/qq_37703224/article/details/141090407