当前位置: 首页 > news >正文

江苏体育建设场地网站江苏赛华建设监理有限公司网站

江苏体育建设场地网站,江苏赛华建设监理有限公司网站,旅游网站策划书,wordpress媒体库 下载一.什么是限流 限流又称为流量控制#xff08;流控#xff09;#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景#xff0c;比如#xff1a;某景区限制每日进入景区的游客数量为8万人#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…一.什么是限流 限流又称为流量控制流控通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景比如某景区限制每日进入景区的游客数量为8万人沙河地铁站早高峰通过站外排队逐一放行的方式限制同一时间进入车站的旅客数量等。 限流虽然会影响部分用户的使用体验但是却能在一定程度上报障系统的稳定性不至于崩溃大家都没了用户体验。 而互联网上类似需要限流的业务场景也有很多比如电商系统的秒杀、微博上突发热点新闻、双十一购物节、12306抢票等等。这些场景下的用户请求量通常会激增远远超过平时正常的请求量此时如果不加任何限制很容易就会将后端服务打垮影响服务的稳定性。 此外一些厂商公开的API服务通常也会限制用户的请求次数比如百度地图开放平台等会根据用户的付费情况来限制用户的请求数等。 二.常见的限流算法 2.1 漏桶算法 2.1.1 漏桶算法的原理 漏桶法的原理比较简单假设我们有一个水桶按固定的速率向下方滴落一滴水无论有多少请求请求的速率有多大都按照固定的速率流出对应到系统中就是按照固定的速率处理请求。原理图如下 漏桶法的关键点在于漏桶始终按照固定的速率运行但是它并不能很好的处理有大量突发请求的场景毕竟在某些场景下我们可能需要提高系统的处理效率而不是一味的按照固定速率处理请求。 关于漏桶算法,在开发中我们可以使用三方的开源框架uber团队有一个开源的github.com/uber-go/ratelimit库下面网站是由漏桶算法集成以下如何简单的在gin中集成一个由漏桶算法实现的限流中间(这里我用的是我尝试自己编写的一个漏桶算法代码大家可以选择自己写也可以选择使用上面的开源框架) //开源框架版 package mainimport (timegithub.com/gin-gonic/gingo.uber.org/ratelimit )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func LimitHandler() gin.HandlerFunc {return func(c *gin.Context) {r : ratelimit.New(1) //每秒1个请求//每次滴水允许通过的请求数量// 限流if r.Take().Sub(time.Now()) 0 {c.JSON(200, gin.H{code: 429,message: Server busy,})c.Abort()}} }func main() {r : gin.Default()r.Use(LimitHandler()){r.GET(/ping, pong)}r.Run(:8080) }//自己实现版//main.go package mainimport (awesomeProject1/limittimegithub.com/gin-gonic/gingo.uber.org/ratelimit )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func main() {r : gin.Default()r.Use(limit.LimitMiddleware()){}r.Run(:8080) }//limit.go package limitimport (synctimegithub.com/gin-gonic/gin )type Bucket struct {sync.MutexlastAccess time.Timerequests int64 // 当前已经接收请求次数MaxRequests int64 // 最大可接受请求次数interval time.Duration // 时间间隔 }func NewBucket(maxRequests int64, interval time.Duration) *Bucket {return Bucket{lastAccess: time.Now(),requests: 0,MaxRequests: maxRequests,interval: interval,} }func (b *Bucket) Allow() bool {b.Lock() //加锁defer b.Unlock()now : time.Now()if now.Sub(b.lastAccess) b.interval {b.requests 0b.lastAccess now}if b.requests b.MaxRequests {b.requestsreturn true}return false }func LimitMiddleware() gin.HandlerFunc {bucket : NewBucket(1, 10*time.Second)return func(c *gin.Context) {if !bucket.Allow() {c.JSON(200, gin.H{code: 429,message: Server busy,})c.Abort()}c.Next()} }2.2 令牌桶算法 2.2 令牌桶算法的原理 令牌桶其实和漏桶的原理类似令牌桶会按固定的速率往桶里放入令牌并且只要能从桶里取出令牌就能通过令牌桶支持突发流量的快速处理。原理图如下 当我们在令牌桶里面取不到令牌时我们就会选择拒绝该次请求。 2.2.2 基于令牌桶实现的限流中间件 和上面的漏桶限流一样这里有关令牌桶的限流博主还是给出两个版本一个是开源第三方库同时博主也会写一个自己实现的限流中间件供大家参考 首先是第三方库这里我们可以考虑使用github.com/juju/ratelimit这一第三方库下面我们来看一下如何基于这一第三方库封装出外面的限流中间件 // filepath:/limit/limiter package limitimport (timegithub.com/gin-gonic/gingithub.com/juju/ratelimit )// 考虑到我们可能会对不同的请求做不同的限流因此需要一个通用的实现接口 type LimiterInterface interface {Key(c *gin.Context) string //基于context实现获取对应限流器键值对GetBucket(key string) (*ratelimit.Bucket, bool) // 获取限流器AddBuckets(rules ...LimiterBucketRule) LimiterInterface // 添加限流器规则 }type Limiter struct{ // 限流器(用来记录不同接口对应的不同限流策略)LimiterBuckets map[string]*ratelimit.Bucket }type LimiterBucketRule struct { // 限流器规则Key string //FillInterval time.Duration // 时间间隔Capacity int64 // 容量Quantum int64 // 每次放置的令牌量 }// 接口的具体实现 filepath:/limit/method_limiter.go package limitimport (stringsgithub.com/gin-gonic/gingithub.com/juju/ratelimit )type MethodLimiter struct {*Limiter }func NewMethodLimiter() LimiterInterface {l : Limiter{LimiterBuckets: make(map[string]*ratelimit.Bucket)}return MethodLimiter{Limiter: l} }func (l MethodLimiter) Key(c *gin.Context) string {url : c.Request.RequestURIindex : strings.Index(url, ?)if index ! -1 {url url[:index]}return url }func (l MethodLimiter) GetBucket(key string) (*ratelimit.Bucket, bool) {bucket, ok : l.LimiterBuckets[key]return bucket, ok }func (l MethodLimiter) AddBuckets(rules ...LimiterBucketRule) LimiterInterface {for _, rule : range rules {if bucket, ok : l.LimiterBuckets[rule.Key]; !ok {bucket ratelimit.NewBucketWithQuantum(rule.FillInterval, rule.Capacity, rule.Quantum)l.LimiterBuckets[rule.Key] bucket}}return l }// 在gin框架中集成限流中间件 filepath: /middleware/limiter.go package middlewareimport (awesomeProject1/limitfmtgithub.com/gin-gonic/gin )func LimitHandler(l limit.LimiterInterface) gin.HandlerFunc {return func(c *gin.Context) {key : l.Key(c)if bucket, ok : l.GetBucket(key); ok {count : bucket.TakeAvailable(1)fmt.Println(key, key, count, count)if count 0 {c.JSON(429, gin.H{code: 429,msg: too many request,})c.Abort()}}c.Next()} }//测试样例 main.go package mainimport (awesomeProject1/limitawesomeProject1/middlewaretimegithub.com/gin-gonic/gin )func pong(c *gin.Context) {c.JSON(200, gin.H{code: 200,message: pong,})}func main() {r : gin.Default()limiter : limit.NewMethodLimiter()limiter.AddBuckets(limit.LimiterBucketRule{Key: /ping,FillInterval: 10 * time.Second,Capacity: 1,Quantum: 1,},)r.Use(middleware.LimitHandler(limiter)){r.GET(/ping, pong)}r.Run(:8080) }大家可以自己测试一下 结语 上面就是一些常见的限流策略虽然说现在限流策略已经不再是单体架构而是迈向分布式但是万变不离其宗主要还是基于上面所说的策略进行拓展 参考文章 李文周博客——常用限流策略——漏桶与令牌桶介绍
http://www.w-s-a.com/news/646197/

相关文章:

  • 深圳设计功能网站如何用html制作网站
  • 网络优化软件下载竞价排名和seo的区别
  • 龙华新区做网站中高端网站建设
  • 网站开发小图标大全手机网站设计开发
  • 网页设计设计一个网站口碑营销的优点
  • 枣庄建网站的公司唐山企业网络推广培训
  • 张家界建设企业网站学校资源网站建设方案
  • 网站制作教程书籍业务管理系统
  • 上传网站空间的建站程序怎么删除c 网站开发案例详解下载
  • 企业网站维护兼职丹阳网站优化
  • 秦皇岛网站开发公司怎么注册自己的公司
  • 写作网站哪个能得稿费绿色环保企业网站模板
  • 牡丹江网站建设定制开发安徽建设工程信息网官网入口
  • 有什么好的网站建设的书适合在家做的网站工作
  • wordpress情侣源码西安网站快速优化
  • 昆明网站建设高端定制100种班服设计图
  • 网站开发程序说明html网页制作接单
  • 企业网站货物查询怎么做制作文件的软件
  • 怎么做网站的防盗链北京门户企业网站建设
  • 网站推广的主流方法淘客网站 源码
  • 网站海外推广怎么做多用户商城系统源码教程
  • 猎头做单网站网站创建费用
  • 住房和城乡建设网站 上海自己做网站还是公众号
  • 投票网站怎么制作电商网站模板html
  • 攀枝花移动网站建设抖音广告投放平台
  • 什么是网站设计第一装修网
  • 公司网站建设一条织梦门户网站源码
  • 网站改版中su域名注册
  • 做网站有没有前途济南产品网站建设外包
  • 网站备案咨询做静态网站多少钱