最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

分布式版

簡介

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

算法

漏桶算法

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

實現(xiàn)

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

// RateLimitConf 速率配置, 允許多長時間通過多少次.
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()
}

注意

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

單機版

簡介

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

算法

令牌桶算法

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

依賴庫

golang.org/x/time/rate

實現(xiàn)

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

// exampleStandAloneLimiterMap 單機接口請求速率配置.
var exampleStandAloneLimiterMap = map[string]*rate.Limiter{
	"/v1/hello": rate.NewLimiter(rate.Every(time.Minute), 2),
}
// StandAloneLimiterMiddle 單機限流中間件.
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()
}

結語

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

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

相關文章

  • 詳解Golang并發(fā)控制的三種方案

    詳解Golang并發(fā)控制的三種方案

    本文主要介紹了詳解Golang并發(fā)控制的三種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Go語言基礎學習教程

    Go語言基礎學習教程

    這篇文章主要介紹了Go語言基礎知識,包括基本語法、語句、數(shù)組等的定義與用法,需要的朋友可以參考下
    2016-07-07
  • 淺析如何利用Go的plugin機制實現(xiàn)熱更新

    淺析如何利用Go的plugin機制實現(xiàn)熱更新

    熱更新,或稱熱重載或動態(tài)更新,是一種軟件更新技術,允許程序在運行時,不停機更新代碼或資源,本文主要來討論下GO語言是否可以利用plugin機制實現(xiàn)熱更新,感興趣的可以了解下
    2024-04-04
  • Golang創(chuàng)建第一個web項目(Gin+Gorm)

    Golang創(chuàng)建第一個web項目(Gin+Gorm)

    本文主要介紹了Golang創(chuàng)建第一個web項目(Gin+Gorm),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • 詳解Golang時間處理的踩坑及解決

    詳解Golang時間處理的踩坑及解決

    在各個語言之中都有時間類型的處理,這篇文章主要和大家分享一下Golang進行時間處理時哪里最容易踩坑以及解決方法,需要的可以參考一下
    2023-01-01
  • golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    這篇文章主要給大家介紹了關于利用golang如何實現(xiàn)抓取IP地址的蜘蛛程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Go web入門Go pongo2模板引擎

    Go web入門Go pongo2模板引擎

    這篇文章主要為大家介紹了Go web編程入門Go pongo2模板引擎使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn)

    Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn)

    這篇文章主要介紹了Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Go語言中的自定義類型你了解嗎

    Go語言中的自定義類型你了解嗎

    自定義類型是 Go 語言中非常重要的概念之一,通過自定義類型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護性。本文將從以下幾個方面介紹 Go 自定義類型的相關知識,感興趣的可以了解一下
    2023-04-04
  • golang中值類型/指針類型的變量區(qū)別總結

    golang中值類型/指針類型的變量區(qū)別總結

    golang的值類型和指針類型receiver一直是大家比較混淆的地方,下面這篇文章主要給大家總結介紹了關于golang中值類型/指針類型的變量區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12

最新評論

鱼台县| 苗栗市| 甘谷县| 东乌| 颍上县| 甘泉县| 成安县| 建宁县| 炉霍县| 内黄县| 蒲城县| 屏东市| 五大连池市| 伽师县| 淮南市| 黑龙江省| 潮安县| 泰安市| 墨江| 鹤山市| 舒城县| 犍为县| 湖南省| 安远县| 武安市| 永清县| 平安县| 乳山市| 东港市| 黎平县| 温州市| 宣汉县| 朝阳县| 临桂县| 西乡县| 榆树市| 襄樊市| 沅江市| 荣昌县| 永登县| 泾源县|