亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言框架快速集成限流中間件詳解

 更新時(shí)間:2022年09月07日 09:29:41   作者:Masters  
這篇文章主要為大家介紹了Go語言框架快速集成限流中間件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

在我們的日常開發(fā)中, 常用的中間件有很多, 今天來講一下怎么集成限流中間件, 它可以很好地用限制并發(fā)訪問數(shù)來保護(hù)系統(tǒng)服務(wù), 避免系統(tǒng)服務(wù)崩潰, 資源占用過大甚至服務(wù)器崩潰進(jìn)而影響到其他應(yīng)用!

分布式版

簡介

通常我們的服務(wù)會同時(shí)存在多個(gè)進(jìn)程, 也就是負(fù)載來保證服務(wù)的性能和穩(wěn)定性, 那么就需要走一個(gè)統(tǒng)一的限流, 這個(gè)時(shí)候就需要借助我們的老朋友-redis, 來進(jìn)行分布式限流;

算法

漏桶算法

即一個(gè)水桶, 進(jìn)水(接受請求)的速率不限, 出水(處理請求)的速率是一定的, 如果出水的速率小于進(jìn)水的速率, 就會造成水桶溢出(也就是拒絕請求); 主要是從出口限制, 以固定的速率控制訪問速度, 缺點(diǎn)是難以應(yīng)對突發(fā)請求;

實(shí)現(xiàn)

下面是一個(gè)簡單的實(shí)現(xiàn), 對 /v1/hello接口進(jìn)行每分鐘2次的速率限制

// RateLimitConf 速率配置, 允許多長時(shí)間通過多少次.
type RateLimitConf struct {
	Limit int64
	Timer time.Duration
}
// exampleLimiterMap 接口請求速率配置, 建議放入redis/數(shù)據(jù)庫同步本地緩存.
var exampleLimiterMap = map[string]RateLimitConf{
	"/v1/hello": {Limit: 2, Timer: time.Minute},
}
// LimiterMiddle 分布式限流中間件.
func LimiterMiddle(ctx iris.Context) {
	var (
		uri    = ctx.Request().RequestURI
		client = redis.NewClusterClient()
		key    = uri
	)
	conf, ok := exampleLimiterMap[uri]
	if ok {
		limiter := redis_rate.NewLimiter(client)
		if _, _, b := limiter.Allow(key, conf.Limit, conf.Timer); !b {
			r, _ := httpcode.NewRequest(ctx, nil)
			r.Code(httpcode.TooManyReq, fmt.Errorf("req rate limit"), nil)
			return
		}
	}
	ctx.Next()
}

注意

  • 接口速率配置如果需要進(jìn)行實(shí)時(shí)配置, 則建議將配置寫入數(shù)據(jù)庫, 然后刷新到本地緩存/存到redis;
  • 如果需要對設(shè)備/ip/用戶進(jìn)行接口限制訪問, 則將 key加上唯一標(biāo)志即可;

單機(jī)版

簡介

這個(gè)就只適用于單個(gè)服務(wù)進(jìn)程的限流, 比如個(gè)人搭的一些小網(wǎng)站之類的;

算法

令牌桶算法

即也是一個(gè)桶, 按照設(shè)定的速率往桶里放令牌, 10s二十次即1s放兩個(gè)令牌(允許處理兩次請求), 然后請求來之后必須從桶里取出來令牌才可以進(jìn)行處理, 沒有令牌則選擇拒絕或等待; 主要是從入口限制, 允許一定量的突發(fā)請求(即桶內(nèi)所有的令牌);

依賴庫

golang.org/x/time/rate

實(shí)現(xiàn)

下面是一個(gè)簡單的實(shí)現(xiàn), 對 /v1/hello接口進(jìn)行每分鐘2次的速率限制

// exampleStandAloneLimiterMap 單機(jī)接口請求速率配置.
var exampleStandAloneLimiterMap = map[string]*rate.Limiter{
	"/v1/hello": rate.NewLimiter(rate.Every(time.Minute), 2),
}
// StandAloneLimiterMiddle 單機(jī)限流中間件.
func StandAloneLimiterMiddle(ctx iris.Context) {
	var (
		uri = ctx.Request().RequestURI
	)
	limiter, ok := exampleStandAloneLimiterMap[uri]
	if ok {
		if b := limiter.Allow(); !b {
			r, _ := httpcode.NewRequest(ctx, nil)
			r.Code(httpcode.TooManyReq, fmt.Errorf("req rate limit"), nil)
			return
		}
	}
	ctx.Next()
}

結(jié)語

上面的代碼均摘自我開發(fā)的一個(gè)開源項(xiàng)目中, 主要是一個(gè)Go的標(biāo)準(zhǔn)項(xiàng)目布局, 封裝了一些常用的組件, 有興趣的朋友可以了解一下, 新手極易上手;

以上就是Go語言框架快速集成限流中間件詳解的詳細(xì)內(nèi)容,更多關(guān)于Go框架集成限流中間件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GoLang編程必備:GoFrame?GoLand插件介紹

    GoLang編程必備:GoFrame?GoLand插件介紹

    掌握GoLang編程必備工具,我們來深入了解GoFrame?GoLand插件,這個(gè)小巧但強(qiáng)大的插件將極大提升你的開發(fā)效率,讓代碼流暢如行云流水,一起跟隨本指南,解鎖更智能的編程之旅!
    2023-12-12
  • go實(shí)現(xiàn)圖片拼接與文字書寫的方法實(shí)例

    go實(shí)現(xiàn)圖片拼接與文字書寫的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于go實(shí)現(xiàn)圖片拼接與文字書寫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 使用go語言將單反斜杠改為雙反斜杠的方法

    使用go語言將單反斜杠改為雙反斜杠的方法

    最近開發(fā)的時(shí)候遇到這么個(gè)問題,就是在window上獲取了文件目錄的字段,然后將這個(gè)絕對路徑保存到數(shù)據(jù)庫,但是前端展示的時(shí)候路徑的雙反斜杠變成了單反斜杠,本文給大家介紹了使用go語言將單反斜杠改為雙反斜杠的方法,需要的朋友可以參考下
    2024-01-01
  • golang 如何刪除二進(jìn)制文件中的源碼路徑信息

    golang 如何刪除二進(jìn)制文件中的源碼路徑信息

    這篇文章主要介紹了golang 如何刪除二進(jìn)制文件中的源碼路徑信息,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言panic和recover的用法實(shí)例

    Go語言panic和recover的用法實(shí)例

    panic()和recover()是Go語言中用于處理錯(cuò)誤的兩個(gè)重要函數(shù),本文主要介紹了Go語言panic和recover的用法實(shí)例,panic()用于中止程序并引發(fā)panic,而recover()用于捕獲panic并恢復(fù)程序的執(zhí)行,感興趣的可以了解一下
    2024-01-01
  • Go1.21新增cmp包的用法詳解

    Go1.21新增cmp包的用法詳解

    Go?1.21新增的?cmp?包提供了與比較有序值相關(guān)的類型和函數(shù),前幾篇文章講解的?slices?包中的函數(shù)有大量使用到?cmp?包中的函數(shù)和類型,下面我們就來看看cmp包的相關(guān)函數(shù)用法吧
    2023-08-08
  • 從零封裝Gin框架及項(xiàng)目初始化教程

    從零封裝Gin框架及項(xiàng)目初始化教程

    這篇文章主要為大家介紹了從零封裝Gin框架及項(xiàng)目的初始化教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang協(xié)程池設(shè)計(jì)詳解

    golang協(xié)程池設(shè)計(jì)詳解

    這篇文章主要介紹了golang協(xié)程池設(shè)計(jì)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Golang實(shí)現(xiàn)微信公眾號后臺接入的示例代碼

    Golang實(shí)現(xiàn)微信公眾號后臺接入的示例代碼

    這篇文章主要介紹了Golang實(shí)現(xiàn)微信公眾號后臺接入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 源碼解析gtoken替換jwt實(shí)現(xiàn)sso登錄

    源碼解析gtoken替換jwt實(shí)現(xiàn)sso登錄

    這篇文章主要為大家介紹了源碼解析gtoken替換jwt實(shí)現(xiàn)sso登錄的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評論