Golang模擬令牌桶進行對訪問的限流方式

利用channel進行模擬令牌桶對訪問進行限流

func FW(max int,duration time.Duration){
//定義一個channel ,進行初始化
	contain := make(chan bool , max)
	for i := 0 ; i < max ; i ++{
		contain <- true//寫入channel
	}
	go func() {//開啟一個線程
		for {
			contain <- true
			time.Sleep(duration)
		}
	}()
	for <- contain {//如果上一個線程寫入一個true,就會運行這個代碼塊
		fmt.Println("helllo world")
	}
}

補充:golang簡易令牌桶算法實現

基本思路:

定義一個chan,chan大小為需要限制的qps大小,go一個協程啟動tick,每1000/qps時間在tick中寫入數值,啟動另一個協程,讀取chan中的值,如果讀取到chan中有值,則向下層接口發送請求。

代碼如下:

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 {
        //收客戶請求,發送http請求給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)
    }
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: