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

揭阳企业网站建设开发wordpress免费的模板下载

揭阳企业网站建设开发,wordpress免费的模板下载,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.dnsts.com.cn/news/5738.html

相关文章:

  • 广州市城乡和建设局网站首页本溪做网站
  • nas怎么做自己的网站企业网站系统建设
  • 做网站支付系统难度前端开发就业前景
  • 临沧市住房和城乡建设网站佛山优化网站方法
  • 营销型网站 案例山东省城乡与住房建设厅网站
  • 上海企业网站制作报价医疗网站建设讯息
  • 常州网站建设乛薇网站网页模板
  • 成功的网站必须具备的要素wordpress附件分离
  • 怎样做一个网站平台网站的盈利点
  • 赣州市铁路建设办公室网站北京工商注册网上核名
  • 网站建设宽度一般都是多少钱免费网络电话免费版试用
  • 网站内页的设计重庆校园网站开发
  • 信息查询类网站是怎么做的盐城做网站的公司地址
  • 如何设计和建立一个公司的网站wordpress登录名
  • 如何使用手机看建设网站网站建设推广怎么做
  • 高中网站建设课程摄影网站的设计与实现开题报告
  • 做网站计入什么科目哪些软件属于网页制作工具
  • 山东青岛网站设计网站备案成功后怎么
  • 天津做网站的大公司网站开发技术学习
  • 萧山网站制作公司宿州网站建设工作室
  • 网站管理手册基本的网站建设知识
  • 免费咨询中心sem和seo是什么
  • 宝安附近公司做网站建设哪家效益快郎溪县建设局网站
  • 附近的网站设计制作价格义乌专业做网站
  • 做企业网站哪家好做好公众号 网站建设
  • 建站公司服务短租房网站哪家做最好
  • 如何在百度提交网站广东黄页企业名录
  • 广州品牌网站设计价格万链网站做的怎么样?
  • 岳阳博物馆网站网站一般字体
  • 网站版面布局wordpress网站怎样