欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

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

需求背景

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

web demo搭建

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

在啟動web服務(wù)器后,我們使用curl進行測試

命令:

curl 127.0.0.1:8083/queryAll

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

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

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

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

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

其定義如下

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

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

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

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

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

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

超過最大允許訪問數(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次",time.Now(),interval,visitHashMap[ip].number)))
			return
		}
		info.Write([]byte(fmt.Sprintf("%s 收到queryAll請求,開始查詢,返回1W字節(jié)數(shù)據(jù)信息...,統(tǒng)計信息: 在%d分鐘內(nèi),訪問達到%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次后,就被限制訪問了,而從第一次訪問時間到目前訪問時間間隔達到1分鐘以上后,限制就被解除了,可見功能已經(jīng)完成了。

總結(jié)

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

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

相關(guān)文章

  • golang復(fù)制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    golang復(fù)制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    這篇文章主要為大家介紹了golang復(fù)制文件夾并移動到另一個文件夾實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • golang如何修改json文件內(nèi)容的方法示例

    golang如何修改json文件內(nèi)容的方法示例

    這篇文章主要介紹了golang如何修改json文件內(nèi)容的方法示例,使用一個例子說明golang如何訪問和修改json文件,有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 詳解如何在golang鏡像中設(shè)置指定時區(qū)

    詳解如何在golang鏡像中設(shè)置指定時區(qū)

    這篇文章主要為大家詳細(xì)介紹了如何在golang鏡像中設(shè)置指定時區(qū),文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2023-04-04
  • golang并發(fā)之使用sync.Pool優(yōu)化性能

    golang并發(fā)之使用sync.Pool優(yōu)化性能

    在Go提供如何實現(xiàn)對象的緩存池功能,常用一種實現(xiàn)方式是sync.Pool,?其旨在緩存已分配但未使用的項目以供以后重用,從而減輕垃圾收集器(GC)的壓力,下面我們就來看看具體操作吧
    2023-10-10
  • 讓GPT教你用go語言和C語言開發(fā)IDE配置學(xué)習(xí)

    讓GPT教你用go語言和C語言開發(fā)IDE配置學(xué)習(xí)

    這篇文章主要介紹了讓GPT教你用go語言和C語言開發(fā)IDE配置學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    提升Go語言開發(fā)效率的小技巧實例(GO語言語法糖)匯總

    這篇文章主要介紹了提升Go語言開發(fā)效率的小技巧匯總,也就是Go語言的語法糖,掌握好這些可以提高我們的開發(fā)效率,需要的朋友可以參考下
    2022-11-11
  • go程序測試CPU占用率統(tǒng)計ps?vs?top兩種不同方式對比

    go程序測試CPU占用率統(tǒng)計ps?vs?top兩種不同方式對比

    這篇文章主要為大家介紹了go程序測試CPU占用率統(tǒng)計ps?vs?top兩種不同方式對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang中sync.Mutex的源碼分析

    Golang中sync.Mutex的源碼分析

    這篇文章將帶大家從源碼分析一下Golang中sync.Mutex的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Golang有一定的幫助,需要的可以參考一下
    2023-03-03
  • Go語言學(xué)習(xí)技巧之命名規(guī)范

    Go語言學(xué)習(xí)技巧之命名規(guī)范

    最近在學(xué)習(xí)go語言,發(fā)現(xiàn)了不少需要整理的知識點,所以整理下分享出來,下面這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)技巧之命名規(guī)范的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Golang?中的?strconv?包常用函數(shù)及用法詳解

    Golang?中的?strconv?包常用函數(shù)及用法詳解

    strconv是Golang中一個非常常用的包,主要用于字符串和基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換,這篇文章主要介紹了Golang中的strconv包,需要的朋友可以參考下
    2023-06-06

最新評論