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

go實(shí)現(xiàn)限流功能示例

 更新時(shí)間:2022年08月16日 14:11:14   作者:pdudo  
這篇文章主要為大家介紹了go實(shí)現(xiàn)限流功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在我們?nèi)粘>S護(hù)中,經(jīng)常有爬蟲進(jìn)行爬取網(wǎng)頁,少則1秒鐘請求數(shù)十次,多則達(dá)百次,嚴(yán)重消耗了服務(wù)器帶寬,且影響正常使用者,好在nginx可以配合lua可以完成類似的需求,本次我們將使用go來完成本需求。

需求背景

在我們?nèi)粘>S護(hù)中,可能需要這樣一種工具,來對(duì)某些路由,對(duì)特定IP或者用戶ID,在特定時(shí)間內(nèi),限制最大訪問次數(shù),這樣有效的避免服務(wù)器帶寬資源的浪費(fèi)的同時(shí)也能接入更多用戶請求,本次使用go來做一個(gè)類似的。

web demo搭建

我們先來使用SampleHttp編寫一個(gè)最簡單的web服務(wù)器,定義路由queryAll,收到后,假設(shè)將返回客戶端1w字節(jié)的數(shù)據(jù)信息。

在啟動(dòng)web服務(wù)器后,我們使用curl進(jìn)行測試

命令:

curl 127.0.0.1:8083/queryAll

限制訪問次數(shù)編寫

在上述整體需求的情況下,我們需要編寫在規(guī)定時(shí)間限制訪問次數(shù)的需求,這里我們?yōu)榱朔奖?,使?code>ip來作為限制條件,其核心功能分類大致分為:

  • 從未訪問過web服務(wù)器
  • 訪問過web服務(wù)器,在規(guī)定時(shí)間內(nèi)沒有超出限制
  • 訪問過web服務(wù)器,在在規(guī)定時(shí)間內(nèi)超出了限制
  • 訪問過web服務(wù)器,時(shí)間間隔超過了規(guī)定時(shí)間

如上分類,除了第三種需要限流外,其他則視為正常訪問即可。

核心存儲(chǔ),我們可以選擇go map,其中keyip,value為結(jié)構(gòu)體,該結(jié)構(gòu)體包含訪問次數(shù)創(chuàng)建間戳。

其定義如下

我們來根據(jù)如上定義的核心功能來編寫程序

從未訪問過服務(wù)器

我們根據(jù)map中是否存在這個(gè)key來判斷,如

_, ok := visitHashMap[ip]; if !ok {
    // 如果沒有該ip的訪問次數(shù),則新增記錄
}

訪問過服務(wù)器,在規(guī)定時(shí)間超過了限制

if time.Now().Unix()-visit.createUnixTime >= interval*60 {
    // 在規(guī)定時(shí)間超過了限制,需要重新計(jì)算閾值
}

超過最大允許訪問數(shù)

if visitHashMap[ip].number >= maxNum {
    // 超過允許最大訪問次數(shù)
}

整理為其核心函數(shù)如下

功能測試

我們在定義路由地方,將來訪者IP傳入,就可以根據(jù)其返回的bool值來判斷是否需要限制訪問了。

main函數(shù)定義如下:

func main() {
	SampleHttp.Route("get","/queryAll", func(info *SampleHttp.HttpInfo) {
		ip := strings.Split(info.RemoteIP,":")[0]
		if ! limits(ip) {
			info.Write([]byte(fmt.Sprintf("%s 已經(jīng)被限制訪問,在%d分鐘內(nèi),訪問達(dá)到%d次",time.Now(),interval,visitHashMap[ip].number)))
			return
		}
		info.Write([]byte(fmt.Sprintf("%s 收到queryAll請求,開始查詢,返回1W字節(jié)數(shù)據(jù)信息...,統(tǒng)計(jì)信息: 在%d分鐘內(nèi),訪問達(dá)到%d次",time.Now(),interval,visitHashMap[ip].number)))
	})
	visitHashMap = make(map[string]visitInfo,0)
	SampleHttp.StartServer("0.0.0.0:8083")
}

我們將開啟服務(wù)器來測試一下

通過上述執(zhí)行結(jié)果圖,可以看到,當(dāng)1分鐘內(nèi)訪問次數(shù)超過10次后,就被限制訪問了,而從第一次訪問時(shí)間到目前訪問時(shí)間間隔達(dá)到1分鐘以上后,限制就被解除了,可見功能已經(jīng)完成了。

總結(jié)

如上只是實(shí)現(xiàn)了這種方法而已,在實(shí)際項(xiàng)目中,還需要詳細(xì)的打磨才行,不然執(zhí)行效率肯定堪憂,怎么樣,限制這個(gè)看著好玩吧,快來試試吧,相關(guān)代碼已經(jīng)放置到了gitee上。

以上就是go實(shí)現(xiàn)限流功能示例的詳細(xì)內(nèi)容,更多關(guān)于go限流功能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言實(shí)現(xiàn)lru淘汰策略和超時(shí)過期

    Go語言實(shí)現(xiàn)lru淘汰策略和超時(shí)過期

    緩存的大小是有限的,當(dāng)添加數(shù)據(jù)發(fā)現(xiàn)剩余緩存不夠時(shí),需要淘汰緩存中的部分?jǐn)?shù)據(jù),本文主要介紹了Go語言實(shí)現(xiàn)lru淘汰策略和超時(shí)過期,感興趣的可以了解一下
    2024-02-02
  • Go 驗(yàn)證字符串中是否包含中文(推薦)

    Go 驗(yàn)證字符串中是否包含中文(推薦)

    這篇文章主要介紹了Go 驗(yàn)證字符串中是否包含中文,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳解Golang?Map中的key為什么是無序的

    詳解Golang?Map中的key為什么是無序的

    本文主要介紹了Golang?Map中的key為什么是無序的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 一文詳解Golang中的匿名變量

    一文詳解Golang中的匿名變量

    匿名變量是一種特殊類型的變量,可以簡化代碼并提高可讀性,本文將為大家詳細(xì)介紹一下golang中匿名變量的定義、特性和使用方法,需要的可以參考下
    2023-09-09
  • 如何使用?Go?和?Excelize?構(gòu)建電子表格

    如何使用?Go?和?Excelize?構(gòu)建電子表格

    這篇文章主要介紹了如何使用Go和Excelize構(gòu)建電子表格,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解

    Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解

    這篇文章主要為大家介紹了Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • omitempty在go中的使用方式

    omitempty在go中的使用方式

    在Go語言編程中,`omitempty`標(biāo)記用于JSON編解碼過程中控制字段是否被包含,當(dāng)結(jié)構(gòu)體字段標(biāo)記為`omitempty`且字段值為空時(shí),該字段不會(huì)出現(xiàn)在生成的JSON中,有助于優(yōu)化JSON結(jié)構(gòu)和減小數(shù)據(jù)體積,通過具體示例解釋了`omitempty`的工作機(jī)制和實(shí)際效果
    2024-09-09
  • Golang實(shí)現(xiàn)IP地址轉(zhuǎn)整數(shù)的方法詳解

    Golang實(shí)現(xiàn)IP地址轉(zhuǎn)整數(shù)的方法詳解

    在 Go 語言中,將 IP 地址轉(zhuǎn)換為整數(shù)涉及到解析 IP 地址并處理其字節(jié)表示,本文給大家介紹了Golang實(shí)現(xiàn)IP地址轉(zhuǎn)整數(shù)的方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-02-02
  • Go中的nil切片和空切片區(qū)別詳解

    Go中的nil切片和空切片區(qū)別詳解

    這篇文章主要介紹了Go中的nil切片和空切片區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go實(shí)現(xiàn)比較時(shí)間大小

    Go實(shí)現(xiàn)比較時(shí)間大小

    這篇文章主要介紹了Go實(shí)現(xiàn)比較時(shí)間大小的方法和示例,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-04-04

最新評(píng)論

乌拉特中旗| 永胜县| 凤城市| 扶风县| 慈溪市| 岗巴县| 迁西县| 界首市| 红安县| 阳原县| 彭泽县| 郓城县| 洛川县| 唐海县| 晋城| 克什克腾旗| 南皮县| 南雄市| 泾川县| 大田县| 铜山县| 津南区| 平塘县| 新蔡县| 延吉市| 高雄县| 会东县| 绥中县| 靖州| 布尔津县| 常山县| 陕西省| 巢湖市| 彝良县| 沈阳市| 祥云县| 靖安县| 密云县| 开远市| 银川市| 宁都县|