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之负载、限流和故障处理实践的更多相关文章

  1. .Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]

    网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...

  2. .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  3. springboot + aop + Lua分布式限流的最佳实践

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁, ...

  4. Springboot分布式限流实践

    高并发访问时,缓存.限流.降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个系统崩溃.这个时候常见的解决方案之一就是限流了,当请求达到一 ...

  5. .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡

    目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...

  6. Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路

    端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

  7. Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布

    一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...

  8. Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。

    Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...

  9. 【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!

    写在前面 在<[高并发]面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!>一文中,我们主要介绍了如何使用Nginx进行限流,以避免系统被大流量压垮.除此之外,Ngin ...

随机推荐

  1. idea 整合ssm 启动页404问题

  2. 在线引用js资源积累

    [jQuery]https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js[Vue]https://cdnjs.cloudfla ...

  3. 对于spring中事务@Transactional注解的理解

    现在spring的配置都喜欢用注解,这边就说下@Transactional 一.如何开启@Transactional支持 要使用@Transactional,spring的配置文件applicatio ...

  4. Tiny4412中断介绍

    通过几天裸板驱动开发,今天对ARM的中断做一些简单总结,前面我们已经了解了ARM的7种异常模式,中断是异常模式的一种,在ARM中异常事件发生将会触发中断,但是,所有的中断都不能直接访问cpu,而是都统 ...

  5. mysql事务隔离级别详解和实战

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

  6. 你不知道的JavaScript--Item14 使用prototype的几点注意事项

    1.在prototype上保存方法 不使用prototype进行JavaScript的编码是完全可行的,例如: function User(name, passwordHash) { this.nam ...

  7. javascript 中的apply()和call()方法详解

    1.语法 先来看看JS手册中对call的解释: call 方法 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN]]]]]) ...

  8. Java之增强的for 循环

    3. 增强for循环 1) 作用: 对存储对象的容器进行迭代 2)  jdk5以前怎么迭代 3) 增强for循环迭代数组 String [] arr = {"a", "b ...

  9. 新版知乎登录之post请求

    前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...

  10. 获取具有指定扩展数据的所有实体的Id,并存入Id数组中

    AcDbObjectIdArray ObtainEntId(){ //获取块表 AcDbBlockTable *pBlkTbl; acdbHostApplicationServices()->w ...