网关对于服务起到一个统一控制处理的作用,也便于客户端更好的调用;通过网关可以灵活地控制服务应用接口负载,故障迁移,安全控制,监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格,所以针对业务需求来制定一个服务网关需要花费比较大的成本。以下介绍一下Bumblebee基础Web API网关组件,通过它可以灵活扩展更适合业务需求的应用接口网关服务。

简介

Bumblebee是基于BeetleX开发的HTTP网关服务组件,提供了高效的处理性能和基础的网关代理功能;由于Bumblebee是一个基础组件所以它并不像Nginx这些服务直接运行,使用者必须引用Bumblebee通过代码的方式来制定符合自己需求的网关应用。虽然需要编写代码来制定网关,但组件提供简单的方法和事件可以让网关的制定变得非常简单。接下来介绍一下如何通过Bumblebee来实现一个简单的Web API负载网关。

构建控制台程序

引用Bumblebee

可以通过Nuget的方式进行引用组件,搜索Beetlex选择BeetleX.Bumblebee即可以,也可以通过Git下载项目代码进行项目引用 https://github.com/IKende/Bumblebee

网关实现

   class Program
{
private static Gateway g;
static void Main(string[] args)
{
g = new Gateway();
g.HttpOptions(h => h.LogToConsole = true);
g.AddServer("http://192.168.2.25:9090").AddUrl("*", );
g.AddServer("http://192.168.2.26:9090").AddUrl("*", );
g.Open();
Console.Read();
}
}

以上代码实现由http://192.168.2.25:9090和http://192.168.2.26:9090两个服务负载的网关服务,这样一个网关服务就构建完成,运行程序可以看到相关日志情况:

程序运行后组件默认是监听8080端口,可以通过浏览器访问网关

这时候你会看到请求返回的服务信息头是Server: Bumblebee(BeetleX),通过输出日志可以查看请求的情况

日志显示,请求被路由到不同的服务器上

HTTP配置

组件默认提供了一些HTTP服务配置信息,在默认的情况不作任何配置即可提供网关服务,如果想需要更换端口或启用HTTPS服务可以通过HttpOptions方法进行设置,具体配置如下:

            g.HttpOptions(h =>
{
h.Port = ;
h.SSL = true;
h.CertificateFile = "ikende.com.pfx";
h.CertificatePassword = "******";
h.LogToConsole = true;
h.LogLevel = BeetleX.EventArgs.LogType.Info;
});

以上配置服务端口为80,并且开启SSL来支持HTTPS访问(开启HTTPS需要指定证书和密码)。

重权分配

上面的示例是所有请求负载到这两个服务中;由于两者的权重都是0所以会进行平均负载。如果想192.168.2.26:9090的负载比重大些可以调整相关仅重值如:

    g.AddServer("http://192.168.2.25:9090").AddUrl("*", );
g.AddServer("http://192.168.2.26:9090").AddUrl("*", );

以上配置是描述192.168.2.26:9090比192.168.2.25:9090多负载一倍的请求量;权重配置的最大值是10最小值是0,权重值为0的服务是默认不参与负载处理工作,当其他服务不可用的情况下0权重的服务才会生效。

Url配置

一般情况下使用*来匹配请求负载,但可以针对某些Url正则匹配的方式来制定负载策略,组件是优先匹配长正则,在没有匹配的情况下才会使用*的负载策略.

            g.AddServer("http://192.168.2.25:9090").AddUrl("*", );
g.AddServer("http://192.168.2.26:9090").AddUrl("*", );
g.AddServer("http://192.168.2.27:9090").AddUrl("/order.*", );
g.AddServer("http://192.168.2.28:9090").AddUrl("/order.*", );

以上配置/order.*请求的路由负载到192.168.2.27:9090和192.168.2.28:9090上,其实则负载到192.168.2.25:9090和192.168.2.26:9090

基础事件

组件提供了一些基础事件用于记录和控制一些请求处理

Requesting事件

网关接受请求的时候触发这个事件,用户可以通过这个事件取消转发并返回自定义内容

            g.Requesting += (o, e) =>
{
e.Cancel = true;
e.Response.Result(new NotFoundResult("url not found"));
};

Requested事件

网关接受请求并完成响应后触发这个事件,通过这个事件可以记录网关转发完成的状态情况。

            g.Requested += (o, e) =>
{
var code = e.Code;
};

ResponseError事件

网关接受请求,但处理错误触发这个事件,通过这个事件可以自定义错误响应的内容

            g.ResponseError += (o, e) =>
{
e.Result = new BadGateway("order not found");
};

基础性能指标

作为一个网关组件,必须有着可靠和高效的性能。以下针对Bumblebee组件的一个简单测试,测试方式是开启200个用户进行1亿次请求测试,在一台E3-1230V2的服务器上测出的结果是7万多RPS代理转发处理,代理上下行带宽达到7Gb

测试内容

测试结果

Bumblebee项目地址

https://github.com/IKende/Bumblebee

.net core自定义高性能的Web API服务网关的更多相关文章

  1. 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】

    Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...

  2. 使用HttpClient对ASP.NET Web API服务实现增删改查

    本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序&quo ...

  3. 从实体框架核心开始:构建一个ASP。NET Core应用程序与Web API和代码优先开发

    下载StudentApplication.Web.zip - 599.5 KB 下载StudentApplication.API.zip - 11.5 KB 介绍 在上一篇文章中,我们了解了实体框架的 ...

  4. ASP.NET Core MVC中构建Web API

    在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...

  5. 延迟调用或多次调用第三方的Web API服务

    当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...

  6. 使用HttpClient消费ASP.NET Web API服务

    本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...

  7. Spring Boot + Spring Cloud 构建微服务系统(七):API服务网关(Zuul)

    技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢. 当然,因为是REST API接口,外部客户端直接调用各个微服务是没有问 ...

  8. API服务网关(Zuul)

    技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢. 当然,因为是REST API接口,外部客户端直接调用各个微服务是没有问 ...

  9. 【Dalston】【第五章】API服务网关(Zuul) 上

    微服务场景下,每一个微服务对外暴露了一组细粒度的服务.客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么客户端需要多次请求不同的微服务才能完成一次业务处理,增加客户端的代码复 ...

随机推荐

  1. logger.go

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

  2. Go 1.9 sync.Map揭秘

    Go 1.9 sync.Map揭秘 目录 [−] 有并发问题的map Go 1.9之前的解决方案 sync.Map Load Store Delete Range sync.Map的性能 其它 在Go ...

  3. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. bzoj 3551 kruskal重构树dfs序上的主席树

    强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...

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

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

  6. BZOJ 1260:[CQOI2007]涂色paint

    (⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述:Description假设你有一条长度为5的木版,初始时没有涂过任何颜色 ...

  7. Java基础-递归调用

    意义: 递归算法是一种直接或间接地调用自身的算法.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 所以在工作中我们经常用递归 来进行一些算法操作 比如 ...

  8. Spark学习之数据读取与保存总结(一)

    一.动机 我们已经学了很多在 Spark 中对已分发的数据执行的操作.到目前为止,所展示的示例都是从本地集合或者普通文件中进行数据读取和保存的.但有时候,数据量可能大到无法放在一台机器中,这时就需要探 ...

  9. Mysql存储过程历史表备份

    应用背景 SCADA采集系统需要将实时数据存入历史表.问题1:如何更简单的添加历史数据?2.海量历史数据,比如年数据,如何快速筛选 画曲线? 利用mysql的事件,每小时存一次采集数据: 每月备份历史 ...

  10. WebGL展示3D房屋内景

      原文地址:WebGL展示3D房屋内景   由于生活和工作上的原因,从年前开始一直到处奔波,没有太多的时间去关注和学习WebGL图形学相关的技术, 不过陆陆续续都有学习使用blender进行3D建模 ...