Bumblebee之负载、限流和故障处理实践
Bumblebee作为标准HTTP 1.1应用协议的网关,它能作为任何基于HTTP 1.1构建Webapi服务的前置网关。以下通过示例讲述如何用Bumblebee来制作一个asp.net core webapi的前置网关,并演示网关的一些基础功能如:负载,限流和故障迁移等相关基础功能。
网关定义
Bumblebee定义网关非常简便,只需要Nuget引用BeetleX.Bumblebee.然后定义Gateway类运行即可,大概代码如下:
mGateway = new Bumblebee.Gateway();
mGateway.HttpOptions(o => { o.LogToConsole = true; o.Port = ; });
//添中管理的服务,网关会对应用服务的可用状况进行监控
mGateway.SetServer("http://192.168.2.18:8001");
mGateway.SetServer("http://192.168.2.18:8002");
mGateway.SetServer("http://192.168.2.18:8003"); //default的是'*',匹配优先级最低
mGateway.Routes.Default
.AddServer("http://192.168.2.18:8001", , )
.AddServer("http://192.168.2.18:8002", , )
.AddServer("http://192.168.2.18:8003", , );
//以上是手动代码的方式来构建网关,实际上可以通过配置'Gateway.json'来描述即可,具本查看https://github.com/IKende/Bumblebee
mGateway.Open();
以上通过代码定义一个网关,网关主要有三台服务,并进行一个平均负载略。如果不想硬代码的情况可以通过编写'Gateway.json'配置文件来达到同样的效果:
{
"Servers": [
{
"Uri": "http://192.168.2.18:8001/"
},
{
"Uri": "http://192.168.2.18:8002/"
},
{
"Uri": "http://192.168.2.18:8003/"
}
],
"Urls": [
{
"Url": "*",
"HashPattern": null,
"Servers": [
{
"Uri": "http://192.168.2.18:8001/"
},
{
"Uri": "http://192.168.2.18:8002/"
},
{
"Uri": "http://192.168.2.18:8003/"
}
]
}
]
}
以上是组件默认的配置文件,通过代码扩展的好处是可以根据自己的需要来制定存储方式。
Web服务
接下需要编写三个Asp.net core web api项目,分别部署配置到以上三个配置的地址中;为了方便测试服务,对应的方法是返回相应的服务地址IP端口
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { $"{this.HttpContext.Connection.LocalIpAddress}${this.HttpContext.Connection.LocalPort}|{DateTime.Now}" };
}
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return $"{this.HttpContext.Connection.LocalIpAddress}${this.HttpContext.Connection.LocalPort}|{DateTime.Now}";
}
// POST api/values
[HttpPost]
public ActionResult<string> Post([FromBody] string value)
{
return $"{this.HttpContext.Connection.LocalIpAddress}${this.HttpContext.Connection.LocalPort}|{DateTime.Now}";
}
// PUT api/values/5
[HttpPut("{id}")]
public ActionResult<string> Put(int id, [FromBody] string value)
{
return $"{this.HttpContext.Connection.LocalIpAddress}${this.HttpContext.Connection.LocalPort}|{DateTime.Now}";
}
// DELETE api/values/5
[HttpDelete("{id}")]
public ActionResult<string> Delete(int id)
{
return $"{this.HttpContext.Connection.LocalIpAddress}${this.HttpContext.Connection.LocalPort}|{DateTime.Now}";
}
}
编写服务运行后会收到网关的状态请求信息,这个信息主要是网关用于检测服务的有效性,请求频率大概在1秒左右。

测试
为了方便测试示例网关集成了一个测试页面,通过页面请求网关可以看到响应情况;由于配置是三台服务平均负载请求,所以测试请求的情况会看到具体请求会被平均化到不同服务上。

调整权重
组件在添加服务的时候可以设置对应的重权值,以下把8001的权重设置10,其它两个设置成5看一下情况
mGateway.Routes.Default
.AddServer("http://192.168.2.18:8001", , )
.AddServer("http://192.168.2.18:8002", , )
.AddServer("http://192.168.2.18:8003", , );

零权重
组件支持零权重设置,当设置为零的情况下一般情况下是不参与负载的,为什么说一般情况下呢?其实即使是零的情况当其他服务不可用情况是会把负载落地它身上,以下简单的演示一下,把8003配置成零权重运行一段时间后把8001和8002关闭,后再运行8001看一下运行结果
//default的是'*',匹配优先级最低
mGateway.Routes.Default
.AddServer("http://192.168.2.18:8001", , )
.AddServer("http://192.168.2.18:8002", , )
.AddServer("http://192.168.2.18:8003", , );

RPS限制
为了保障服务运行的稳定性,对请求限制是一种比较普遍的做法,组件支持针对不同URL不同服务进行一个RPS限制,用于确保服务可以可靠地运行。以下把三个服务的RPS都即制在100内
mGateway.Routes.Default
.AddServer("http://192.168.2.18:8001", , )
.AddServer("http://192.168.2.18:8002", , )
.AddServer("http://192.168.2.18:8003", , );

以上用工具压测了3秒,正常处理的请求是1000多个,其他几十万的请求都被网关拦载了。所以对于大量并发涌入的时候,rps的限制就能体现其作用。
故障迁移和恢复
这个功能暂由组件内部管理,组件会每秒探测服务的可访问情况;当有服务状态不可或恢复后组件都会重新构建负载策略确保服务的可用性。不过当服务不可用的情况存在短暂时间里访问到这服务的请求会返回5XX访问错误信息。
总结
到这里Bumblebee使用和相关基础功能就介绍完了,但Bumblebee所提供的功能并不远止这些,它提供不同的事件接口用于扩展服务处理可以制很完善的业务处理功能,后面会一步步深入讲解。
示例代码:https://github.com/IKende/Bumblebee/tree/master/Samples/AspCoreWebapi
Bumblebee之负载、限流和故障处理实践的更多相关文章
- .Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]
网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...
- .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- springboot + aop + Lua分布式限流的最佳实践
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁, ...
- Springboot分布式限流实践
高并发访问时,缓存.限流.降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个系统崩溃.这个时候常见的解决方案之一就是限流了,当请求达到一 ...
- .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡
目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...
- Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...
- Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
- 【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!
写在前面 在<[高并发]面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!>一文中,我们主要介绍了如何使用Nginx进行限流,以避免系统被大流量压垮.除此之外,Ngin ...
随机推荐
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)
我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...
- dubbo+zookeeper+springboot构建服务
本次和大家分享的是dubbo框架应用的初略配置和zookeeper注册中心的使用:说到注册中心现在我使用过的只有两种:zookeeper和Eureka,zk我结合dubbo来使用,而Eureka结合s ...
- File文件的读写操作RandomAccessFile类
1.Java提供了一个对文件随机访问的操作,访问包括读和写操作,该类名是RandomAccessFile,该类的读写是基于指针的操作. 2.RandomAccessFile在堆文件进行随机访问操作时有 ...
- mac的terminal快捷键
mac终端terminal快捷键: Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + ...
- WBS 与 甘特图
WBS:工作分解结构(Work Breakdown Structure) 创建WBS:创建WBS是把项目 交付成果和项目工作分解成较小的,更易于管理的组成部分的过程. WBS是项目管理重要的专业术语之 ...
- String的indexOf()用于获取字符串中某个子字符串的位置
indexOf作用:用于检索一个字符串在另一个字符串中的位置. indexOf的几个重载方法如下: int indexOf(String str) 意思为在字符串中检索str第一次出现的位置,如果找 ...
- 执行指定iframe页面的脚本
mark一下,通过jQuery执行指定iframe页面里面的脚本,当前仅知道页面名称. $(window.top.document).find('iframe[src="pagesrc&qu ...
- Activity的运行过程
今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...
- Ubuntu系统下解决“YourUserName不在sudoers文件中。此事将被报告”的问题
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=624 问题描述: 之前在使用Fedora系统时遇到过在使用 sudo 时提示"YourUserName不在 ...
- 关于多条数据转为json格式单次传输的问题 2017.05.27
数据形式如下: var mycars = [];//定义数组存放多条数据 for(var i=0;i<2;i++){ var jsonData = {};//定义变量存放单条数据 jsonDat ...