简介

是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件,它并没有完全实现HTTP SERVER的所有功能,而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET,满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP的数据交互功能,虽然是一个精简版本但针对SSL这方面的安全性还是支持。有牺牲就必然有收获,FastHttpApi作出这么大的精简必然在性能上有所收获取,经测试FastHttpApi在GET/POST这些数据交互的场景下性能和吞吐能力是Asp.net core集成的Kestrel的要优胜许多。

https://github.com/IKende/FastHttpApi

使用便利性

FastHttpApi虽然在HTTP方面作了大量的精简,但并没有为此增加了它使用的复杂度。FastHttpApi具备asp.net core webapi的便利性;应用人员只需要制定和webapi一样的方法即可,在使用过程中和写普通逻辑方法没有多大的区别。

定义一个控制器

控制器用来定义具体相应URL处理的方法,只需要在类上定义Controller属性即可把类中的Public方法提供给Http访问;方法参数来源于QueryString,当参数标记为BodyParameter的时候参数来源于Http Body.

   [Controller]
public class ControllerTest
{
// /hello?name=
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
// /add?a=&b=
public string Add(int a, int b)
{
return string.Format("{0}+{1}={2}", a, b, a + b);
}
// /post?name=
public object Post(string name, [BodyParameter] UserInfo data)
{
return data;
}
// /listcustomer?count
public IList<Customer> ListCustomer(int count)
{
return Customer.List(count);
}
// /listemployee?count
public IList<Employee> ListEmployee(int count)
{
return Employee.List(count);
}
// post /AddEmployee
public Employee AddEmployee([BodyParameter]Employee item)
{
return item;
}
}
Filter定义

Filter是Controller处理方法的拦载器,通Filter可以对所有方法进行统一拦载处理,如权限日志等。

    [Controller]
[NotFoundFilter]
public class ControllerTest
{
// /hello?name=
[SkipFilter(typeof(NotFoundFilter))]
[CustomFilter]
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
// /add?a=&b=
public string Add(int a, int b)
{
return string.Format("{0}+{1}={2}", a, b, a + b);
}
}
public class GlobalFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " globalFilter execting...");
context.Execute();
Console.WriteLine(DateTime.Now + " globalFilter executed");
}
} public class NotFoundFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " NotFoundFilter execting...");
context.Response.NotFound();
Console.WriteLine(DateTime.Now + " NotFoundFilter executed");
}
} public class CustomFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " CustomFilter execting...");
context.Execute();
Console.WriteLine(DateTime.Now + " CustomFilter executed");
}
}
启动服务
        static void Main(string[] args)
{
mApiServer = new BeetleX.FastHttpApi.HttpApiServer();
mApiServer.Register(typeof(Program).Assembly);
mApiServer.ServerConfig.BodySerializer = new BeetleX.FastHttpApi.JsonBodySerializer();
mApiServer.Open();
Console.Read();
}

制定HTTP Body转换器

转换器是组件最常用的自定义功能,通过它可以实现不同种类的数据格式,如json,protobuf和msgpack等。以下是一个json转换器的实现

 public class JsonBodySerializer : IBodySerializer
{
public JsonBodySerializer()
{
ContentType = "application/json";
}
public string ContentType { get; set; }
public object GetInnerError(Exception e, HttpResponse response, bool outputStackTrace)
{
return new ErrorResult { url = response.Request.Url, code = , error = e.Message, stackTrace = outputStackTrace? e.StackTrace:null };
}
public object GetNotSupport(HttpResponse response)
{
return new ErrorResult { url = response.Request.Url, code = , error = response.Request.Method + " method type not support" };
}
public object GetNotFoundData(HttpResponse response)
{
return new ErrorResult { url = response.Request.Url, code = };
}
public class ErrorResult
{
public string url { get; set; }
public int code { get; set; }
public string error { get; set; }
public string stackTrace { get; set; }
}
public virtual int Serialize(PipeStream stream, object data)
{
int length = stream.CacheLength;
string value = Newtonsoft.Json.JsonConvert.SerializeObject(data);
stream.Write(value);
return stream.CacheLength - length;
}
public virtual bool TryDeserialize(PipeStream stream, int length, Type type, out object data)
{
data = null;
if (stream.Length >= length)
{
string value = stream.ReadString(length);
if (type != null)
{
data = Newtonsoft.Json.JsonConvert.DeserializeObject(value,type);
}
else
{
data = Newtonsoft.Json.JsonConvert.DeserializeObject(value);
}
return true;
}
return false;
}
}

性能对比测试

由于dotnet core下面没有其他简化的http api组件,只能拿Kestrel asp.net core来作对比,虽然对asp.net core不公平,但这样的对比测也只是为了体现简化后的性能回报;测试服务器是阿里云的4核虚拟机,8G内存,测试工具是AB,测试功能主要是针对GET/POST的json数据处理。由于Kestrel asp.net core默认不支持AB的Keep-Alive选项,所以测试结果就并没有针对asp.net core的Keep-Alive测试

Kestrel asp.net core代码
        // GET api/values/5
[HttpGet("{id}")]
public ActionResult Get(int id)
{
return new JsonResult(Employee.List(id));
}
// POST api/values
[HttpPost]
public ActionResult Post([FromBody] Employee value)
{
return new JsonResult(value);
}
FastHttpApi 代码
        // /listemployee?count
public IList<Employee> ListEmployee(int count)
{
return Employee.List(count);
}
// post /AddEmployee
public Employee AddEmployee([BodyParameter]Employee item)
{
return item;
}
Kestrel asp.net core GET测试结果

FastHttpApi GET测试结果

FastHttpApi GET测试结果开启Keep-Alive

Kestrel asp.net core POST测试结果

FastHttpApi POST测试结果

FastHttpApi POST测试结果开启Keep-Alive

针对Kestrel的对比测试

对比一下两者在accept connection上的性能差异,开启了两个AB实例同时进行压测,结果是FastHttpApi在处理并发数快高于Kestrel快一倍的情况,CPU使用率只有Kestrel的一半。

Kestrel代码
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(context =>
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString());
return context.Response.Body.WriteAsync(data, , data.Length);
});
}
FastHttpApi代码
        //  /hello?name=
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
Kestrel测试结果

FastHttpApi测试结果

dotnet core高吞吐Http api服务组件FastHttpApi的更多相关文章

  1. .net core 高吞吐远程方法调用组件XRPC

    XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件.它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能:XRPC采用了HTTP2复用的思想,在协 ...

  2. dotnet core各rpc组件的性能测试

    一般rpc通讯组件都具有高性特性,因为大部分rpc都是基于二进制和连接复用的特点,相对于HTTP(2.0以下的版本)来说有着很大的性能优势,非常适合服务间通讯交互.本文针对了dotnet core平台 ...

  3. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  4. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  5. 每天响应数亿次请求,腾讯云如何提供高可用API服务?

    每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...

  6. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  7. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

    作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...

  8. devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务

    使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...

  9. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

随机推荐

  1. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

  2. setParameter不支持传统的按位置查询方式

    setParameter不支持传统的按位置查询方式 String hql = "from Customer as c where c.cust_id = ?"; List<C ...

  3. JAVA基础复习与总结<六> 数组_容器_泛型

    数组的常用方法 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: 给数组赋值:通过 fill 方法. 对数组排序:通过 sort 方法,按升序. 比较 ...

  4. 网络克隆 主要是 PXE网卡启动 随笔

  5. 如何让Qt程序在运行时获取UAC权限

    在pro文件中加入以下语句: QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\' ...

  6. springmvc ajax tomcat简单配置实现跨域访问

    发现一种改动最小也能实现跨域请求的方法 服务端 服务端修改web.xml配置文件, 增加过滤器 (不用导入任何jar包, 用的tomcat自带jar) <!-- 支持跨域请求 --> &l ...

  7. CTF最简单的Web题

    http://www.shiyanbar.com/ctf/1810 天网管理系统天网你敢来挑战嘛格式:ctf{ }解题链接: http://ctf5.shiyanbar.com/10/web1 查看源 ...

  8. Go smtp发送邮件,带附件

    package main import ( "net/smtp" "bytes" "time" "io/ioutil" ...

  9. kettle web化

    kettle web化 通过Java API调用kettle核心代码,并基于Spring Boot提供简易的Web管理界面. 背景 在工作中,通过kettle这款ETL产品进行数据处理时,是通过kit ...

  10. 机器学习(七)EM算法、GMM

    一.GMM算法 EM算法实在是难以介绍清楚,因此我们用EM算法的一个特例GMM算法作为引入. 1.GMM算法问题描述 GMM模型称为混合高斯分布,顾名思义,它是由几组分别符合不同参数的高斯分布的数据混 ...