Golang限流器rate使用

rate包是Google基于令牌桶的算法实现的限流器,可以在服务的限流中使用。

 

我们通过一个例子来使用rate

package main

import (
	"fmt"
	"time"
	"context"

	"golang.org/x/time/rate"
)

func main() {
	//初始化 limiter 每秒10个令牌,令牌桶容量为20
	limiter :=  rate.NewLimiter(rate.Every(time.Millisecond*100),20)

	for i := 0 ; i < 25 ; i++ {
		if limiter.Allow() {
			fmt.Println("success")  //do something
		}else {
			fmt.Println("busy")
		}
	}

	//阻塞直到获取足够的令牌或者上下文取消
	ctx,_ := context.WithTimeout(context.Background(),time.Second*10)
	fmt.Println("start get token",time.Now())
	err := limiter.WaitN(ctx,20)
	if err != nil {
		fmt.Println("error",err)
	}

	fmt.Println("success get token",time.Now())
}

 

 

说明:rate.NewLimiter用于初始化限流器,指定限流的速率

Golang是一种开源的编程语言,它具有高效、简洁和并发性强的特点,非常适合用于构建高性能的网络应用程序。在Golang中,可以使用一些库和技术来实现IP防刷和限流的功能。 一种常见的方法是使用令牌桶算法来进行限流。令牌桶算法基于一个令牌桶,其中含了一定数量的令牌。每当有请求到达时,就会从令牌桶中取出一个令牌,如果令牌桶中没有足够的令牌,则请求会被拒绝或者延迟处理。这种方式可以有效地控制请求的速率,防止恶意刷接口或者DDoS攻击。 在Golang中,可以使用一些第三方库来实现令牌桶算法。例如,可以使用"golang.org/x/time/rate"来实现基于令牌桶的限流功能。该提供了Rate类型,可以用于定义每秒允许通过的请求数量,并且可以使用Allow方法来判断是否允许处理请求。 下面是一个简单的示例代码,演示了如何使用"golang.org/x/time/rate"来实现IP防刷和限流: ```go package main import ( "fmt" "net" "net/http" "time" "golang.org/x/time/rate" ) func main() { // 创建一个限流器,每秒允许通过3个请求 limiter := rate.NewLimiter(3, 1) // 创建一个HTTP服务器 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 获取请求的IP地址 ip, _, _ := net.SplitHostPort(r.RemoteAddr) // 判断是否允许处理请求 if limiter.Allow() { // 允许处理请求 fmt.Fprintf(w, "Hello, World!") } else { // 请求被限流 http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) } }) // 启动HTTP服务器 http.ListenAndServe(":8080", nil) } ``` 在上面的示例代码中,我们创建了一个限流器,每秒允许通过3个请求。然后,在处理HTTP请求时,我们获取请求的IP地址,并使用限流器判断是否允许处理请求。如果允许处理请求,则返回"Hello, World!";如果请求被限流,则返回429 Too Many Requests错误。 这只是一个简单的示例,实际应用中可能需要更复杂的逻辑来判断是否需要限流,例如根据不同的IP地址或者用户身份进行不同的限制。同时,还可以结合其他技术,如缓存、分布式限流等来提高系统的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值