首页 > 后端开发 > Golang > 正文

如何在Golang中实现HTTP请求限速

P粉602998670
发布: 2025-10-26 17:28:01
原创
740人浏览过
使用 rate.Limiter 实现 HTTP 请求限速,通过设置每秒令牌数和突发容量控制 QPS,可封装为自定义客户端或按域名独立限速,避免服务过载。

如何在golang中实现http请求限速

在Golang中实现HTTP请求限速,核心思路是控制单位时间内发出的请求数量。常用方法是利用 令牌桶算法,Go标准库中的 golang.org/x/time/rate 包提供了简单高效的实现方式。以下是具体做法。

使用 rate.Limiter 控制请求频率

rate.Limiter 是 Go 官方提供的限流工具,适合控制每秒请求数(QPS)。你可以为每个 HTTP 客户端或整个服务设置统一的限速规则。

示例:限制每秒最多 5 个请求,突发允许 1 次额外请求:

package main
<p>import (
"fmt"
"net/http"
"time"
"golang.org/x/time/rate"
)</p><p>func main() {
// 每秒填充 5 个令牌,最多容纳 6 个(burst=6)
limiter := rate.NewLimiter(5, 6)</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">client := &http.Client{Timeout: 10 * time.Second}

urls := []string{
    "https://httpbin.org/delay/1",
    "https://httpbin.org/delay/1",
    "https://httpbin.org/delay/1",
}

for _, url := range urls {
    // 请求前等待令牌
    if err := limiter.Wait(nil); err != nil {
        fmt.Printf("请求被取消: %v\n", err)
        continue
    }

    resp, err := client.Get(url)
    if err != nil {
        fmt.Printf("请求失败: %v\n", err)
        continue
    }
    fmt.Printf("响应状态: %s\n", resp.Status)
    resp.Body.Close()
}
登录后复制

}

封装带限速的 HTTP 客户端

为了复用和解耦,可以将限速逻辑封装进自定义的 HTTP 客户端结构体中。

立即学习go语言免费学习笔记(深入)”;

type RateLimitedClient struct {
    Client   *http.Client
    Limiter  *rate.Limiter
}
<p>func (r <em>RateLimitedClient) Get(url string) (</em>http.Response, error) {
if err := r.Limiter.Wait(nil); err != nil {
return nil, err
}
return r.Client.Get(url)
}
登录后复制

使用方式:

Alkaid.art
Alkaid.art

专门为Phtoshop打造的AIGC绘画插件

Alkaid.art 153
查看详情 Alkaid.art
limitedClient := &RateLimitedClient{
    Client:  &http.Client{},
    Limiter: rate.NewLimiter(2, 2), // 2 QPS
}
<p>resp, err := limitedClient.Get("<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>")
登录后复制

按域名或服务做独立限速

如果请求多个不同服务,建议对每个域名使用独立的限速器,避免相互影响。

可以用 map 缓存每个 host 对应的 limiter,例如:

var hostLimiters = sync.Map{} // key: host, value: *rate.Limiter
<p>func getLimiterForHost(host string) <em>rate.Limiter {
if limiter, ok := hostLimiters.Load(host); ok {
return limiter.(</em>rate.Limiter)
}
newLimiter := rate.NewLimiter(3, 3) // 不同 host 可配置不同速率
limiter, _ := hostLimiters.LoadOrStore(host, newLimiter)
return limiter.(*rate.Limiter)
}
登录后复制

发送请求前调用对应 host 的限速器即可。

基本上就这些。通过 golang.org/x/time/rate 结合 HTTP 客户端,可以轻松实现细粒度的请求限速,防止对目标服务器造成压力或触发封禁。关键是根据业务场景合理设置填充速率和突发容量。不复杂但容易忽略。

以上就是如何在Golang中实现HTTP请求限速的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号