Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go每日一库之162:throttled(轻量级限流工具)

Go每日一库之162:throttled(轻量级限流工具)

作者头像
luckpunk
发布于 2023-10-02 00:21:30
发布于 2023-10-02 00:21:30
39700
代码可运行
举报
运行总次数:0
代码可运行

throttled 是一个非常轻量且易扩展的限流组件,我们可以将它轻松地集成到应用程序中,以实现限流和配额管理的能力。

简介

throttled(https://github.com/throttled/throttled) 基于通用信元速率算法实现了对资源的访问速率限制,资源可以是特定的 URL、用户或者任何自定义的形式,可以很方便地与各种 http 和 rpc 框架进行集成。throttled 定义了限流元信息的存储抽象,并内置了 memstore,redis store 等元信息存储实现,我们可以根据具体的使用场景实现单机限流和集群限流。

使用举例

下面我们来基于 throttled 自带的 http 限流组件实现一个简单的 demo 试试看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "log"
    "net/http"

"github.com/throttled/throttled/v2"
    "github.com/throttled/throttled/v2/store/memstore"
)

func main() {
    // 在 store 中添加 key 的数量限制
    store, err := memstore.New(65536)
    if err != nil {
        log.Fatal(err)
    }

// 配置限流规则
    quota := throttled.RateQuota{
        MaxRate:  throttled.PerMin(20),
        MaxBurst: 5,
    }
    rateLimiter, err := throttled.NewGCRARateLimiter(store, quota)
    if err != nil {
        log.Fatal(err)
    }

httpRateLimiter := throttled.HTTPRateLimiter{
        RateLimiter: rateLimiter,
        // 根据 path 进行限流
        VaryBy: &throttled.VaryBy{Path: true},
    }

handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "hello, world\n")
    })
    http.ListenAndServe(":8080", httpRateLimiter.RateLimit(handler))
}

以上我们实现了一个按请求 path 进行限流的 http 服务,允许同一个 path 每分钟 20 次请求,并支持短时间内最多 5 个请求的 burst。

此外,我们也可以通过指定 VaryBy 和 DeniedHandler 的方式对资源定义和超限处理进行一些更多的定制。

总结

throttled 是一款小巧轻量的限流组件,我们可以使用 throttled 非常轻松地实现单机或集群的 QPS 限流能力。当然,throttled 的限流手段比较单一,当前仅支持基于 QPS 的限流规则,尚未扩展更全面的限流模式和更丰富的阻断规则。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「Go工具箱」一个兼具单机和集群模式的轻量级限流器:throttled
大家好,我是渔夫子。本号新推出「go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。
Go学堂
2023/01/31
4930
influx测试——单条读性能很差,大约400条/s,批量写性能很高,7万条/s,总体说来适合IOT数据批量存,根据tag查和过滤场景,按照时间顺序返回…
需要将InfluxDB的源码放入 go/src/github.com/influxdata 目录
全栈程序员站长
2022/07/20
3990
Go每日一库之6:viper
上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库。
luckpunk
2023/09/13
4350
Go 每日一库之 buntdb
buntdb是一个完全用 Go 语言编写的内存键值数据库。它支持 ACID、并发读、自定义索引和空间信息数据。buntdb只用一个源码文件就实现了这些功能,对于想要学习数据库底层知识的童鞋更是不容错过。
用户7731323
2020/09/08
1.2K0
Go 每日一库之 mergo
今天我们介绍一个合并结构体字段的库mergo。mergo可以在相同的结构体或map之间赋值,可以将结构体的字段赋值到map中,可以将map的值赋值给结构体的字段。感谢@thinkgos推荐。
用户7731323
2020/09/08
1.4K0
Go每日一库之4:go-ini
ini 是 Windows 上常用的配置文件格式。MySQL 的 Windows 版就是使用 ini 格式存储配置的。
luckpunk
2023/09/12
4030
AI+Go 打造你的智能办公助手|果fx
基于 LangChain + Go 的智能文档分析与问答系统,旨在结合 LangChain 的强大语言模型能力和 Go 语言的高效、并发特性,构建一个能够快速、准确地分析文档内容并提供精准问答服务的系统。该系统适用于企业知识库管理、智能客服、学术研究辅助等多种场景。
瘦瘦itazs和fun
2025/04/28
1580
使用 Dify 和 Moonshot API 做一个懒人 AI 阅读工具(二):轻量 RAG 应用
这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。
soulteary
2024/04/26
2.3K0
使用 Dify 和 Moonshot API 做一个懒人 AI 阅读工具(二):轻量 RAG 应用
Go 每日一库之 gorilla/sessions
上一篇文章《Go 每日一库之 securecookie》中,我们介绍了 cookie。同时提到 cookie 有两个缺点,一是数据不宜过大,二是安全问题。session 是服务器端的存储方案,可以存储大量的数据,而且不需要向客户端传输,从而解决了这两个问题。但是 session 需要一个能唯一标识用户的 ID,这个 ID 一般存放在 cookie 中发送到客户端保存,随每次请求一起发送到服务器。cookie 和 session 通常配套使用。
用户7731323
2021/08/20
1.1K0
Go 每日一库之 gorilla/sessions
用redis做一个简单的限流
最近项目中有个需求要实现限制某个用户在2个小时内只能访问3次的效果,所以就简单地用redis实现了一个限流方案。
Johns
2021/08/23
1.4K0
用redis做一个简单的限流
Go 每日一库之 goth
当前很多网站直接采用第三方认证登录,例如支付宝/微信/ Github 等。goth封装了接入第三方认证的方法,并且内置实现了很多第三方认证的实现:
用户7731323
2021/08/20
9860
Go 每日一库之 goth
Go 每日一库之 goquery
goquery是用 Go 语言编写的一个类似于 jQuery 的库。它基于 HTML 解析库net/html和 CSS 库cascadia,提供与 jQuery 相近的接口。Go 著名的爬虫框架colly就是基于 goquery 的。
用户7731323
2020/10/23
7540
Go 每日一库之 goquery
Go每日一库之13:email
程序中时常有发送邮件的需求。有异常情况了需要通知管理员和负责人,用户下单后可能需要通知订单信息,电商平台、中国移动和联通都有每月账单,这些都可以通过邮件来推送。还有我们平时收到的垃圾邮件大都也是通过这种方式发送的😭。那么如何在 Go 语言发送邮件?本文我们介绍一下email库的使用。
luckpunk
2023/09/19
2980
Go语言中的中间件设计与实现
在Go语言中,中间件是一个强大的工具,用于在处理HTTP请求和响应之间插入逻辑层。中间件模式在Web开发中广泛使用,因为它允许我们灵活地添加日志、认证、限流等功能,而不会让核心路由代码变得复杂。
Jimaks
2024/05/04
4060
基于Gin框架的HTTP接口限速实践
在当今的微服务架构和RESTful API主导的时代,HTTP接口在各个业务模块之间扮演着重要的角色。随着业务规模的不断扩大,接口的访问频率和负载也随之增加。为了确保系统的稳定性和性能,接口限速成了一个重要的话题。
闫同学
2023/09/18
1.1K0
Go 每日一库之 dig
今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。
用户7731323
2020/09/08
1.6K0
Go每日一库之148:base64Captcha(多种形式验证码)
Base64captcha 几行代码就可以定义自己内容的图形验证码库,支持任意unicode字符的内容.
luckpunk
2023/10/02
2.8K0
50. RESTful API的简单实现 | 厚土Go学习笔记
RESTfull API是现在很流行的 API 设计风格。众所周知的 HTTP 1.1规范正是基于 REST 架构风格的指导原理来设计的。需要注意的是,REST 是一种风格而不是标准。如果一个架构符合 REST 原则,我们就称它为 RESTful 架构。 先来实现一个最简单的,启动一个 RESTful 服务。代码示例 package main import ( "net/http" "fmt" "html" "log" ) func main() { http.H
李海彬
2018/03/19
7100
50. RESTful API的简单实现 | 厚土Go学习笔记
Go 每日一库之 cli
cli是一个用于构建命令行程序的库。我们之前也介绍过一个用于构建命令行程序的库cobra。在功能上来说两者差不多,cobra的优势是提供了一个脚手架,方便开发。cli非常简洁,所有的初始化操作就是创建一个cli.App结构的对象。通过为对象的字段赋值来添加相应的功能。
用户7731323
2020/09/08
1.6K0
Go每日一库之11:godotenv
twelve-factor应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。
luckpunk
2023/09/16
5590
相关推荐
「Go工具箱」一个兼具单机和集群模式的轻量级限流器:throttled
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验