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. Java Script 学习笔记 (一) 基础

    1. 设置变量 const: 赋常量,不可更改. let :设置可更改变量. ES6 中推荐使用let 而不是var. Let 和var的区别 : let 将变量的作用域限定在当前{}中, var 定 ...

  2. logger.go

    package app //日志接口 type Logger interface {     Output(maxdepth int, s string) error }

  3. BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对

    BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对 题意: 奶牛的图片 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片, ...

  4. 如何运行vue项目

    首先,列出来我们需要的东西:   node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm  npm的淘宝镜像   安装node.js 从node.js官网下载并安装node,安 ...

  5. Python + Appium 【已解决】driver(session)在多个class之间复用,执行完一个类的用例,再次执行下个类的用例时不需要初始化

    实现效果:打开App进行自动化测试,只需打开APP一次,按先后顺序执行n个py文件中的相应操作,实现自动化测试. 示例:如截图示例,一个App,根据此APP内不同的模块,写成了不同的py文件, 预期结 ...

  6. zookeeper配置管理+集群管理实战

    引言 之前就了解过kafka,看的似懂非懂,最近项目组中引入了kafka,刚好接着这个机会再次学习下. Kafka在很多公司被用作分布式高性能消息队列,kafka之前我只用过redis的list来做简 ...

  7. Linux中以单容器部署Nginx+ASP.NET Core

    引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程.   Ng ...

  8. Javascript的内存泄漏分析

    作为程序员(更高大尚的称谓:研软件研发)的我们,无论是用Javascript,还是.net, java语言,肯定都遇到过内存泄漏的问题.只不过他们都有GC机制来帮助程序员完成内存回收的事情,如果你是C ...

  9. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...

  10. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点

    一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...