您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

微服务如何限制接口调用次数?

时间:2021-02-18 10:50:50  来源:  作者:

这种限制接口调用次数的方式,我们通常称之为限流,那么为什么要做限流呢,一般有两种原因:

 

1. 首先是防止服务提供方被大量的请求击垮

我们开发一个项目,最理想的状况是有多少请求,都可以正常地响应,但是在现在的互联网环境,我们很难评估用户的增长,很难评估访问量有多少,甚至有些时候会遇到恶意攻击;那么相比于项目被流量击垮,【限制流量,只满足部分访问的正常响应】要好一些。

简单说就是:满足所有请求 > 满足部分请求 > 项目被击垮,所有请求无法响应。

 

2. 计费

现在很多平台对外开发的接口,并不全是免费的,比如普通会员每天只能调用 1000 次接口,高级会员每天可以调用 10 万次接口,或者按照调用量计费。

 

那么如何限制服务接口的调用次数呢?

使用限流算法

通常我们可以通过限流算法达到限制接口调用次数,比如计数器法、滑动窗口法、漏桶算法、令牌桶算法,这里我们就用令牌桶算法举例。

令牌桶算法,我们可以看做有一个桶,桶里面有 N 个令牌,并且系统会以一个恒定的速度往桶里投放令牌,每次处理之前先要获取令牌,如果获取不到的话,就拒绝服务;在这里我们使用 google 出品的 Guava 工具库,里面提供了一个开箱即用的令牌桶 RateLimiter。

 

如图,我们编写了一个简单的接口,省略了业务逻辑,只返回一个字符串;我们设置 RateLimiter.create(2),表示每秒不超过 2 个任务被提交。

 

让我们用接口工具模拟一下并发调用:

 

他强任他强,我自巍然不动。因为我们使用了限流算法,每秒只处理 2 个请求,所以从日志中我们可以看到这样的效果:每秒只有两条日志。

 

分布式架构下的限流

因为使用开源的组件,限流的实现看起来非常简单,但是这里也有一个比较大的问题,就是实例中是一个应用包,但在实际的项目中,我们通常会是用集群部署的方式,将我们的应用部署在多台机器上,那么这时候该如何限流呢?

每台服务器上的应用自己控制自己的响应数量?比如每天只能调 100 次,那部署 10 台的话,总量就变成了 1000 次了;

反推?因为每天总量只能调 100 次,部署 10 台,那就是每台每天只能调 10 次?这是个很差的办法,先不说流量一定可以平均分配到每台机器上,如果有一台机器挂掉了,是不是今天只能支持调用 90 次了?

 

通常的解决方案,可以把令牌桶中的令牌,不要放在本地,而是放在一个公共的地方,比如 redis 中,每次请求过来,就计算是否超过限制的总量,如果未超过,则正常处理,如果已超过,则返回错误信息。

 

具体做法是,用 Redis 中的 key-100 作为令牌桶,其中 100 表示一分钟可以调用 100 次,每次处理前对 value 进行减 1,返回的值大于 0 表示可以处理;每分钟将 value 设置回 100;或计数累加,开始是 0 ,不断累加,最后超过单位时间的总量限制;

不过这个方法要有一个定时任务,去设置令牌的数量,另外这种方法是不能应对突发流量的,比如前 59 秒一次请求也没有,第 60 秒来了 100 次,第 61 秒进入了一个新的周期,又来了 100 次请求 ,这样实际上是在两秒内处理了 200 次请求。

 

另外一种方案是使用 Redis 中的有序队列 Sorted Set ,存储近 100 次的调用时间,每次有新请求的时候,对比队列中第一个元素的时间和当前时间,如果相差超过 1 分钟,表示还没有超过流量限制,进行处理,并将第一个元素压出队列,将新的请求时间压入队列。



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  Tags: 微服务  点击:(8)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  Tags: 微服务  点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  Tags: 微服务  点击:(35)  评论:(0)  加入收藏
实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做; 图片来源:James Lewi...【详细内容】
2021-10-11  Tags: 微服务  点击:(42)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: 微服务  点击:(60)  评论:(0)  加入收藏
今天,字节跳动正式宣布开源 CloudWeGo。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点。项目地址:https://github.com/clo...【详细内容】
2021-09-08  Tags: 微服务  点击:(93)  评论:(0)  加入收藏
1. Spring Boot 与 Spring Cloud Spring Boot 是用于编写微服务的 Java 基础框架。在Spring Cloud 提供了各种构建全栈微服务的功能。构建小型和大型系统都适合。由于控制反...【详细内容】
2021-08-31  Tags: 微服务  点击:(162)  评论:(0)  加入收藏
现有问题在 EFK 日志收集 篇中,我们讲解了如何利用 EFK 收集 Kubernetes 集群日志。但是,还存在如下问题。 Elasticsearch 以单节点的形式部署,不能满足生产环境的要求 Fluentd...【详细内容】
2021-08-13  Tags: 微服务  点击:(102)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: 微服务  点击:(173)  评论:(0)  加入收藏
一、微服务的现状及未来1.服务架构的演变1.1 单体架构  单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问...【详细内容】
2021-07-22  Tags: 微服务  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条