package main

import (
"fmt"
"golang.org/x/time/rate"
"time"
) func main() {
r := rate.NewLimiter(1, 5) //1表示每次放进筒内的数量,桶内的令牌数是5,最大令牌数也是5,这个筒子是自动补充的,你只要取了令牌不管你取多少个,这里都会在每次取完后自动加1个进来,因为我们设置的是1 for { if r.AllowN(time.Now(), 2) { //AllowN表示取当前的时间,这里是一次取2个,如果当前不够取两个了,本次就不取,再放一个进去,然后返回false
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
} else {
fmt.Println("too many request")
}
time.Sleep(time.Second)
} }

下图执行结果很明显,执行到第四次的时候too many request了,说明筒子里面令牌被取逛了要等待补充

Allow()就是AllowN(time.now(),1)的简写

package main

import (
"golang.org/x/time/rate"
"net/http"
) var r = rate.NewLimiter(1, 5) //1表示每次放进筒内的数量,桶内的令牌数是5,最大令牌数也是5,这个筒子是自动补充的,你只要取了令牌不管你取多少个,这里都会在每次取完后自动加1个进来,因为我们设置的是1 func MyLimit(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { //这里使用http.HandlerFunc进行类型转换把匿名函数转换成了type http.HandlerFunc,因为HandlerFunc实现了ServeHttp方法所以是http.Handler的实例
if !r.Allow() { //r.Allow()实际上是r.AllowN(time.Now(), 1)的缩写,这里每次拿一个令牌,拿一个存一个,如果有很多个线程来访问,一次把5个拿光了就会走这条,或者请求太快,也会一下子取光
http.Error(writer, "too many requests", http.StatusTooManyRequests)
} else {
next.ServeHTTP(writer, request)
/*处理完了之后,再调用next.ServerHTTP继续完成请求,因为HandlerFunc类型实现的ServeHTTP是这样调用的,也就是调用ServeHTTP方法其实最终还是调用到了我们这里的匿名函数,所以当没有超出频率限制时,仍然需要返回正确的结果给用户,直接调用next也就是mux的ServeHTTP方法,也就是最终调用了绑定路由的方法去返回结果
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
} */
}
})
} func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("OK!!!"))
})
http.ListenAndServe(":8080", MyLimit(mux))
}

14.go内置的rate包学习2(有花操作,必看)的更多相关文章

  1. 13.go内置的rate包学习1

    package main import ( "context" "fmt" "golang.org/x/time/rate" "l ...

  2. JavaScript 标准内置对象Promise使用学习总结

    Javascript标准内置对象Promise使用学习总结   by:授客 QQ:1033553122 1.   基础用法 var condition = true; let p = new Prom ...

  3. 使用Python内置的smtplib包和email包来实现邮件的构造和发送。

    此文章github地址:https://github.com/GhostCNZ/Python_sendEmail Python_sendEmail 使用Python内置的smtplib包和email包 ...

  4. 用内置的库turtle来画一朵花,python3

    题目:用内置的库turtle来画一朵花 看了群主最后成像的图片,应该是循环了36次画方框,每次有10度的偏移. 当然不能提前看答案,自己试着写代码. 之前有用过海龟画图来画过五角星.奥运五环.围棋盘等 ...

  5. python学习笔记:第14天 内置函数补充和递归

    一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...

  6. 几种主流浏览器内置http抓包工具软件使用方法

    对于学习网站的人或者相关编程人员,经常需要用到http抓包工具来跟踪网页,但主流抓包软件如httpwatch.httpanalyzerstdv都是收费的,破解版往往也不稳定.实际上现在很多浏览器都内置 ...

  7. 几种主流浏览器内置http抓包工具软件使用方

    对于学习网站的人或者相关编程人员,经常需要用到http抓包工具来跟踪网页,但主流抓包软件如httpwatch.httpanalyzerstdv都是收费的,破解版往往也不稳定.实际上现在很多浏览器都内置 ...

  8. 巨蟒python全栈开发-第14天 内置函数2 递归 二分查找

    一.今日内容总览 1.内置函数补充 repr() 显示出字符串的官方表示形式 chr() arscii码中的字,转换成位置 ord() arscii码中的位置,转换成字2.递归 自己调用自己 两个口: ...

  9. SolrCloud6.3 单机、集群、内置jetty、tomcat搭建、对collection操作

    参考:https://my.oschina.net/u/1416405/blog/821187 1.Solr 单机 1.1.Solr下载 1.solr官网:http://lucene.apache.o ...

随机推荐

  1. 个人GitHub资源分享仓库

    个人GitHub资源分享仓库   门牌号:https://github.com/ZeroPhong/Learning-Resource 2019年10月27日 注册GitHub账号,仓库建立: 当天上 ...

  2. 【简解】C2CRNI - Crni

    [题目大意] 给定一个N行N列的矩阵,每个格子要么为白色要么为黑色.黑矩形为所涵单元格数大于等于2且所涵单元格均为黑色的矩表.要解决的问题是在给定的矩形中找出两个没有共公部分的黑矩形,输出所有方案数, ...

  3. java之spring之对象的创建

    首先提供目录结构如下: 下面提供各文件代码,以供参考: UserDynamicFactory.java package cn.sxt.factory; import cn.sxt.vo.User; / ...

  4. NEST dynamic 和 alias

    /// <summary> /// Dynamic = false无法搜索 /// </summary> public void Dynamicmapping() { var ...

  5. 基于windows平台搭建elasticsearch 补充

    https://www.cnblogs.com/skychen1218/p/8108860.html 参考此大神写的内容,感谢感谢. 不过 好像漏掉了一块内容. 导致出现问题 连接不上的问题.后来修改 ...

  6. 百度地图 libBaiduMapSDK_base_v4_2_1.so" is 32-bit instead of 64-bit错误

    20191111 集成android sdk,华为手机基本都启动报错,如下: W/System.err: java.security.NoSuchProviderException: no such ...

  7. 【开发笔记】- Java写入、读取文本

    文本写入 public static void createFile(String input) throws IOException { //设置文件路径 String filePath = &qu ...

  8. 自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave

    自旋锁和互斥锁的区别是,自旋锁不会引起睡眠,所以可用于不能休眠的代码中(如IRQ) 自旋锁保持期间抢占失效,而信号量保持期间可以被抢占 定义 spinlock_t lock; init #define ...

  9. 在Spring中使用AspectJ实现AOP

    在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1. ...

  10. Hybris产品主数据的价格折扣维护

    登录Hybris backoffice的产品管理界面,进入price标签页,点击Create new Discount Row按钮: 在Discount下拉地段里选择10%的折扣,这个产品原来的单价是 ...