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

zdpgo_gin_limit

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

安装

bash 复制代码
go get github.com/zhangdapeng520/zdpgo_gin_limit

使用教程

基于内存的限流

go 复制代码
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的限流

go 复制代码
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

  • 基础代码
相关推荐
小G同学7 小时前
golang+gin实现api接口开发
golang·gin
我重来不说话2 天前
免费Ollama大模型集成系统——Golang
golang·gin·ollama·免费大模型
神奇侠20245 天前
快速开发-基于gin的中间件web项目开发
中间件·gin
Zyxalia8 天前
gin + es 实践 03
elasticsearch·jenkins·gin
Zyxalia9 天前
gin + es 实践 01
大数据·elasticsearch·gin
柯南二号9 天前
Go使用Gin写一个对MySQL的增删改查服务
mysql·golang·gin
Zyxalia9 天前
gin + es 实践 05
大数据·elasticsearch·gin
Zyxalia10 天前
gin + es 实践 07
网络·elasticsearch·gin
pedestrian_h13 天前
gRPC学习笔记记录以及整合gin开发
笔记·学习·golang·gin·grpc
liuyunshengsir15 天前
Gin 集成 prometheus 客户端实现注册和暴露指标
prometheus·gin