Golang模拟令牌桶进行对访问的限流方式

 更新时间:2021年04月27日 09:43:59   作者:鹿灏楷silves  
这篇文章主要介绍了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 log4go的日志输出优化详解

    golang log4go的日志输出优化详解

    log4go源于google的一项log工程,但官方已经停止维护更新,下面这篇文章主要给大家介绍了关于golang log4go的日志输出优化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    这篇文章主要介绍了使用Go基于WebSocket构建千万级视频直播弹幕系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • golang 连接mongoDB的方法示例

    golang 连接mongoDB的方法示例

    这篇文章主要介绍了golang 连接mongoDB的方法示例,详细的介绍了golang的基础知识和连接mongoDB的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • golang中字符串MD5生成方式总结

    golang中字符串MD5生成方式总结

    在本篇文章里小编给大家整理的是一篇关于golang中字符串MD5生成方式总结内容,有兴趣的朋友们可以跟着学习参考下。
    2021-07-07
  • golang之tcp自动重连实现方法

    golang之tcp自动重连实现方法

    下面小编就为大家带来一篇golang之tcp自动重连实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 在Go语言程序中使用gojson来解析JSON格式文件

    在Go语言程序中使用gojson来解析JSON格式文件

    这篇文章主要介绍了在Go语言程序中使用gojson来解析JSON格式文件的方法,Go是由Google开发的高人气新兴编程语言,需要的朋友可以参考下
    2015-10-10
  • Go语言中的变量声明和赋值

    Go语言中的变量声明和赋值

    这篇文章主要介绍了Go语言中的变量声明和赋值的方法,十分的细致全面,有需要的小伙伴可以参考下。
    2015-04-04
  • golang常用库之配置文件解析库-viper使用详解

    golang常用库之配置文件解析库-viper使用详解

    viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 开发者,这篇文章主要介绍了golang常用库之配置文件解析库-viper使用详解,需要的朋友可以参考下
    2020-10-10
  • Go语言实现Fibonacci数列的方法

    Go语言实现Fibonacci数列的方法

    这篇文章主要介绍了Go语言实现Fibonacci数列的方法,实例分析了使用递归和不使用递归两种技巧,并对算法的效率进行了对比,需要的朋友可以参考下
    2015-02-02
  • 详解用Go语言实现工厂模式(Golang经典编程案例)

    详解用Go语言实现工厂模式(Golang经典编程案例)

    这篇文章主要介绍了详解用Go语言实现工厂模式(Golang经典编程案例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论