我是靠谱客的博主 漂亮香菇,最近开发中收集的这篇文章主要介绍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)
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持靠谱客。如有错误或未考虑完全的地方,望不吝赐教。

最后

以上就是漂亮香菇为你收集整理的Golang模拟令牌桶进行对访问的限流方式的全部内容,希望文章能够帮你解决Golang模拟令牌桶进行对访问的限流方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(103)

评论列表共有 0 条评论

立即
投稿
返回
顶部