Golang模擬令牌桶進(jìn)行對(duì)訪問的限流方式
利用channel進(jìn)行模擬令牌桶對(duì)訪問進(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)文章
Go語(yǔ)言轉(zhuǎn)化php數(shù)組的示例代碼
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何實(shí)現(xiàn)轉(zhuǎn)化php數(shù)組的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)GO語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11
golang 內(nèi)存對(duì)齊的實(shí)現(xiàn)
在代碼編譯階段,編譯器會(huì)對(duì)數(shù)據(jù)的存儲(chǔ)布局進(jìn)行對(duì)齊優(yōu)化,本文主要介紹了golang 內(nèi)存對(duì)齊的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
golang接口IP限流,IP黑名單,IP白名單的實(shí)例
這篇文章主要介紹了golang接口IP限流,IP黑名單,IP白名單的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
golang gorm 計(jì)算字段和獲取sum()值的實(shí)現(xiàn)
這篇文章主要介紹了golang gorm 計(jì)算字段和獲取sum()值的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
GO中高效的將int轉(zhuǎn)換為string的方法與源碼
本文將從逐步介紹幾種在?Go?中將?int?轉(zhuǎn)換為?string?的常見方法,并重點(diǎn)剖析這幾種方法在性能上的特點(diǎn),另外,還會(huì)重點(diǎn)介紹?FormatInt?高效的算法實(shí)現(xiàn),需要的朋友可以參考下2024-01-01
深入理解Go語(yǔ)言實(shí)現(xiàn)多態(tài)?
本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)多態(tài),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

