Golang模擬令牌桶進(jìn)行對(duì)訪問(wèn)的限流方式
利用channel進(jìn)行模擬令牌桶對(duì)訪問(wèn)進(jìn)行限流
func FW(max int,duration time.Duration){ //定義一個(gè)channel ,進(jìn)行初始化 contain := make(chan bool , max) for i := 0 ; i < max ; i ++{ contain <- true//寫入channel } go func() {//開啟一個(gè)線程 for { contain <- true time.Sleep(duration) } }() for <- contain {//如果上一個(gè)線程寫入一個(gè)true,就會(huì)運(yùn)行這個(gè)代碼塊 fmt.Println("helllo world") } }
補(bǔ)充:golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)
基本思路:
定義一個(gè)chan,chan大小為需要限制的qps大小,go一個(gè)協(xié)程啟動(dòng)tick,每1000/qps時(shí)間在tick中寫入數(shù)值,啟動(dòng)另一個(gè)協(xié)程,讀取chan中的值,如果讀取到chan中有值,則向下層接口發(fā)送請(qǐng)求。
代碼如下:
package main import ( "fmt" "time" "httpclient" ) var LEN int = 10 func tickStoreCh(arrlen int, ch chan int) { len := 1000/arrlen fmt.Println(len) tickTime := time.NewTicker(time.Duration(len)*time.Millisecond) var i int for { fmt.Println(len) i++ <-tickTime.C ch<- i } } func OrganReq(org string, qps int) { ch := make(chan int, qps) go tickStoreCh(qps, ch) time.Sleep(1000*time.Millisecond) for { //收客戶請(qǐng)求,發(fā)送http請(qǐng)求給RE client := httpclient.NewHttpClient(time.Duration(1000)*time.Millisecond, time.Duration(2000)*time.Millisecond) header := make(map[string]string) header["Content-Type"] = "application/json;charset=utf-8" code, err := client.ResponseCode("http://127.0.0.1:19988", header, "llltest") value := <- ch fmt.Println(code, value, err, "lenchan:", len(ch)) //time.Sleep(time.Second) } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Golang 類型轉(zhuǎn)換的實(shí)現(xiàn)(斷言、強(qiáng)制、顯式類型)
將一個(gè)值從一種類型轉(zhuǎn)換到另一種類型,便發(fā)生了類型轉(zhuǎn)換,在go可以分為斷言、強(qiáng)制、顯式類型轉(zhuǎn)換,本文就詳細(xì)的介紹一下這就幾種轉(zhuǎn)換方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Golang實(shí)現(xiàn)CronJob(定時(shí)任務(wù))的方法詳解
這篇文章主要為大家詳細(xì)介紹了Golang如何通過(guò)一個(gè)單 pod 去實(shí)現(xiàn)一個(gè)常駐服務(wù),去跑定時(shí)任務(wù)(CronJob),文中的示例代碼講解詳細(xì),需要的可以參考下2023-04-04Go使用database/sql操作數(shù)據(jù)庫(kù)的教程指南
Go?語(yǔ)言中,有一個(gè)名為database/sql的標(biāo)準(zhǔn)庫(kù),提供了統(tǒng)一的編程接口,使開發(fā)人員能夠以一種通用的方式與各種關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互,本文就來(lái)和大家講講它的具體操作吧2023-06-06Go語(yǔ)言題解LeetCode561數(shù)組拆分
這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode561數(shù)組拆分示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解
這篇文章主要為大家介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Golang實(shí)現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享
這篇文章主要介紹了Golang實(shí)現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享,本文先是講解了實(shí)現(xiàn)邏輯,然后給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-10-10