首页 > 其他分享 >Go每日一库之162:throttled(轻量级限流工具)

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

时间:2023-10-01 09:03:51浏览次数:39  
标签:http err throttled 限流 store com 轻量级

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

简介

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

使用举例

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

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 的限流规则,尚未扩展更全面的限流模式和更丰富的阻断规则。

参考资料

标签:http,err,throttled,限流,store,com,轻量级
From: https://www.cnblogs.com/arena/p/17738578.html

相关文章

  • Go每日一库之182:RuleGo(轻量级高性能嵌入式规则引擎)
    ◆ 一、开源项目简介RuleGo是一个基于Go语言的轻量级、高性能、嵌入式的规则引擎。也一个灵活配置和高度定制化的事件处理框架。可以对输入消息进行过滤、转换、丰富和执行各种动作。◆ 二、开源协议使用Apache-2.0开源协议◆ 三、界面展示规则链规则链是规则节点及其关......
  • Go每日一库之140:Zinc(轻量级搜索引擎)
    ‍项目介绍Zinc是一个轻量级替代Elasticsearch的开源搜索引擎。Elasticsearch真的好用,但是Elasticsearch安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个Elasticsearch的不足就是服务运行起来需要的计算资源较多,对于普通的用户来说是有点浪费的。Zinc,拥有......
  • 轻量级人脸检测:libfacedetection和DBFace
    libfacedetection是基于SSD进行魔改,而DBFace是基于MobileNetV3进行改进。一、libfacedetection二、DBFace三、libfacedetection网络结构图一、libfacedetection链接:https://github.com/ShiqiYu/libfacedetection训练代码:https://github.com/ShiqiYu/libfacede......
  • 使用Guava实现单体应用限流
    一、概述服务器流量控制一直都是一个非常重要的问题。因为服务器是有性能瓶颈的,所以后台的接口也有其性能瓶颈,当辛辛苦苦的把多级缓存做好后,觉得可以承受高并发了的时候,服务突然就蹦了,可能是缓存爆掉了,也可能是数据库宕机了。造成这些问题的大多数原因就是流量太高了的问题。......
  • 界面组件DevExpress WPF v23.2新功能预览 - 更轻量级的主题
    本文主要描述了DevExpressWPF即将在几个月之后发布的v23.2中包含的新功能,持续关注我们获取更多最新资讯哦~P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程......
  • .net webapi限流记录
     一,WebApiThrottleASP.NETWebAPIratelimiterforIISandOwinhostinghttps://github.com/stefanprodan/WebApiThrottle 二,AspNetCoreRateLimitASP.NETCoreratelimitingmiddlewarehttps://github.com/stefanprodan/AspNetCoreRateLimit......
  • Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
    我们在做Android平台轻量级RTSP服务和内网RTSP网关的时候,遇到过这样的问题,如何同时发布多路RTSP流出去?回答这个问题,实际上不难,大牛直播SDK在设计这个模块的时候,考虑到了一个Service带多路流的情况,以下是大概的技术实现:启动RTSP服务:启动RTSP服务的时候,你可以注意到OpenRtspServer()......
  • Android端如何实现拉取RTSP/RTMP流并回调YUV/RGB数据然后注入轻量级RTSP服务?
    技术背景我们在对接开发Android平台音视频模块的时候,遇到过这样的问题,厂商希望拉取到海康、大华等摄像机的RTSP流,然后解码后的YUV或RGB数据回给他们,他们做视频分析或处理后,再投递给轻量级RTSP服务模块或RTMP推送模块,实现处理后的数据,二次转发,本文以拉取RTSP流,解析后再注入轻量级RTS......
  • 对某个接口进行限流 以 Aop 注解的形式绑定接口 用redis实现
    简单的针对某个接口进行限流,如果需要整体限流的话还是建议在网关上面或者服务器上面动手Controller:@LimitRequest(count=1,time=60*1000*2)@PostMapping("limit")publicStringgetLimitResult(){return"ok";}Annotation:@Retention(R......
  • Go语言实现接口IP限流,黑名单&白名单的实例,都可用!
    Go语言实现接口IP限流,黑名单&白名单的实例,都可用!原创 学习与分享 Go语言圈 2023-07-1808:30 发表于广东收录于合集#学Go语言哪些事儿221个MySQL大牛带你全面剖析与系统梳理数据库(mysql等)知识分享,总结数据库技巧和方法,提升你的技术技能。45篇原创内容......