Bumblebee.netcore下开源基于BeetleX.FastHttpApi扩展的HTTP微服务网关组件,它的主要作用是针对WebAPI集群服务作一个集中的转发和管理;作为应用网关它提供了应用服务负载,故障迁移,安全控制,监控跟踪和日志处理等。它最大的一个特点是基于C#开发,你可以针对自己业务的需要对它进行扩展具体的业务功能。

组件部署

组件的部署一般根据自己的需要进行引用扩展功能,如果你只需要简单的应用服务负载、故障迁移和恢复等功能只需要下载Bumblebee.ConsoleServer编译部署即可(暂没提供编译好的版本)。Bumblebee.ConsoleServer提供两个配置文件描述'HttpConfig.json'和'Gateway.json'分别用于配置HTTP服务和网关对应的负载策略。

可运行在什么系统

任何运行.net core 2.1或更高版本的操作系统(liinux,windows等)

HTTP配置

'HttpConfig.json'是用于配置网关的HTTP服务信息,主要包括服务端,HTTPs和可处理的最大连接数等。

{
"HttpConfig": {
"Host": "", //服务绑定的地址,不指定的情况默认绑定所有IPAddress.Any
"Port": , //网关对外服务端口
"SSL": false, //是否开启HTTPs服务,如果开启默认绑定443端口
"CertificateFile": "", //证书文件
"CertificatePassword": ", //证书密码
"UseIPv6":true //是否开启ipv6
}
}

网关策略配置

'Gateway.json'主要用于配置负载的服务信息,主要包括负载的服务应用 和负载策略等

{
"Servers": [ //需要负载的服务应列表
{
"Uri": "http://192.168.2.19:9090/", //服务地址,可指定域名
"MaxConnections": //指向服务的最大连接数
},
{
"Uri": "http://192.168.2.25:9090/",
"MaxConnections":
}
],
"Urls": [ //负载的Url策略
{
"Url": "*", //*是优先级最低的匹配策略,优先级采用长正则匹配
"HashPattern": null, //一致负载描述,不配置的情况采用权重描述
"Servers": [ //对应Url负载的服务应
{
"Url": "http://192.168.2.19:9090/", //服务地址,可指定域名
"Weight": //对应的权重,区间在0-10之前,0一般情况不参与负载,只有当其他服务不可用的情况才加入
},
{
"Url": "http://192.168.2.25:9090/",
"Weight":
}
]
}
]
}

HashPattern

如果需要一致性负载的时候需要设置,可以通过获到Url,Header,QueryString等值作为一致性负载值。设置方式如下:

[host|url|baseurl|(h:name)|(q:name)]

可以根据实际情况选择其中一种方式

  • Host 使用Header的Host作为一致性转发

  • url 使用整个Url作为一致性转发

  • baseurl 使用整个BaseUrl作为一致性转发

  • h:name 使用某个Header值作为一致性转发

  • q:name 使用某个QueryString值作为一致性转发

应用扩展

Bumblebee只是一件组件,最终肯定需要针对业务需求来扩展它来实现相关功能;在讲解之前先看一下组件执行代理负载的流程图:

组件提供三个事件和一组过虑器来实现功能扩展,通过事件和过虑器可以对请求进行验证,拦截,日志记录和监控处理等功能。以下简单地预览一下这三个事件的实现

            g.Requesting += (o, e) =>
{
Console.WriteLine("Requesting");
Console.WriteLine($" Request url ${e.Request.BaseUrl}");
//e.Cancel = true;
};
g.AgentRequesting += (o, e) =>
{
Console.WriteLine("agent requesting:");
Console.WriteLine($" Request url ${e.Request.BaseUrl}");
Console.WriteLine($" url route {e.UrlRoute}");
Console.WriteLine($" agent server {e.Server.Uri}");
//e.Cancel = true;
};
g.Requested += (o, e) =>
{
Console.WriteLine("Requested");
Console.WriteLine($" Request url ${e.Request.BaseUrl}");
Console.WriteLine($" url route {e.UrlRoute}");
Console.WriteLine($" agent server {e.Server.Uri}");
Console.WriteLine($" response code {e.Code} use time {e.Time}ms");
};

如何验证请求

对于微服务网关来说,统一控制用户请求的有效性是重要的功能;虽然组件没有集成这些策略配置,不过可以通过制定组件的事件或IRequestFilter来实现控制。

Requesting事件

Requesting是网关组件接受请求后触发的事件,通过这个事件可以对来源的一些请求信息进行验证,并决定是否继续转发下去;定义事件代码如下:

    g.Requesting += (o, e) =>
{
//e.Request
//e.Response
e.Gateway.Response(e.Response, new NotFoundResult("test"));
e.Cancel = true;
};

通过设置e.Cancel属性来确定是否转发来源的请求。

IRequestFilter

IRequestFilter是组件针对相应Url请求处理的过虑器,可以实现这一接口对某些请求的Url进行控制处理。接口实现方式大致如下:

        public class NotFountFilter : Filters.IRequestFilter
{
public string Name => "NotFountFilter"; public void Executed(Gateway gateway, HttpRequest request, HttpResponse response, ServerAgent server, int code, long useTime)
{ } public bool Executing(Gateway gateway, HttpRequest request, HttpResponse response)
{
gateway.Response(response, new NotFoundResult("test"));
return false;
}
}

添加Filter到网关,并设置到*上.

            g.AddFilter<NotFountFilter>();
g.Routes.GetRoute("*").SetFilter("NotFountFilter");

断熔扩展

同样组件并不提供服务断熔的处理,但通过扩展的确可以轻松地完成这个工作。首先可以在Requested事件统计完成的情况,参考指标可以是,url信息,5xx状态、加响应延时等进行一个连续计数并生成断熔策略,通过这些策略数据就可以在RequestingIRequestFilter对相应的请求进行控制。大概的扩展流程如下:

监控统计

由于网关需要处理大量的请求转和规则处理,所以组件默认并没有提供详细的监控和日志功能,不过组件同样提供事件方式来制定这些数据的记录。用户可能通过事件把数据记录到自有的系统中进行分析统计,这些数据主要包括:Header,Cookie,QueryString,http请求的状态和处理损耗的时间.事件定义如下:

            g.Requested += (o, e) =>
{
//e.Request 请求信息
//e.Response 响应信息
//e.Code Http状态
//e.Time 执行完成时间,单位毫秒
//e.Server 接收请求的服务
};

以下是针组件数据收集的一些统计扩展实例.

性能测试

作为网关,性能和可靠性比较重要,毕竟它是服务之首;以下是针对Bumblebee作为代理网关的测试,主要测试不同数据情况下的性能指标。测试配置描述

  • 网关服务器:e3-1230v2,部署Bumblebee
  • webapi服务器:e5-2676v2,部署webapi
  • 测试服务器:e5-2676v2,测试工具bombardier
  • 测试带宽环境:10Gb

plaintext

D:\>bombardier.exe -c  -n  http://192.168.2.18:9090/home/plaintext
Bombarding http://192.168.2.18:9090/home/plaintext with 1000000 request(s) using
connection(s)
/ [===============================================] 100.00% 9s
Done!
Statistics Avg Stdev Max
Reqs/sec 104050.45 15852.09 133791.97
Latency .80ms .35ms .06s
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .15MB/s

json

D:\>bombardier.exe -c  -n  http://192.168.2.18:9090/home/json
Bombarding http://192.168.2.18:9090/home/json with 1000000 request(s) using 500
connection(s)
/ [===============================================] 100.00% 9s
Done!
Statistics Avg Stdev Max
Reqs/sec 105541.22 9336.18 126993.02
Latency .73ms .45ms .02ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .90MB/s

employees

D:\>bombardier.exe -c  -n  http://192.168.2.18:9090/home/employees
Bombarding http://192.168.2.18:9090/home/employees with 1000000 request(s) using
connection(s)
/ [==============================================] 100.00% 14s
Done!
Statistics Avg Stdev Max
Reqs/sec 69943.34 8672.45 91544.97
Latency .02ms .75ms .04ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .74MB/s

orders

D:\>bombardier.exe -c  -n  http://192.168.2.18:9090/home/orders
Bombarding http://192.168.2.18:9090/home/orders with 1000000 request(s) using 50
connection(s)
/ [==============================================] 100.00% 12s
Done!
Statistics Avg Stdev Max
Reqs/sec 78498.29 15013.95 101544.42
Latency .22ms .33ms .04ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .52MB/s
D:\>

其他问题

  • 组件是否稳定?
    只能说在测试范围内稳定性和性能都比较出色,是否存在bug这个就不好说,只能等待发现解决……
  • 组件优势
    组件最大的特点是简单和基本C#开发,扩展起来比较方便
  • 为什么基于Beetlex.FastHttpApi扩展,而不是KestrelHttpServer
    主要原因Beetlex.FastHttpApi也是由基础开发,整体控制性和扩展性要对我来说比较方便 ,Beetlex.FastHttpApi同样也有着出色的性能指标。
  • 需要注意的地方
    由于Http部分是Beetlex.FastHttpApi,所以在一些特别的场需了解Beetlex.FastHttpApi的一些基础参数配置,主要是buffer配置这一块。

Bumblebee微服务网关的部署和扩展的更多相关文章

  1. .net core中使用Bumblebee架设微服务网关

    Bumblebee是款基于.net core开发开源的http服务网关,经过最近版本的完善在功能足以满足作为微服务网关的需要.在微服务网关功能中它提供了应用服务负载,故障迁移,安全控制,监控跟踪和日志 ...

  2. 使用 Node.js 搭建微服务网关

    目录 Node.js 是什么 安装 node.js Node.js 入门 Node.js 应用场景 npm 镜像 使用 Node.js 搭建微服务网关 什么是微服务架构 使用 Node.js 实现反向 ...

  3. 微服务网关哪家强?一文看懂Zuul, Nginx, Spring Cloud, Linkerd性能差异

      导语:API Gateway是实现微服务重要的组件之一.面对诸多的开源API Gateway,如何进行选择也是架构师需要关注的焦点.本文作者对几个较大的开源API Gateway进行了压力测试,对 ...

  4. 微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

  5. 王院生:Apache APISIX 微服务网关极致性能架构解析

    2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...

  6. Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战

    一. 前言 [APP 移动端]Spring Security OAuth2 手机短信验证码模式 [微信小程序]Spring Security OAuth2 微信授权模式 [管理系统]Spring Se ...

  7. Kong 微服务网关在 Kubernetes 的实践

    来源:分布式实验室译者:qianghaohao本文主要介绍将 Kong 微服务网关作为 Kubernetes (https://www.alauda.cn)集群统一入口的最佳实践,之前写过一篇文章使用 ...

  8. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  9. 微服务-网关-node.js by 大雄daysn

    目录 序言 一.node.js入门1.1 下载并安装1.2 从helloworld到一个web应用1.3 Express框架二.node.js搭建网关 三.node.js集群搭建   序言 首先一个问 ...

随机推荐

  1. MySQL 8 新特性之降序索引

    MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...

  2. 关于SELinux

    出现背景以及发展历程 SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secu ...

  3. golang使用Nsq

    为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golan ...

  4. appium 运行报错:...... Attempt to re-install io.appium.settings without first uninstalling解决方案

    报错形式: Failed to install D:\AutoTest\appium\Appium\node_modules\appium\build\settings_apk\settings_ap ...

  5. Hadoop配置第2节-JDK的安装

    Hadoop配置-JDK的安装 总体目标:完成zookeeper+Hadoop+Hbase 整合平台搭建   进度:1:集群网络属性配置2:集群免密码登陆配置3:JDK的安装4:Zookeeper的安 ...

  6. CMake入门实战

    本文用来记录基本的Cmake用法,以一个实例,讲解如何通过cmake构建一个一个基本的工程,文件的目录如下: 说明: bin文件夹下的debug和release分别存放编译输出的文件和相关依赖的动态库 ...

  7. 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...

  8. .net core 在网络高并发下提高JSON的处理效率

    现有的webapi一般都基于JSON的格式来处理数据,由于JSON是一个文本类的序列化协议所以在性能上自然就相对低效一些.在.net中常用Newtonsoft.Json是最常用的组件,由于提供简便基于 ...

  9. BootStrap:轮播插件

    前述 利用 BootStrap 实现图片轮播,包括 基本轮播.带标题的轮播.设置轮播速度的轮播.控制前后的轮播 实例 基本轮播 代码 1.引入bootstrap和jQuery文件 <!-- jQ ...

  10. Shiro详解

    Shiro Shiro集成Spring 加入Spring和Shiro的jar包 配置Spring及SpringMVC 参照:官方给出的案例shiro\samples\spring Shiro集成Web ...