BeetleX服务网关之限流和缓存
限流和缓存是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力。Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是BeetleX.Bumblebee.ConcurrentLimits和BeetleX.Bumblebee.Caching。ConcurrentLimits提供IP或不同Url的并发限流策略,而Caching则可以根据不同Url来配置不同的缓存策略。接下来介绍这两个插件的使用和配置。
引用插件
Bumblebee
中使用JWT
需要引用两个插件,分别是Bumblebee.Configuration,BeetleX.Bumblebee.ConcurrentLimits
和BeetleX.Bumblebee.Caching
。加载启动后就可以通过管理工具进行插件配置.
g = new Gateway();
g.HttpOptions(
o =>
{
o.Port = ;
o.LogToConsole = true;
o.LogLevel = BeetleX.EventArgs.LogType.Error;
});
g.Open();
g.LoadPlugin(
typeof(Bumblebee.Configuration.Management).Assembly,
typeof(Bumblebee.Caching.default_request_cached_reader).Assembly,
typeof(Bumblebee.ConcurrentLimits.UrlConcurrentLimits).Assembly
);
以上只是代码引用插件,建议直接下载运行版本:https://github.com/IKende/Bumblebee/blob/master/bin/ (支持windows/linux .net core 2.1或更高版本)
引用插件后就可以在插件管理查看到这两个插件,大部分插件默认是关闭。
限流配置
default_ip_concurrent_limits
这是针对一个IP并发请求的限制,它可以限制一个IP每秒并发的数量,如果超出这个数量那这个IP则会被禁止访问一段时间。为了更好的解决实际情况项配置里加入了白名单设置用来排除相关IP或IP范围的限制,接下来通过一个配置来描述这个插件的使用.
{
"Limit": ,
"DisabledTime": ,
"CleanTime": ,
"WhiteList": [
"192.168.1.1/24",
"192.168.2.18"
]
}
- Limit 每秒最大并发数
- DisabledTime 禁用时间,当IP访问超过每秒并发数时禁止请求的时间,单位秒
- CleanTime每隔一段时间清除在限制表没有活跃的IP,单位秒
- WhiteList 白明单,在这个白名单里的IP不被限制
以上配置是对每个IP每秒并发限制在100次,但排除 "192.168.1.1/24"和"192.168.2.18".接下来看一下测试结果
以上是使用192.168.2.19
进行两次压测的结果,第一次压测触发了限制,然后99%的请求被拒绝;然后接下来的一次测试的所有请求都被拒绝了。从结果上来看每秒的20万rps都被认为是非法,可以想像这些压力流入到正常服务中会产生有多大的损耗!接下来测试白名单IP
从正常测试来看,上游的服务每秒只能处理4万的rps,所以并发控制是会起到非常好的挡洪效果。
default_url_concurrent_limits
这是针对不同Url制定不同并发限制的插件,在一个服务中难免有些API
需要处理复杂的逻辑而占用大量的资源,如果这些接口的并发过量可能对整个服务的资源使用受到影响。通过这个插件可以限制某些API
的并发数量,从而控制其它对整体资源的影响。下面看一下简单的示例配置
{
"UrlLimits": [
{
"Url": "^/jso.*",
"Rps":
},
{
"Url": "^/emp.*",
"Rps":
}
],
"CleanTime":
}
以上配置两组Url并发限制,限制秒请求量分别是300和100.配置完成后设置生产看一下压测结果
/Json
并发限制是每秒300
测试了5秒多,有1800
个请求是成功能的,其他99万多次是被拒绝
/Employee/2
并发限制是每秒100
测试了5秒多,有600
个请求是成功能的,其他99万多次是被拒绝
缓存配置
缓存插件有两部分,分别是写入和读取;当写入开启后读取才能生效。缓存配置只需要配置写入插件即可,读取插件无需配置。
default_request_cache_writer
插件可以针对不同请求的路径来制定缓存策略,制定也非常方便内容如下:
{
"Caches": [
{
"Url": "^/jso.*",
"TimeOut":
},
{
"Url": "^/api.*",
"TimeOut":
}
],
"WhiteList": [
"192.168.2.1/24"
]
}
这个缓存插件配置简单,只需要针对不同Url
配置相应的正常和缓存超时时间即可(单位秒);WhiteList
是一个缓存操作的授权白名单。这个缓存的机制是使用.net core的MemoryCache
,如果需要使用Redis
则需要扩展引入,针对密集处理的网关一级缓存还是在本地内存会高效很多。
测试
为了检测网关层面缓存的效果,所以对插件进行了一个压力测试;为了确保缓存发挥比较大的作用所以这个测试在10Gb网络下面进行(网关服务器则是E3-1230V2的老机器),这样可以更好的突出缓存在没有带宽限制情况达到的应用效果。测试分别是获取不同大小的数据列表在关闭和开启缓存的不同差异。
http://192.168.2.18/customers/5
以上是插件显示的并发情况,前面是没有开启缓存并发在4万rps左右,带宽是500Mb上下;但开启缓存后并发达到了20万以上rps(插件走势图最大显示并发只有10万rps),带宽接近3Gb.
http://192.168.2.18/customers/20
以上是插件显示的并发情况,前面是没有开启缓存并发在2万rps左右,带宽是1Gb上下;但开启缓存后并发达到了17万rps(插件走势图最大显示并发只有10万rps),带宽接近8Gb上下.
总体上来说如果网关缓存开启其收益是非常明显的,这个时候限制服务并发输出的可能是出口的带宽。
缓存操作
插件安装后会提供两个接口来删除某个Url对应的缓存,或清除所有缓存;这两个接口的访问权IP必须在白名单中描述否而无权操作。
http://host/__system/bumblebee/cache/remove?url=缓存对应的url
http://host/__system/bumblebee/cache/clean
BeetleX服务网关之限流和缓存的更多相关文章
- 服务接口API限流 Rate Limit 续
一.前言 上一篇文章中粗浅的介绍使用Redis和基于令牌桶算法进行对服务接口API限流,本文介绍另一种算法---漏桶算法的应用.Nginx想必大家都有所了解是一个高性能的 HTTP 和反向代理服务器, ...
- Hystrix介绍以及服务的降级限流熔断
(dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...
- 服务接口API限流 Rate Limit
一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...
- Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...
- java 服务接口API限流 Rate Limit
一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...
- 集群、限流、缓存 BAT 大厂无非也就是这么做
前言 前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步. 优化 ...
- 【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!
写在前面 在<[高并发]面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!>一文中,我们主要介绍了如何使用Nginx进行限流,以避免系统被大流量压垮.除此之外,Ngin ...
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- Golang微服务:Micro限流、熔断
Wrapper Wrapper提供了一种包装机制,使得在执行某方法前先执行Wrapper,优点Filter的意思:因此可以在客户端和服务器做很多功能:熔断限流.Filter.Auth等. client ...
随机推荐
- codeforces 19 D. Points(线段树+set二分)
题目链接:http://codeforces.com/contest/19/problem/D 题意:给出3种操作:1)添加点(x,y),2)删除点(x,y),3)查询离(x,y)最近的右上方的点. ...
- poj 1456 Supermarket(贪心+优先队列)
题目链接:http://poj.org/problem?id=1456 题意:有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间. ...
- 【LeetCode】435-无重叠区间
题目描述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触", ...
- 关于重写对象equals方法的问题
1.==和equals的区别 a.基本数据类型使用 == 进行值的比较 b.引用类型使用 == 进行比较时,直接比较的是对象的存储地址,即两个引用是否指向了同一个对象. c.equals方法是基类O ...
- java中存储机制堆栈。
一.java的六种存储地址及解释 1) 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不 ...
- 集成学习方法Boosting和Bagging
集成学习是通过构架并结合多个学习器来处理学习任务的一种思想, 目前主要分为两大类:Boosting和Bagging. 对于任意一种集成方法, 我们都希望学习出来的基分类器具有较高的准确性和多样性, 基 ...
- Vulkan(1)用apispec生成Vulkan库
Vulkan(1)用apispec生成Vulkan库 我的Vulkan.net库已在(https://github.com/bitzhuwei/Vulkan.net)开源,欢迎交流. apispec. ...
- 把windows下的压缩包放到Linux目录下去
今天在自学redis时出现了问题,因为楼主linux也是空白纸,前几天安装了Linux后就只会基本的命令,其他的一概不通啊,所以当redis要在Linux中用时就傻眼了,索性就在windows中下载了 ...
- GlusterFs卷类型分析及创建、使用(结合kubernetes集群分析)
引言 本文通过对卷类型的分析对比,来帮助读者选取生产环境最符合服务的挂载存储,命令可结合<glusterfs详解及kubernetes 搭建heketi-glusterfs>进行实验,下面 ...
- 纯css耍个透明正方体转一转
效果 效果图如下 实现思路 定义一个最外层的容器,用来控制显示的位置 定义一个父容器,用来设置元素被查看位置的视图,这里使用到CSS3的perspective 属性 定义子容器,设置为相对定位,利 ...