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 ...
随机推荐
- python笔记:#003#PyCharm 的初始设置
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...
- ORA-01658: 无法为表空间 YJXT 中的段创建 INITIAL 区
oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ...
- 【转】javascript 作用域链
JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的 ...
- Python 基础【二】 下
str()的方法 字符串练习 1.str.capitalize str.capitalize #返回首字母大写,其他字母小写的字符串 >>> a = 'gwdsr' >> ...
- Spring使用 --- 基本概念(二):AOP,面向方面编程
Table of Contents 什么是面向方面编程 怎样使用 什么时候使用 好处 本文讲述sprint的第二个基本概念: AOP,即面向方面编程 什么是面向方面编程 软件项目中,日志系统等服务系统 ...
- eclipse 创建maven web示例
注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,没有的话需要安装maven. 一.创建项目 1.新建maven项目,如果不在上面,请到other里面去找一下 一直点击下一步, ...
- synchronized与Lock的区别
两者的区别分类对比: 类别 synchronized Lock 存在层次 Java的关键字,在jvm层面上 是一个类 锁的释放 1.以获取锁的线程执行完同步代码,释放锁 2.线程执行发生异常,jvm会 ...
- SSM-Spring-17:Spring中aspectJ注解版
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供 ...
- SSM-MyBatis-16:Mybatis中延迟加载
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 延迟加载: 所谓延迟加载是什么? 从字面意思理解到的是等一会再加载 从行为分析,他主要是缓解数据库压力,提高性 ...
- 使用Python分析ELF文件优化Flash和Sram空间的案例
1. 背景 Zephyr项目Flash和Ram空间比较紧张,有着非常强烈的优化需求. 优化的前提是量化标的,那么如何量化Flash和Ram的使用量呢? 在量化之后,首先要对量化结果进行分析,然后采取措 ...