网关对于服务起到一个统一控制处理的作用,也便于客户端更好的调用;通过网关可以灵活地控制服务应用接口负载,故障迁移,安全控制,监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格,所以针对业务需求来制定一个服务网关需要花费比较大的成本。以下介绍一下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:9090http://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:9090192.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:9090192.168.2.28:9090上,其实则负载到192.168.2.25:9090192.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. Python爬虫三年没入门,传授一下绝世神功,经理唏嘘不已!

    长期枯燥的生活,敲代码的时间三天两头往吸烟室跑,被项目经理抓去训话. "入门"是学习Python最重要的阶段,虽然这个过程也许会非常缓慢.当你心里有一个目标时,那么你学习起来就不会 ...

  2. 在Windows Server 2008 R2下搭建jsp环境(三)-Tomcat的下载安装

    1.百度搜索"Tomcat官网",点击有标志的官网进入,准备下载官方正版Tomcat. 2.进入Tomcat官网之后,在左边我们看到,Tomcat的有6,7,8这三个最流行的版本, ...

  3. engine.go

    package ;;;;;;;;) ;;;;;) ) ) ) ;; ;;, types.DocumentIndexData{}, true)     for {         runtime.Gos ...

  4. 安卓---RedioButton(单选按钮)、CheckBox(复选按钮)

    <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content ...

  5. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  6. 当需要向数据库插入空值时,sql语句的判断

    方法如下: 1.int代表整形. 2.string 代表 字符型. 3.datetime ,日期类型判断如下 if(account.date!=Datetime.MinValue) { Str1.Ap ...

  7. ceph 常见问题百科全书---luminous安装部署篇

    1. 执行步骤:ceph-deploy new node        机器:centos 7.5   ceph  Luminous版本     源:阿里云 问题: Traceback (most r ...

  8. 带着新人看java虚拟机07(多线程篇)

    这一篇说一下比较枯燥的东西,为什么说枯燥呢,因为我写这都感觉很无聊,无非就是几个阻塞线程的方法和唤醒线程的方法... 1.线程中断 首先我们说一说怎么使得一个正在运行中的线程进入阻塞状态,这也叫做线程 ...

  9. Haskell学习-monad

    原文地址:Haskell学习-monad 什么是Monad Haskell是一门纯函数式的语言,纯函数的优点是安全可靠.函数输出完全取决于输入,不存在任何隐式依赖,它的存在如同数学公式般完美无缺.可是 ...

  10. Java语言编程 - Java历史简介

    1.1 Sun公司 介绍Java的历史之前,先介绍一下Java语言的缔造公司,Sun公司,Sun公司的全称是:Stanford University Network.值得一提的是,Sun公司从1982 ...