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 = 80; });//添中管理的服务,网关会对应用服务的可用状况进行监控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", 0, 0).AddServer("http://192.168.2.18:8002", 0, 0).AddServer("http://192.168.2.18:8003", 0, 0);//以上是手动代码的方式来构建网关,实际上可以通过配置'Gateway.json'来描述即可,具本查看https://github.com/IKende/BumblebeemGateway.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", 10, 0).AddServer("http://192.168.2.18:8002", 5, 0).AddServer("http://192.168.2.18:8003", 5, 0);

零权重

组件支持零权重设置,当设置为零的情况下一般情况下是不参与负载的,为什么说一般情况下呢?其实即使是零的情况当其他服务不可用情况是会把负载落地它身上,以下简单的演示一下,把8003配置成零权重运行一段时间后把8001和8002关闭,后再运行8001看一下运行结果

   //default的是'*',匹配优先级最低
            mGateway.Routes.Default.AddServer("http://192.168.2.18:8001", 10, 0).AddServer("http://192.168.2.18:8002", 10, 0).AddServer("http://192.168.2.18:8003", 0, 0);

RPS限制

为了保障服务运行的稳定性,对请求限制是一种比较普遍的做法,组件支持针对不同URL不同服务进行一个RPS限制,用于确保服务可以可靠地运行。以下把三个服务的RPS都即制在100内

            mGateway.Routes.Default.AddServer("http://192.168.2.18:8001", 10, 100).AddServer("http://192.168.2.18:8002", 10, 100).AddServer("http://192.168.2.18:8003", 10, 100);

以上用工具压测了3秒,正常处理的请求是1000多个,其他几十万的请求都被网关拦载了。所以对于大量并发涌入的时候,rps的限制就能体现其作用。

故障迁移和恢复

这个功能暂由组件内部管理,组件会每秒探测服务的可访问情况;当有服务状态不可或恢复后组件都会重新构建负载策略确保服务的可用性。不过当服务不可用的情况存在短暂时间里访问到这服务的请求会返回5XX访问错误信息。

总结

到这里Bumblebee使用和相关基础功能就介绍完了,但Bumblebee所提供的功能并不远止这些,它提供不同的事件接口用于扩展服务处理可以制很完善的业务处理功能,后面会一步步深入讲解。

示例代码:https://github.com/IKende/Bumblebee/tree/master/Samples/AspCoreWebapi

转载于:https://www.cnblogs.com/smark/p/10556849.html

Bumblebee之负载、限流和故障处理实践相关推荐

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

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

  2. 构建SpringCloud 项目初始环境(四)—Sentinel限流熔断应用实践

    一.Sentinel简介 1.背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时 ...

  3. Sentinel限流熔断应用实践

    文章目录 一.Sentinel 1.Sentinel简介 背景分析 Sentinel概述 安装Sentinel服务 idea配置sentinel启动: 访问Sentinal服务 2.Sentinel限 ...

  4. 九.Sentinel限流熔断应用实践

    Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...

  5. Java并发:分布式应用限流 Redis + Lua 实践

    任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶.在之前的文章中,也讲到过,但是那是基于单机场景来写. 之前文章:接口限流算法:漏桶算法&令牌桶算法 然 ...

  6. 4种典型限流实践保障应用高可用|云效工程师指北

    大家好,我叫黄博文,花名延枚,目前负责云效旗下产品Flow流水线的设计和开发.在微服务架构下,服务越来越多,服务之间的调用也会越来越复杂.如何保障服务的高可用性就成为了一个挑战.之前我参与过的某个产品 ...

  7. Service Mesh微服务熔断、限流的骚操作

    在微服务架构中,随着服务调用链路变长,为了防止出现级联雪崩,在微服务治理体系中,熔断.限流作为服务自我保护的重要机制,是确保微服务架构稳定运行的关键手段之一. 那么什么是熔断.限流?在传统Spring ...

  8. 玩转Service Mesh微服务熔断、限流骚操作

    在微服务架构中,随着服务调用链路变长,为了防止出现级联雪崩,在微服务治理体系中,熔断.限流作为服务自我保护的重要机制,是确保微服务架构稳定运行的关键手段之一. 那么什么是熔断.限流?在传统Spring ...

  9. 如何设计秒杀服务器的限流策略

    如果平时系统的访问量只有一万,而最大承受限制为五万,在秒杀时刻的瞬间,访问量突然增加到100W,此事系统一定会因访问量过大而宕机,此时就应该设计一个限流策略,使服务器能接收和处理的请求减少. 秒杀限流 ...

最新文章

  1. mysql和sqlserver共存_mysql 和sqlserver的 多行合并成一行
  2. C#中DateTime.Now.Ticks的用法和说明
  3. for循环的执行顺序
  4. Database之SQLSever:SQLSever基础知识进阶、软件安装注意事项、软件使用经验总结之详细攻略
  5. @query传参_vue-router中params传参和query传参的区别及处理方法
  6. js获取/设置任意元素中间内容的兼容方法
  7. SAP GRC 权限合规审计系统
  8. 百度开撕离职前高管:侵犯商业机密索赔 5000 万!
  9. Cannot set property ‘innerHTML‘ of null 问题的解决
  10. 安卓应用性能调试和优化经验分享
  11. python3+selenium入门03-操作谷歌浏览器
  12. 校内胡策 T9270 mjt树
  13. 调用java webservice 报错_java调用webservice方法报错
  14. 【Steam VR 2.0】自定义按键 action 发布后无效的解决办法
  15. 《wifi加密破解论文》翻译介绍-wifi不再安全
  16. cad延伸快捷键_CAD绘图大师都在用的46组快捷键,高效绘图必备
  17. “舒淇半停工原因”上热搜:人生下半场,拼的是健康
  18. 大一ACM比赛观摩感悟(比赛)
  19. Idea如何设置类头注释(图片步骤直接到位)
  20. 视频教程-ps基础课程绝对初级,小白听得懂-Photoshop

热门文章

  1. GD GD32F103RCT6 微控制器
  2. 空洞卷积dilated conv
  3. DNS域名解析过程详解
  4. SQL行列转换6种方法
  5. IntelliJ IDEA 2021下载、安装
  6. Cewl命令学习Hydra学习---Hydra windows破解实战各个协议演示
  7. Flutter 功能最全的JsonToDart工具(桌面Web海陆空支持)
  8. oracle awr监控报告,一个Oracle小白的AWR报告分析(一)
  9. Notepad++介绍与安装
  10. Ubuntu使用linux-wifi-hotspot创建WIFI热点